2024年CAN总线错误分析与解决_can总线的错误帧,应用层要处理吗 ,2024大厂面试合集

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  1. CAN节点数据收发过程

了解CAN节点在总线上数据上的收发过程很重要,之前的一篇文章讲解了一些CAN总线的错误处理机制,但是那些都是理论上的东西,如果不深入了解CAN总线上的数据收发过程,理解那些理论的东西难免有些晦涩。

我们知道CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据,并与自己发送的数据作对比。

CAN信息发送成功后,在这个间隙内,接收节点可以准备要回复的信息,也就是把应答场填充为显性0,在发送时其为隐性1应答过程可能如下:当信息传输到ACK前的Del时,可以认为信息已经传输完毕,接收节点也接收到了足够的信息来检测接收的信息是否正确,所以这时接收节点就会检测信号是否正确,如果正确,就将ACK置位为显性0,注意这时,发送节点因为还在发送而接收节点又将ACK信息置位为1,所以它就会在回读时检测到ACK为0,判断接收成功。注意:这其中有个接收节点用显性覆盖隐性—覆盖ACK位的过程,覆盖+回读。

ACK前后各加一个Del,就是为了考虑到时间误差,让接收节点有足够的时间对ACK确认。这个过程说明,CAN发送是个双向互动的过程,发送节点一边发送,一边对节点进行回收确认数据正确,而接收节点也时刻接收,并在正确的时间将ACK设置为1。

  1. CAN总线错误

CAN总线错误分别有发送和接收错误计数,计数达到一定的累计以后就会产生CAN BUS OFF, 这说明CAN总线上出现了严重的错误。如下图CAN总线产生错误后的状态转换机制:

如果出现了BUS OFF,总线上的节点需要做一些动作,例如重启CAN控制器或是重新上电,但是这些都只是一些补救措施,最根本的还是需要找到引起BUS OFF的根源。

CAN总线分析的一些工具和文档:

  • CAN分析仪或者逻辑分析仪
  • 数字示波器
  • 相关的软件debug工具
  • CAN控制器芯片数据手册,这很重要
  • 硬件电路图
  • CAN协议文档
  • 相关版本的Linux内核源码

  1. CAN节点发送错误不成功

    1. 问题描述与分析

挂载在CAN总线上的一个节点向总线上发送数据不成功,用逻辑分析仪也看不到任何波形。PS: 这应该是我碰到的最坑爹的事情了。下面具体来看看怎么不成功。于是调试中断查看CAN_STATUS即CAN状态寄存器显示0xE5, 查看CPU数据手册:

CAN总线状态直接进入了BUS OFF状态,这意味着错误计数已经超限,查看CPU收发寄存器的收发错误计数显示发送错误计数TEC达到248, 接收错误计数为0;这很明显,数据压根没有发送到总线上。

再进一步查看寄存器值LEC即LAST ERROR CODE 最后一个错误代码, 显示是BIT0 ERROR:

查看上面的错误代码表可知,BIT0错误也就是在发送数据期间,虽然CAN节点设备想要发送一个显性位,也就是逻辑0,但是CAN总线同时监听到总线上的数据位为隐性位,即逻辑1。这意味着CAN core往总线上发送的数据第一位就已经出错了,压根没有将数据经过CAN收发器传送到CAN总线上。

一直在使用CAN总线的我厂和我从来没遇到这等奇事,但是由于是新的CPU的开发所以在怀疑硬件的问题的同时也在排查软件问题,但是经过一阵排查,没有发现软件上的问题。回头再分析硬件,又经过一阵排查溯源,发现CPU的CAN收发线与CAN收发气的收发线接反,直接崩溃(PS: 硬件的大哥你能不能不要坑小弟):

  1. 总结

CAN节点发送数据不成功,首先分析是不是CAN控制器本身的问题,查看CPU中的CAN core的状态寄存器,分析是否有BUS OFF, 如果存在BUS OFF, 则进一步查看具体的错误信息,是主动的错误还是被动的错,发送错误计数有没有超限,最后一次发生的错误状态是什么,查看是位填充错误还是格式错误等其他错误,然后具体问题具体分析。这种错误一般是有硬件发送线路出现问题引起,例如光隔次边不导通,发送接口接触不良等,再则是一些奇葩的错误,例如本例,收发线直接接反了,坑爹啊!

  1. CAN Socket 的CAN节点检测到错误帧

    1. 问题描述

我们看到以下的CAN Socket日志,在38秒内的三个错误帧,但是并没有引起总线的BUS OFF,这说明总线上检测到了错误,有可能受到了干扰,也有可能是数据发送太密集导致的总线过载,但是在这38秒内出现错误,但是期间又恢复正常。

CAN ID : 0x20000004 = 10 0000 0000 0000 0000 0000 0000 0100, 即仲裁域的值。

  1. Linux内核源码分析

因为出现此错误的是我厂的CAN控制器CPU TI 公司的AM3352, 内核版本为**Linux 3.2.0**

所以我们通过内核来看内核CAN错误can_id的定义:

