MCP2518FD发送时有时候多发数据包问题
1、前提
使用MCP2518FD的官方下载资料,具体地址忘记了,需要的可以私信我一个邮箱地址。包内容如下:
我使用的平台是Hi3516D,这是项目需要,对这个canfd的功能没关系的,单片机或者其他linux的系统都一样,主要是把spi的读写函数在自己的平台上实现即可。
2、问题
我们设备是用canfd周期性的发送一些信息接收端,但是有时候接收端会受到异常包,或者一次连收两个包,我自己模拟发数到usb转cnafd的设备,电脑接收,错误的状态如下图:
我的测试发送的规则,帧之间首字节加1,帧内为首字节的累加数。有图可以看到,第一个红框内显示正常接收到18 19....这个帧,上帧是17 18 ...,是对的紧接着收到11 12...,而且时间和18 19的时间很近都是17:46:03.902(精确到1ms),这个11 12...帧尾前面9帧的数。再看第二个红框的错误方式也是如此。
3、分析
为什么重复的是前面9帧,因为我配置的发送fifo个数为8个。我尝试fifo个数改为1个,则出现重发的帧就是上一帧,且时间也是很近的(1ms内)。我的的想法是缓冲的指针跳转问题,对比了网上的各种参考代码,并查看了技术手册,对每一个寄存器研究半天,就是没发现问题。
最后借助强大的deepseek,它给了我思路,其他的kimi、通义确实是不如deepseek。这里再说点题外话,deepseek对技术问题的专业性还是很高的,由于我没有用gpt,所以没法比较,我一般遇到一些查资料不能解决的问题,就要靠deepseek开给思路了。
deepseek给我的思路是:
然后看mcp2518fd的代码,发送函数MCP2518FD_TransmitMessageQueue调用了DRV_CANFDSPI_TransmitChannelLoad,DRV_CANFDSPI_TransmitChannelLoad调用了DRV_CANFDSPI_WriteByteArray和DRV_CANFDSPI_TransmitChannelUpdate。
其中DRV_CANFDSPI_WriteByteArray是把要发送的数据帧通过spi发给mcp,DRV_CANFDSPI_TransmitChannelUpdate是mcpfifo指针跳转和发送使能。
结合deepseek的指导,mcp2518fd内部在spi数据接收fifo转到canfd的发送ram时,是否存在运行时间呢?
所以我在DRV_CANFDSPI_WriteByteArray和DRV_CANFDSPI_TransmitChannelUpdate之间加了200us的延时等待(有可能有相关的寄存器可以来精准判断,我没有找,官方mcp的官方代码也没这个逻辑。。。)。
奇迹出现,果然多发包问题好了。
4、总结
在定位的过程中,也发现我一些其他的写的不规范的问题,但是无伤大雅。这就是我的MCP2518FD的填坑过程。