linux下FDCan总线异常

FDCAN在使用过程中遇到突然Down掉的情况(20分钟内),重新Close再Open无法解决

FDCAN不是采用USB转CAN总线工具,使用机器原生CAN口(SPI TO CAN,虚拟为网络接口设备)使用dmesg查看出错时的数据信息与数据DMA传送有

使用示波器观察异常状态下的总线发送,确认linux主机在出现问题是未向总线发送任何数据,确认为linux发送端问题

咨询供应商,供应商认为可能由于发送数据过于频繁导致驱动内部Buffer爆掉,工程师根据此反馈做了如下修改

  1. 降低linux软件调用发送接收频率
  2. 在运动间断点关闭can,再打开(清除底层buffer)
  3. 找can清除驱动层buffer的函数接口(未找到)
  4. 每次读can总线时多次读,时直到读空防止读buffer爆掉

以上措施均无效,直接介入处理

  1. 给出备选方案,采用USB TO CAN方案,让供应商对驱动进行编译
  2. 检查工程师CAN设备的写法
  • 学习C++下CAN设备的调用方法,基本与网络相同,收发为write与read
  • 检查到工程师在两个线程使用的read函数,怀疑此处可能有问题

工程师修改CAN总线读取的写法,仅在一个位置读取CAN总线数据,读到数据后更新内部buffer,其它需要使用数据的位置均使用内部buffer

测试1小时均不再复现,确认为该问题导致

该问题出现可能的原因

  1. FDCAN总线数据转换为SPI存储在驱动内部的buffer
  2. 调用read时由驱动内部buffer通过DMA传输至用户层buffer或者在驱动内部有DMA数据传输
  3. 两个线程同时调用时DMA在运行过程中做了再次启动,导致DMA Down掉
  4. 进一步导致FDCAN Down掉,dmseg报错