ARM学习(24)Can的高阶认识和错误处理

这篇具有很好参考价值的文章主要介绍了ARM学习(24)Can的高阶认识和错误处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

笔者来聊一下CAN协议帧的认识和错误处理。

1、CAN协议帧认识

CAN 差分信号,是经过CAN收发器转成差分信号的,CAN RX和TX是逻辑电平。CAN的基础知识,可参考笔者这边文章:ARM学习(21)STM32 外设Can的认识与驱动编写。

  • CAN总线拓扑结构。
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • CAN总线上面要接120欧姆的电阻,形成闭环。
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • CAN的总线电平:

    • 显性0,CAN-H 3.5V,CAN-L 1.5V
    • 隐形1,CAN-H 2.5V,CAN-L 2.5V,
      ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

CAN的协议帧主要有:

  • 帧开始:SOF,数据帧开始,只有一个bit位,
  • 仲裁段:帧ID,根据ID进行仲裁
  • 控制段:数据长度等
  • 数据段:数据域,8字节(64bit),不够会填满发送,所以需要长度指定。
  • CRC段:对前面的字段进行CRC校验
  • ACK段:发送完成后,有节点接收会被拉低,1个bit位
  • 帧结束:EOF,帧结束,7个bit位,都是隐形位
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    逻辑分析仪抓到的CAN协议帧:

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
下面是:帧起始,ID,控制段
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
中间是:数据段和CRC段
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
最后是:ACK段和帧结束,关于ACK段,用来确认是否接收正常
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • ACK槽内,发送单元,首先发送隐形电平为1,类似于拉高电平,
  • 然后接收单元在ACK槽时间内发送显性,类似于拉低电平,证明数据有接收单元收到,
  • 如果没有接收单元收到,则电平一直为隐形,
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

2、CAN异常处理

2.1 CAN异常介绍

CAN异常处理,首先得知道CAN有哪些异常,LEC 可以指示错误信息:

  • 位填充错误
  • 格式错误
  • 确认错误,没有ACK
  • 隐形错误
  • 显性错误
  • CRC错误。
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    STM32 手册上面CAN得错误寄存器编码如下所示:
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    例如下图:可以看到,标红色的都代表错误,首先CRC错误,然后ACK错误,正常应该是0,EOF尾帧错误,正常应该全1,
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

如果CAN总线异常,那么可以增加相关寄存器打印,可以知道CAN的错误。

printf("CAN_TX_TIMEOUT, ESR=0x%x, TSR=0x%x, IER=0x%x\r\n",CAN2->ESR,CAN2->TSR,CAN2->IER);

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

当然也可以通过中断触发,但是中断触发有个问题,如果总线一直异常,那么会一直触发,导致持续进中断,程序无法正常运行。

关于CAN异常中断的配置,首先需要知道异常会触发哪个中断,然后需要使能相应的中断源,以及中断函数。

CAN共计四个中断,前三个中断很容易理解,就是下图的三个中断

  • CAN_TX_IRQn:发送中断
  • CAN_RX0_IRQn:FIFO0的接收中断
  • CAN_RX1_IRQn:FIFO1的接收中断
  • CAN_SCE_IRQn:不知道什么中断
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    然后下面还要一张图,显示了CAN异常触发的中断,ESR:Error State Register,异常状态寄存器,每一位都有使能位控制,左边是中断源,中间是中断控制,右边是中断处理函数,状态改变错误中断,即State Change Error Handler,SCE_Handler,所以通过这张图我们就确定了异常处理的中断函数。

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • 使能中断源
......
CAN_ITConfig(CAN2, CAN_IT_ERR);
CAN_ITConfig(CAN2, CAN_IT_EWG);
CAN_ITConfig(CAN2, CAN_IT_EPV);
CAN_ITConfig(CAN2, CAN_IT_BOF);
CAN_ITConfig(CAN2, CAN_IT_LEC);
  • 使能NVIC 中断函数
NVIC_InitStructure.NVIC_IRQChannel = CAN2_SCE_IRQn;
NVIC_InitStructure.IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
  • 中断函数处理
void CAN2_SCE_IRQHandler(void)
{
	printf("CAN ESR=0x%x\r\n",CAN2->ESR);
	CAN_ClearITPendingBit(CAN2, CAN_IT_ERR);
	CAN_ClearITPendingBit(CAN2, CAN_IT_EWG);
	CAN_ClearITPendingBit(CAN2, CAN_IT_EPV);
	CAN_ClearITPendingBit(CAN2, CAN_IT_BOF);
	CAN_ClearITPendingBit(CAN2, CAN_IT_LEC);
}

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

