当前位置: 首页 > news >正文

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的填坑过程。

http://www.lryc.cn/news/575235.html

相关文章:

  • 【预告 大模型应用开发实战专栏 升级】将增加《大模型 Agent 应用实战指南》专题赋能 Agent 开发者
  • OpenGL模板缓冲:实现亮显外轮廓效果
  • C# LINQ语法
  • Python 爬虫入门:从数据爬取到转存 MySQL 数据库
  • Cookie 在 HTTP 中的作用HTTP 中的状态码
  • 北斗导航 | 基于改进奇偶矢量法的CAT I精密进近RAIM算法
  • 半导体芯闻--20250625
  • Linux离线安装jdk-11
  • AudioTrack使用
  • Kylin Linux Advanced Server V10 离线安装 Prometheus + Grafana + node_exporter指南
  • 【网站内容安全检测】之1:获取网站所有链接sitemap数据
  • Sortablejs动态同类型穿插
  • MySQL之视图深度解析
  • 灰度发布怎么保证数据库一致的
  • Windows10中设置多个虚拟IP方法
  • Swagger 在 Spring Boot 中的详细使用指南
  • PDF处理控件Spire.PDF系列教程:Python中快速提取PDF文本、表格、图像及文档信息
  • Python 数据分析与可视化 Day 7 - 可视化整合报告实战
  • 视频中的开放世界目标计数
  • gitbash中执行命令巨慢
  • 淘宝API安全合规指南:避免数据泄露与封禁
  • AI助教来袭:用n8n和Gemini搭建英语作文自动批阅与学情分析系统
  • 【网站内容安全检测】之2:从网站所有URL页面中提取所有外部及内部域名信息
  • request这个包中,get 这个方法里传入的是params ,post这个方法里传入的是data 和 json。这个区别是什么?
  • 每日AI资讯速递 | 2025-06-25
  • 深入理解 Spring 框架的 Bean 管理与 IOC​
  • 车牌识别与标注:基于百度OCR与OpenCV的实现(一)
  • (C++)vector数组相关基础用法(C++教程)(STL库基础教程)
  • MiniMax-M1混合MoE大语言模型(本地运行和私有化搭建)
  • 数据结构 顺序表与链表