[cpp]
view plain
copy
print
?

  1. /* error class (mask) in can_id */
  2. #define CAN_ERR_TX_TIMEOUT 0x00000001U /* TX timeout (by netdevice driver) */
  3. #define CAN_ERR_LOSTARB 0x00000002U /* lost arbitration / data[0] */
  4. #define CAN_ERR_CRTL 0x00000004U /* controller problems / data[1] */
  5. #define CAN_ERR_PROT 0x00000008U /* protocol violations / data[2…3] */
  6. #define CAN_ERR_TRX 0x00000010U /* transceiver status / data[4] */
  7. #define CAN_ERR_ACK 0x00000020U /* received no ACK on transmission */
  8. #define CAN_ERR_BUSOFF 0x00000040U /* bus off */
  9. #define CAN_ERR_BUSERROR 0x00000080U /* bus error (may flood!) */
  10. #define CAN_ERR_RESTARTED 0x00000100U /* controller restarted */
/* error class (mask) in can_id */

#define CAN_ERR_TX_TIMEOUT 0x00000001U /* TX timeout (by netdevice driver) */

#define CAN_ERR_LOSTARB 0x00000002U /* lost arbitration / data[0] */

#define CAN_ERR_CRTL 0x00000004U /* controller problems / data[1] */

#define CAN_ERR_PROT 0x00000008U /* protocol violations / data[2..3] */

#define CAN_ERR_TRX 0x00000010U /* transceiver status / data[4] */

#define CAN_ERR_ACK 0x00000020U /* received no ACK on transmission */

#define CAN_ERR_BUSOFF 0x00000040U /* bus off */

#define CAN_ERR_BUSERROR 0x00000080U /* bus error (may flood!) */

#define CAN_ERR_RESTARTED 0x00000100U /* controller restarted */

由错误帧CAN ID : 0x20000004 = 10 0000 0000 0000 0000 0000 0000 0100, 去除最高为的1(SOFZ帧起始位?),因为仲裁位是29位,所以应该是0 0000 0000 0000 0000 0000 0000 0100 =0x00000004,既不是CAN_ERR_BUSOFF也不是CAN_ERR_BUSERROR, 而是CAN_ERR_CTRL, 即CAN控制器的问题,而我们在看data[1]描述的CAN 控制器错误类型描述:

[cpp]
view plain
copy
print
?

  1. /* error status of CAN-controller / data[1] */
  2. #define CAN_ERR_CRTL_UNSPEC 0x00 /* unspecified */
  3. #define CAN_ERR_CRTL_RX_OVERFLOW 0x01 /* RX buffer overflow */
  4. #define CAN_ERR_CRTL_TX_OVERFLOW 0x02 /* TX buffer overflow */
  5. #define CAN_ERR_CRTL_RX_WARNING 0x04 /* reached warning level for RX errors */
  6. #define CAN_ERR_CRTL_TX_WARNING 0x08 /* reached warning level for TX errors */
  7. #define CAN_ERR_CRTL_RX_PASSIVE 0x10 /* reached error passive status RX */
  8. #define CAN_ERR_CRTL_TX_PASSIVE 0x20 /* reached error passive status TX */
/* error status of CAN-controller / data[1] */

#define CAN_ERR_CRTL_UNSPEC 0x00 /* unspecified */

#define CAN_ERR_CRTL_RX_OVERFLOW 0x01 /* RX buffer overflow */

#define CAN_ERR_CRTL_TX_OVERFLOW 0x02 /* TX buffer overflow */

#define CAN_ERR_CRTL_RX_WARNING 0x04 /* reached warning level for RX errors */

#define CAN_ERR_CRTL_TX_WARNING 0x08 /* reached warning level for TX errors */

#define CAN_ERR_CRTL_RX_PASSIVE 0x10 /* reached error passive status RX */

#define CAN_ERR_CRTL_TX_PASSIVE 0x20 /* reached error passive status TX */

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

图片转存中…(img-UlNUSnyA-1715624257472)]
[外链图片转存中…(img-iv75rfcf-1715624257472)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAN错误码0x00000010表示CAN控制器总线错误。这个错误码通常表示CAN总线上发生了一些问题,可能是由于总线上出现了干扰、断开连接或其他硬件故障导致的。这个错误码需要根据具体的硬件和软件环境进行进一步的分析解决。 要解决这个问题,可以尝试以下步骤: 1. 检查物理连接:检查CAN总线的物理连接,确保连接稳定可靠,并且没有松动、断开等问题。 2. 检查电源供应:确保CAN控制器和其他相关设备的电源供应正常,电压稳定。 3. 检查终端电阻:在CAN总线两端应该安装合适的终端电阻,确保电阻值正确,避免信号反射和干扰。 4. 检查总线负载:检查是否有其他设备过多地占用了CAN总线资源,导致总线负载过重。 5. 检查软件配置:检查CAN控制器的软件配置参数,确保参数设置正确,包括波特率、滤波器设置等。 6. 检查总线冲突:如果有多个设备同时使用CAN总线,可能会发生总线冲突。确保设备之间的通信时序正确,避免同时发送数据。 7. 检查设备驱动程序:如果使用了设备驱动程序,确保驱动程序正确安装,并且与硬件兼容。 如果以上步骤都没有解决问题,可能需要进一步调试和分析。可以使用CAN分析仪等工具来捕获和分析CAN总线上的数据,以找出问题所在。在调试过程中,还可以查阅CAN控制器的硬件文档和相关资料,以获取更多技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值