目录
参考:
1:CAN帧种类介绍:
CAN通信是以以下5种类型的帧进行的:
在这所有的帧中,数据帧和遥控帧由用户设置,而其他帧由CAN硬件设置
数据帧和遥控帧有两种格式:标准格式和扩展格式,标准格式有11bit的ID,而扩展格式则是29bit的ID
数据帧和遥控帧非常相似,不同之处在于:
1:RTR位,数据帧为0,远程帧为1;
2:遥控帧在帧结构上只是比数据帧少了数据场。
3:遥控帧发送特定的CAN ID,然后对应的ID的CAN节点收到远程帧之后,自动返回一个数据帧
遥控帧就像是命令,命令相应的节点返回一个数据包
注意:这里的帧ID并不是表示发送的目的地址,而是表示访问总线的消息的优先级(帧ID值越小,优先级越高)
2:数据帧
数据帧由发送单元使用,用来发送信息给接收单元,这是用户操作的基本帧。
数据帧有7个块组成。 上图显示了数据帧的结构。
(1)帧开始(SOF):这个域表示数据帧的开始,标准帧和扩展帧都是由1个位的显性电平表示帧起始
(2)仲裁场:这个域表示一个帧的优先级
(3)控制场:这个域表示保留位和数据字节数
(4)数据场:这是数据内容,0-8个字节的数据能被发送
(5)CRC场:这个域用于检查帧的传输错误。
(6)ACK场:是对帧已经被正常接收的一个证实。
(7)帧结束:指示数据帧结束
仲裁场:表示数据优先级的段,标准帧和扩展帧格式在本段有所区别,如图蓝灰色的部分
ID:高位在前,低位在后
基本ID块,禁止高 7 位都为隐形,既不能 ID = 1111111 XXXX
标准格式的 ID 有 11 个位,扩展格式的 ID 有 29 个位。
RTR,远程请求位,用来区分数据帧和远程帧。0:数据帧;1:远程帧;
SRR,替代标准帧的远程请求位,该位没有实际意义。设置为1(隐性电平);
IDE,标识符选择位。0:标准标识符;1:扩展标识符;在标准格式中,该位划分在了控制场下
控制场:由6个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同,如图蓝灰色部分
r0和r1:为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。
DLC:数据长度表示段,表示数据场包含数据的字节数,高位在前,DLC段有效值为0~8
IDE:标识符选择位,0:标准标识符;1:扩展标识符
数据段:
该段可包含0~8个字节,64bit的数据,从最高位(MSB)开始输出。标准帧和扩展帧在这个段的格式完全一样
CRC段:
CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。
接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
CRC界定符DEL:界定CRC序列,固定格式,一个隐形位组成
标准帧和扩展帧在此段格式相同
ACK段:
此段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位组成。标准帧和扩展帧在这个段的格式也是相同的:
ACK界定符DEL:界定ACK,固定格式,1个隐性位;
EOF:表示数据帧结束,固定格式,7个连续隐性位
ITM:固定格式,3个连续隐性位,ITM之后进入总线空闲状态,此时节点可以发送报文
发送单元ACK段:发送2个隐性位。
接收单元ACK段:接收到正确消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。称之为发送ACK/返回ACK。
注意:
所有接收单元只要不是处于bus-off或休眠状态,只有正确接收信息的单元才能发送ACK
(发送单元不发送ACK)。正常消息是指:不含填充错误、格式错误、CRC 错误的消息。
如果总线上除了发送单元,没有其它单元能接收信息,则No ACK被返回。为了通讯的建立,除了发送单元外,至少需要有一个单元能够接收信息。如果总线上有2个或更多个单元能接收到信息,如果它们中任意一个正常接收到信息,则会有ACK被返回。
3:遥控帧
遥控帧是接受单元请求发送单元发送一个信息,遥控帧有6个域组成,除了没有数据域外其他与数据帧是一样的
(1) 帧开始(SOF):这个域表示数据帧的开始。
(2) 仲裁场:这个域表示数据的优先级,具有同样ID的数据帧被请求。
(3) 控制场:这个域表示保留位和数据字节数
(4) CRC场:这个域用于检查帧的传输错误。
(5) ACK场:是对帧已经被正常接收的一个证实。
(6) 帧结束:指示遥控帧的结束
遥控帧和数据帧之间的不同:
1:遥控帧没有数据域,在仲裁域里的RTR位是隐形电平,而数据帧RTR则为显性的
2:没有数据的数据帧与遥控帧可以通过RTR来区别
遥控帧没有数据域,其数据长度码用来干什么:
遥控帧的数据长度的值表示对应请求的数据帧的数据长度码,就是要请求的数据量
4:DLL_错误检测
位错误:节点检测到的位与自身送出的位数值不同→ 位错误。仲裁或者ACK位期间送出“隐性”位,而检测到“显性”不导致位错误
填充检测: 在使用位填充编码的帧场(帧起始于CRC 序列)中,不允许出现6个连续相同的电平位
CRC 检测: 节点计算的CRC序列与接收到的CRC序列不同
格式检测: 固定格式位场(如CRC 界定符,ACK 界定符, 帧结束等)含有一个或者更多非法位
ACK 检测: 发送节点在ACK 位期间未检测“显性”位
4.1:检测到错误后,发送错误标志:
1. 位错误、填充错误、格式错误、ACK 错误产生后 错误位标志下一位发送;
2. CRC 错误:错误位标志在ACK 界定符后发送
几点需要注意的:
- 位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出ACK的单元、输出错误的单元来检测。
- 在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
- 在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
- 发送单元在ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的ACK 应答,而非位错误。
- 输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同6 个位的值(显性或隐性),并不视为位错误。
- 即使接收单元检测出EOF(7 个位的隐性位)的最后一位(第8 个位)为显性电平,也不视为格式错误。
- 即使接收单元检测出数据长度码(DLC)中9∼15 的值时,也不视为格式错误。
4.2:错误界定
每个节点都含有REC 和TEC, 当接收错误产生时,REC 增加;正确接收到数据帧,REC 减少;TEC 类似。
REC:Receive Error Counter 接收错误计数器
TEC:Transmit Error Counter 发送错误计数器
5:CAN_位时序
位速率:由发送单元在非同步的情况下发送的每秒钟的位数称为位速率,一个位一般可以分成四个段, 每个段由若干个Tq(Time Quantum)最小时间单位构成,这称为位时序
采样点是处于PBS1结束处
一个位的构成:
6:同步
CAN总线的通讯是采用NRZ(Non-Return to Zero,非归0)码,数据本身并不携带时钟信息,也即在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收工作。
然而,发送器和接收器之间由于彼此的时钟误差或传输路径的相位误差可能会失去同步关系,因此接收单元在接收帧的时候,必须通过硬件同步或重新同步调整它的操作时序。
6.1:硬件同步:在总线空闲状态时,接收单元检测到SOF,就会执行这个同步调整过程。“隐式”电平跳变到“显式”电平的边缘的时间点被认为是SS,而不管SJW的值
6.2:重新同步:在接收过程中检测到总线电平发生了改变时执行重新同步操作。每当检测到一个边沿(总线电平的改变),收发单元根据SJW值通过增加PBS1段或减少PBS2段,来调整同步。但,如果发生了超出SJW值的误差时,最大调整量不能超过SJW值