一文读懂CAN通讯协议(二)

简介: 一文读懂CAN通讯协议

+关注继续查看

3.1数据帧和遥控帧

数据帧和遥控帧都有标准格式和扩展格式,这2种格式都具有相同的帧结构。

数据帧由7个段构成,遥控帧由6个段构成。先看数据帧:

edd265496c687901eb64d45ec6a3bbca_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图13 数据帧结构及其两种格式(引自[4])

991917713e32ca2bb17b3e91dc69689c_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[6]

这里结合实际采集的CAN总线电压信号来看下标准格式的数据帧。

41e6b99028c37bddd839978b10976f11_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图14 标准(格式)数据帧的CAN总线电压(引自[5])

再看遥控帧(也叫远程帧):

19cdb504a0c3e4f0288c6b66f41a6402_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图15 遥控帧的两种格式(引自[4])

通过图13和15对比数据帧和遥控帧有:

8d140ac648dd6f1c46b21a42707879ba_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

通过对数据帧和遥控帧有了基本认识,下面我们再具体了解下每个段。

1) 帧起始(SOF, Start of Frame)

表示帧开始的段,1个位的显性位。(总线空闲时为隐性位,故帧起始以显性位非常好识别),对于数据帧和遥控帧的标准/扩展格式均如此。

669ff91c64e6821110c2bbb20c503f7b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

2) 仲裁段(Arbitration field)

表示数据的优先级的段,起作用就是根据报文ID来确定其发送优先级。标准格式和扩展格式在此的构成有所不同。

26c66d5f4d8b945c3b40a7f763e37975_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

这里对比数据帧与遥控帧各自的两个格式,其不同为:

27567cd148ae404bc5c37f05bdf38213_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

针对上表的这种设计,后面会具体分析其在仲裁过程的作用。

3) 控制段(Control field)

表述数据段的字节数,由6个位构成,标准格式和扩展格式的构成有所不同。

d648f15c40fce9d179aa745c7d6618de_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

7ea973879d18f2a7bab6c241b0ac1cf6_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

e08630537623bad8c2516f41b1cc18ce_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图16 控制段与数据段的关系(引自[5])

4) 数据段(Data Field)

数据段可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段。

c790091cb7974337c94351d597674fa3_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

5) CRC段(Cyclic Redundancy Check Field)

检查帧传输错误的帧,由15个位的CRC顺序和1个位的CRC界定符(用于分隔位)构成。CRC界定符恒为隐性。

036c4f2588ebb6f4dc9f46aa841327f1_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

这里CRC顺序是根据多项式生成的CRC值,CRC的计算范围包括帧起始,仲裁段,控制段和数据段。

b2ec9be063453f3a7560ef312e3e15c9_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图17 CRC序列计算方法

附2:en.wikipedia.org/wiki/C , 如何通俗的理解CRC校验并用C语言实现, zhuanlan.zhihu.com/p/77

6) ACK段(Acknowledge Field)

用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。

14a7687a8faad70c712ce458a53d87ee_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

8085d3dc844b3a4726fadd76d4fb6b5c_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

ba40d592b3657152d173fa586325f81b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图18 发送与接收时的ACK槽状态(引自[3])

7) 帧结束(End of Frame)

表示该帧的结束的段。由7个位的隐性位构成。

56b0c7f750d3e948793fdfb3b2178c63_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

3.2 错误帧

用于在接收和发送消息时检测出错误通知错误的帧,错误帧由错误标志和错误界定符构成。

3f156e1cdec23b88b1048671901789da_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图19 错误帧结构(引自[4])

上图的错误标志包括主动错误标志(6个位的显性位)和被动错误标志(6个位的隐性位)两种。主动错误标志处于主动错误状态下的单元检测出错误时输出的错误标志。被动错误标志处于被动错误状态的单元检测出错误时输出的错误标志。错误界定符由8个位的隐性位构成。

注意上图0~6位的错误标志重叠,这段怎么确定呢?需先介绍2个概念:位填充和错误类型。

