憨憨笔尖 2024-04-18 20:29 采纳率: 40%
浏览 411

MCP2518FD接收问题

共两个CAN FD通道,使用MCP2518FD作为CAN FD控制器,我每个CAN FD控制器的发送FIFO配置了5个报文,接收FIFO配置了15个报文,当两个通道对测,同时收发100帧时(注意,是同时收发),偶发出现多出30帧的现象,刚好是上次发送100帧的后15帧接收了两次,用的中断接收方式,用示波器测了下,当出现这种多帧问题时,会有一个持续1s左右的中断信号,有遇到这种问题吗,求帮助

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 20:29
    关注

    引自免费微信小程序:皆我百晓生

    在处理这个问题时,我们需要检查几个关键点以确定可能的原因并提出相应的解决方案。

    首先,确保您的硬件连接正确无误,包括电源、接地、时钟以及CAN H/L线之间的匹配电阻。其次,检查您的FPGA设计是否正确地配置了MCP2518FD的寄存器,并且在中断触发条件上没有错误。

    下面是关于MCP2518FD配置的一些建议和可能的解决步骤:

    1. 检查中断源:确认您只在接收完成(RX FIFO满)时才触发中断。这可以通过配置INTENCLR寄存器来实现。确保其他中断源如错误中断没有被无意间打开。

      reg [7:0] intenclr;
      // 清除所有中断使能位,仅保留接收完成中断
      intenclr = 8'b0000_0001;
      assign INTEN_CLR = intenclr;
      
    2. 确保正确的接收缓冲区管理:在中断服务例程(ISR)中,每次收到消息后,应从RX FIFO读取数据并将其移除。这样可以防止新的接收数据覆盖旧的数据,导致重复接收。使用RXBnCTRL寄存器中的RXMPPT位来跟踪接收缓冲区的状态。

      always @(posedge clk) begin
        if (rx_fifo_interrupt) begin
          // 读取并处理第一个缓冲区中的消息
          rx_buffer[0] <= RXB0DATA;
          RXB0CTRL.RXBMPPT <= ~RXB0CTRL.RXBMPPT; // 更新缓冲区状态
          // 如果还有更多的缓冲区未处理,继续读取
          if (RXB0CTRL.RXBMPPT == 0 && RXB1CTRL.RXBMPPT == 0) begin
            // ... 处理RXB1DATA, RXB2DATA...直到所有的缓冲区都被处理
          end
        end
      end
      
    3. 调整中断延迟:检查FPGA的中断延迟设置,确保它足够快,不会错过中断信号。在某些情况下,过长的中断延迟可能会导致多个中断事件合并为一个。

    4. 查看时序:使用示波器检查中断信号的时序,确保它们在预期的时间范围内,并且与实际发生的接收活动同步。如果有任何不一致,可能需要调整中断触发逻辑。

    5. 检查CAN总线通信:确保在发送和接收过程中,总线上的数据传输没有问题。使用CAN分析仪进行测试,观察是否有任何错误帧或者数据冲突。

    6. 优化中断处理:尽可能减少中断服务例程中的延时操作,例如等待锁存器的稳定时间,以保证快速响应和处理新的中断请求。

    7. 测试负载均衡:尝试调整发送和接收的负载平衡,看看是否会影响问题的发生。例如,如果一个通道的发送速率远高于另一个,可能会导致接收端的问题。

    如果以上步骤都无法解决问题,建议进一步查看MCP2518FD的官方数据手册,确认是否有关于特定应用场景的限制或已知问题。同时,考虑联系Microchip技术支持获取更专业的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日