2.2 CAN 异常造错

  • 实验一:CAN总线只有一个节点
    按理说只有一个节点的时候,肯定会报ACK错误,因为没有节点回,将ACK信号拉低,但是测试结果发现,同时还伴有帧格式错误,还有少量的CRC错误,查阅资料发现,可能确实会存在帧格式错误,
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    要看这个问题,需要知道CAN错误帧这种机制。当发送单元发现没有节点接收数据时,就会把错误帧发送到总线上面。

错误帧的格式如下图所示,

  • 主动错误,6个显示标志位,就是低电平
  • 被动错误,6个隐形标志位,就是高电平,
  • 主动错误时,累计错误少的时候,小于128,错误多了就成了被动错误,大于127
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
  • 观察下图,可以看到其时6个显性电平,为主动错误,因为是只发送了一帧,
  • 观察下面的log,也看到了TEC = 8,10,18,20,…一直到了80,
  • 标志位也从警告错误标志变成了被动错误标志,
  • ACK的检测是由发送单元检测,如下图所示,所以错误帧也是发送单元发送的。
  • 如果发送错误帧,则会影响原来的帧格式,导致最后的EOF,不是7个隐形电平,导致CAN帧格式错误。
  • 被动错误之后,EOF正常,没有帧格式错误,两种情况,没有上报错误帧,或者上报的错误帧是隐形电平。

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

14-03-30-280:CAN_FLAG_LEC
14-03-30-281:ERR_CAN_TX_TIMEOUT, ESR=0x80030 TSR=0x1c000009 IER=0x2

14-03-32-225:CAN_FLAG_LEC
14-03-32-225:ERR_CAN_TX_TIMEOUT, ESR=0x100030 TSR=0x1c000009 IER=0x2

14-03-32-942:CAN_FLAG_LEC
14-03-32-943:ERR_CAN_TX_TIMEOUT, ESR=0x180030 TSR=0x1c000009 IER=0x2

14-03-33-512:CAN_FLAG_LEC
14-03-33-512:ERR_CAN_TX_TIMEOUT, ESR=0x200030 TSR=0x1c000009 IER=0x2

14-03-33-944:CAN_FLAG_LEC
14-03-33-944:ERR_CAN_TX_TIMEOUT, ESR=0x280030 TSR=0x1c000009 IER=0x2

14-03-34-379:CAN_FLAG_LEC
14-03-34-379:ERR_CAN_TX_TIMEOUT, ESR=0x300030 TSR=0x1c000009 IER=0x2

14-03-34-844:CAN_FLAG_LEC
14-03-34-844:ERR_CAN_TX_TIMEOUT, ESR=0x380030 TSR=0x1c000009 IER=0x2

14-03-35-306:CAN_FLAG_LEC
14-03-35-306:ERR_CAN_TX_TIMEOUT, ESR=0x400030 TSR=0x1c000009 IER=0x2

14-03-35-756:CAN_FLAG_LEC
14-03-35-756:ERR_CAN_TX_TIMEOUT, ESR=0x480030 TSR=0x1c000009 IER=0x2

14-03-36-190:CAN_FLAG_LEC
14-03-36-190:ERR_CAN_TX_TIMEOUT, ESR=0x500030 TSR=0x1c000009 IER=0x2

14-03-36-653:CAN_FLAG_LEC
14-03-36-653:ERR_CAN_TX_TIMEOUT, ESR=0x580030 TSR=0x1c000009 IER=0x2

14-03-37-038:CAN_FLAG_EWG
14-03-37-038:CAN_FLAG_LEC
14-03-37-038:ERR_CAN_TX_TIMEOUT, ESR=0x600031 TSR=0x1c000009 IER=0x2

14-03-37-488:CAN_FLAG_EWG
14-03-37-488:CAN_FLAG_LEC
14-03-37-489:ERR_CAN_TX_TIMEOUT, ESR=0x680031 TSR=0x1c000009 IER=0x2

14-03-37-921:CAN_FLAG_EWG
14-03-37-921:CAN_FLAG_LEC
14-03-37-922:ERR_CAN_TX_TIMEOUT, ESR=0x700031 TSR=0x1c000009 IER=0x2

14-03-38-402:CAN_FLAG_EWG
14-03-38-402:CAN_FLAG_LEC
14-03-38-402:ERR_CAN_TX_TIMEOUT, ESR=0x780031 TSR=0x1c000009 IER=0x2

14-03-38-864:CAN_FLAG_EWG
14-03-38-864:CAN_FLAG_EPV
14-03-38-864:CAN_FLAG_LEC
14-03-38-883:ERR_CAN_TX_TIMEOUT, ESR=0x800033 TSR=0x1c000009 IER=0x2

