This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
DSP28335通过 SPI 访问 TCAN4551芯片、以便实现数据发送和接收功能。 SPI 的波特率为5MHZ。CANFD 的仲裁域被配置为500kHz、数据域被配置为2MHz。
5个数据包的数量通过 CANFD 总线与以下帧 ID 和周期向外发送:
0x11B (10ms 周期)、0x12A (20ms 周期)、0x6F7 (10ms 周期)、0x50D (1280ms 周期)、0x6F5 (1280ms 周期)
当总线上没有其他数据时不会丢失帧。 当总线上的加载率达到大约40%时、帧 ID 为0x6F5和0x50D 的数据会更严重地丢失帧。 具有其他帧 ID 的数据也偶尔会丢失帧。
TSMater 工具检查了这些数据、发现了帧丢失情况、如下所示:
CANFD 芯片的一些寄存器的配置或状态参数如下:
寄存器地址 |
峰值振幅 |
0x000C |
0x00000008 |
0x8000 |
0xC80004A0 |
0x0820 |
0x00000000 |
0x0824 |
0x000901D5 |
0x1018 |
0x00000300 |
0x1040 |
0x00000000 |
0x1044 |
0x000A300F |
0x1050 |
0x000901D5 |
0x10C4 |
0x00000000 |
0x10CC |
0x00000001 |
0x10D8 |
0x00000001 |
0x1084 |
0x000C0000 |
0x1088 |
0x00000000 |
0x10A0 |
0x80020030 |
0x10B0 |
0x000200C0 |
0x10C0 |
0x600004F8 |
0x10C8 |
0x00000007 |
0x10F0 |
0x00000000 |
请帮助我查看这些寄存器的配置以及读回的状态消息是否有问题。
如果方便跟进、您能通过电子邮件与我沟通吗?
确保安全。
您好、Wang:
MCAN 中断寄存器0x1050的 RX FIFO 1 FULL 位和 RX FIFO 0 FULL 位(位6和2)。 这意味着器件无法接收新消息、并将覆盖或拒绝新消息、直到 RX FIFO 中有空的缓冲区元素可用。
您似乎是在尝试接收 CAN 消息的速度快于您的处理器通过 SPI 总线读取和确认这些消息的速度。 您需要确定处理器通过 SPI 总线完全处理从通知接收到新消息到 RX FIFO 确认寄存器(0x10A8和0x10B8)中的最终确认的中断所需的时间。
如果突发接收到消息、增加 RX FIFO 深度可能会增加一些裕量、但平均而言、固定间隔接收 CAN 消息的速度无法超过 SPI 总线处理这些消息的速度。
此致、
Jonathan
感谢您对通信接收的指导。 传输过程中数据丢失的可能原因是什么?
您好、Wang:
我已经了解了如何配置 MRAM、以及为不同类型(SID/XID 滤波器、RX FIFO 和缓冲器、TX 缓冲器和 TX 事件 FIFO 等)配置了多少个元素、并且我认为您的分配超出了器件中的可用存储器。 某些寄存器值从列表中缺失、因此我不能确定、因此您应该检查配置以确保使用的总字节少于2048。
看起来您正在尝试启用一个包含32个元素的 TX 队列、每个元素都具有最大64字节的数据字段、这是 MRAM 中的最后一组元素。 当存储器地址超过最大值字段时、器件会自动回绕到 MRAM 地址字段的开头。
在未直接实现重叠的情况下、也可能会发生存储器段重叠。 对 MRAM 地址空间的读取或写入环绕在 MRAM 的最后一个地址之后的 MRAM 的开始位置。 例如、在 TCAN45xx 上有2KB 的 MRAM、占用地址0x8000到0x87FF。 如果用户尝试读取或写入寄存器0x8800、这与读取或写入0x8000相同。 因此、确保 MRAM 存储器不被过度分配至关重要。
如果存储器重叠、则会覆盖第一个元素(SID 滤波器、RX 缓冲区等)、这可能导致 RX 和 TX 错误、因此请验证您的 MRAM 分配。
否则、对于消息传输、器件将遵循 CAN 仲裁协议并尝试随时发送消息、直到成功。 当总线上有大量消息时、具有较低优先级 ID 的消息可能需要更长的传输时间、因为它们将失去对具有较高优先级 ID 的其他节点的仲裁。
可以监视 TX 缓冲区添加请求传输发生寄存器(0x10D8)以检查 TX 缓冲区中的报文何时发送。 TX 事件 FIFO 也可用于为消息传输创建事件日志、但这需要额外的 MRAM 空间。
我还注意到您使用的是 TX 队列模式、这将导致器件检查队列中的所有消息 ID、以确定哪个消息的优先级最高。 这还会导致总线负载较高时、优先级较低的消息会延迟、这可能看起来"丢失"、而实际上它们仍在队列中等待发送。
有关 RX 和 TX 处理的更多详细信息、请参阅 M_CAN 用户手册 (链接)。
此致、
Jonathan