1)位填充(Bit Stuffing)

位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位:

c640ed33075d05a31a0f366ae65792b5_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图20 位填充示意(引自[4])

271fe01074e05767200a7348ffc96667_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

注意:位填充作用范围为SOF-CRC段机间的数据。

2)错误类型

5f8c5004a6a25bfa1213396bb02e0c22_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

d0e7e0d93ba28dd62a6269bd637bcf56_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图21 CRC匹配示意(引自[6])

af20fa6b0991dd0b7a00196d316992dd_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图22 CRC错误(引自[6])

针对上述位错误再做说明(引自[3]):所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。有三种例外情况不属于位错误:在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;一个节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖。

3)错误处理

错误状态的种类有:主动错误状态,被动错误状态和总线关闭态3种状态。单元始终处于3种状态之一。

(1)主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。

(2)被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元在不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。

(3)总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。

以上这些状态依靠发送错误计算和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表:

97cafb26d12239dbda825508434fc42f_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

0f0b1aab8b59a8a7096ccf6a1d50c8ca_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图23 单元的错误状态(引自[4])

发送错误计数值和接收错误计数值根据一定的条件发送变化。错误计数值的变动条件如下表,一次数据的接收和发送可能同时满足多个条件。错误计数器在错误标志的第一个位出现的时间点上开始计数。

7671c20ab7088e5c8edc8ccf6f2ef4ec_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

4)错误帧发送

检查到错误后,什么时候发送错误帧呢?按照CAN协议的规定:

  • 位错误、填充错误、格式错误、ACK错误。在错误产生的那一位的下一位开始发送错误帧。
  • CRC错误。紧随ACK界定符后的位发送错误帧。

具体来看一个例子:

574687c64b90ad077178caba3987ac92_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图24 错误帧(引自[3])

  • 1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
  • 2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
  • 3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
  • 4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
  • 5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
  • 6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。

在了解了错误帧的发送后,回到之前提到错误标志重叠部分是怎样形成的,再看一个例子:

3a02212edb7c4e01c896811adc092a2b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图25 (引自[3])

在这个例子,我们知道位错误的错误标志与填充错误的错误标志重叠2位,剩下部分还有4位:

9def96191bfe41a7b7dd267e55d0e3d0_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

一文读懂CAN通讯协议(二)-阿里云开发者社区 (aliyun.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAN(Controller Area Network,控制器局域网)总线协议是一种广泛应用于工业自动化、汽车电子等领域的串行通讯协议。其帧格式如下: <img src="https://img-blog.csdnimg.cn/20200925125252655.png" width="400"> CAN总线协议的帧分为标准帧和扩展帧两种,其中标准帧包含11位标识符,扩展帧包含29位标识符。在CAN总线上,所有节点都可以同时发送和接收数据,因此需要在帧中包含发送方和接收方的信息。 帧格式的具体解释如下: 1. 帧起始符(SOF):一个固定的位模式,表示帧的起始。 2. 报文控制(CTRL):包含几个控制位,如IDE、RTR等。其中IDE表示标识符的类型,0表示标准帧,1表示扩展帧;RTR表示远程请求帧,0表示数据帧,1表示远程请求帧。 3. 标识符(ID):11位或29位的标识符,用于区分不同的CAN消息。 4. 控制域(CTL):包含几个控制位,如DLC、EDL等。其中DLC表示数据长度,即数据域的字节数;EDL表示数据长度是否扩展,0表示标准数据帧,1表示扩展数据帧。 5. 数据域(DATA):0~8字节的数据。 6. CRC:用于校验数据是否正确。 7. 确认位(ACK):由接收方发送的确认信息,表示数据是否正确接收。 8. 结束符(EOF):一个固定的位模式,表示帧的结束。 以上就是CAN总线协议的帧格式。在实际应用中,节点之间通过CAN总线进行数据交换,通过解析帧中的各个字段,可以判断消息的发送方、接收方、数据内容等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值