14-03-39-350:CAN_FLAG_EWG
14-03-39-350:CAN_FLAG_EPV
14-03-39-350:CAN_FLAG_LEC
14-03-39-364:ERR_CAN_TX_TIMEOUT, ESR=0x800033 TSR=0x1c000009 IER=0x2

14-03-39-868:CAN_FLAG_EWG
14-03-39-868:CAN_FLAG_EPV
14-03-39-868:CAN_FLAG_LEC
14-03-39-886:ERR_CAN_TX_TIMEOUT, ESR=0x800033 TSR=0x1c000009 IER=0x2

ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • 实验二:CAN 总线上面发送了一个不存在节点的报文

    • 一切正常,
    • 查阅资料发现,自由有节点接收,那么报文就正确发送,接收段由于过滤规则过滤掉是接收端的问题,那么ACK就会正确回,所以报文正常。
      ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议
  • 实验三:CAN H接地
    发送失败,CAN离线(BOF: bus offline),没有波形,总线错误,显性错误
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议

  • 实验四:CAN L接地
    正常发送,需要继续研究

  • 实验五:CAN H与L短接
    发送失败,CAN离线(BOF: bus offline),没有波形
    ARM学习(24)Can的高阶认识和错误处理,ARM,嵌入式,CAN,CAN帧,标准帧,扩展帧,CAN异常分析,CAN协议文章来源地址https://www.toymoban.com/news/detail-768604.html

到了这里,关于ARM学习(24)Can的高阶认识和错误处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

    上一课: 【小黑嵌入式系统第一课】嵌入式系统的概述(一)——概念、特点、发展、应用 下一课: 【小黑嵌入式系统第三课】嵌入式系统硬件平台(一)——概述、总线、存储设备(RAMROMFLASH) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享

    2024年02月08日
    浏览(35)
  • 嵌入式学习---ARM时钟体系

    按 一定电压幅度 , 一定时间间隔 连续发出的脉冲信号。它是一个周期性的信号,每个周期内包含一个上升沿和一个下降沿。时钟脉冲的上升沿和下降沿通常用于触发和同步各个电子元件的操作,例如CPU的指令执行、数据传输、寄存器更新等。 时钟频率是指时钟脉冲的频率

    2024年01月16日
    浏览(46)
  • ARM学习(21)STM32 外设Can的认识与驱动编写

    笔者来聊聊can的认识以及can接收数据的驱动编写 Can的特性就不多说了,主要来聊聊can的一些标识符以及收发状态。can有一套收发机制,发送和接收都有硬件缓存,叫邮箱,通过下面的图可以看出,下面这张图很经典,被各大网站和博客上面引用。 发送时,有三个报文邮箱缓

    2024年02月03日
    浏览(36)
  • 嵌入式学习52-ARM1

    知识零散: 1.flash:                                                                                                                                                           nor flash    可被寻地址                                               

    2024年04月14日
    浏览(27)
  • ARM+LINUX嵌入式学习路线

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,

    2024年02月02日
    浏览(51)
  • 嵌入式学习---ARM中断控制系统

    硬件中断处理是实时系统设计的最重要、最关键的问题。 程序不断地查询各设备的状态,并做出相应的反应。该方式实现比较简单,常用在比较单一的系统中,比如一个温控系统中可以使用查询方式不断检测温度的变化。 特点:实现简单;但 CPU利用率很低 ,不适合多任务的

    2024年02月03日
    浏览(59)
  • 华清远见嵌入式学习——ARM——作业3

    led.h led.c uart.h uart.c main.c

    2024年01月21日
    浏览(42)
  • 华清远见嵌入式学习——ARM——作业2

    目录 作业要求: 现象: 代码: 思维导图: 模拟面试题: GPIO实验——3颗LED灯的流水灯实现

    2024年02月03日
    浏览(31)
  • STM32&ARM体系结构(嵌入式学习)

    STM32是意法半导体(STMicroelectronics)公司推出的一系列32位ARM Cortex-M微控制器(MCU)产品系列。它们基于ARM架构,并且具有广泛的应用领域,包括工业自动化、消费电子、医疗设备、通信、汽车电子等。 STM32系列提供了多个产品系列,以满足不同应用需求和性能要求。其中常见

    2024年02月08日
    浏览(40)
  • 【ARM 嵌入式 编译系列 2.1 -- GCC 预处理命令 #error 和 #warning 详细介绍 】

    在C语言中, #error 和 #warning 预处理指令可以用于在编译时生成错误或警告信息,通常用于调试或当代码中某些条件未满足时提醒开发者。当这些指令被编译器处理时,会自动包含出现这些指令的文件名和行号,所以你可以清楚地看到问题出现的位置。 #error 当编译器遇到 #e

    2024年01月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包