在工业和汽车上用的比较多一种通信总线技术。
汽车上很多电气部分,通过两根线连接,按照CAN通信的标准读写数据。
各个部分遵循同样的协议,每部分对应不同的ID号,以相同的波特率收发数据。
每帧数据包含0-8字节及ID及CRC校验码等,通信速度快,距离远,且可靠性高。
(SCI通信一次仅1字节,速度也不够高,采用奇偶校验码检测概率低,只适合可速度要求不高的短距离通信)
CAN总线介绍:
帧类别包括:数据帧,遥控帧,过载帧,错误帧,间隔帧。
1、数据帧
用于发送节点将接收节点传送数据的帧。
2、遥控帧
用于接收节点向具有相同ID的发送节点请求数据的帧。
3、过载帧
用于接收节点通知其尚未做好接收准备的的帧。
4、错误帧
用于在检测出通信错误(如校验错误)时向其它节点通知错误的帧。
5、间隔帧
用于将数据帧和远程帧与前面的帧分离开来的帧。
二、数据帧格式
数据帧构成:帧起始、仲裁段、控制段、数据段、CRC、ACK(应答场)、帧结束。
标准帧:
扩展帧:
1、帧起始
帧起始(SOF)标志着数据帧和远程帧的起始,标准帧和扩展帧都是由1个位的显性电平表示帧起始。
2、仲裁域
由标识符和RTR位组成,标准帧格式与扩展帧格式的仲裁域格式不同。
标准格式里,仲裁域由1l位标识符和RTR位组成。标识符位有ID28~ID18。
扩展帧格式里,仲裁域包括29位标识符、SRR位、IDE位、RTR位。其标识符有ID28~ID0。
标准格式里,仲裁域由1l位标识符和RTR位组成。标识符位有ID28~ID18。
扩展帧格式里,仲裁域包括29位标识符、SRR位、IDE位、RTR位。其标识符有ID28~ID0。
标识符有优先级,越小,优先级越高。
对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。
仲裁域传输顺序为从最高位到最低位,其中最高7位不能全为零。
下面详细说一下扩展帧的仲裁段(对应下面两张图)。
(1)替代远程请求位SRR(Substitute Remote Request)
在扩展帧中,SRR恒为隐性位1,并且扩展帧的隐性SRR位正好对应标准帧的显性RTR位。
这就解释了SRR位的作用:在前11位ID号相同的情况下,标准数据帧的优先级高于扩展数据帧。
这就解释了SRR位的作用:在前11位ID号相同的情况下,标准数据帧的优先级高于扩展数据帧。
在传输完11位标识符之后(扩展帧的后18位在最后发送,先发送11位标识符),轮到标准帧的RTR位和扩展帧的SRR位了。这时候,标准帧的RTR为显性,而扩展帧SRR为隐性,这样,总线自然就被标准帧占据。
(2)标志符扩展位IDE(Identifier Extension)
在扩展帧中恒为隐性1;
在标准帧中,IDE位于控制段,且恒为显性0。
且扩展帧IDE位和标准帧IDE位位置对应,这就保证了: 在前11位ID号相同的情况下,标准遥控帧的优先级一定高于扩展遥控帧。
(3)远程发送请求位RTR(Remote TransmissionRequest)
在数据帧里必须为“显性 0”,而在远程帧里必须为“隐性 1”。
这么做的原因是保证数据帧优先级高于远程帧。
3、控制段
表示数据的字节数及保留位的段,由6个位构成,表示数据段的字节数。
标准帧:IDE,r0,DLC
扩展帧:r1,r0,DLC
标准帧:IDE,r0,DLC
扩展帧:r1,r0,DLC
在标准帧中,保留位r1表示为IDE位。
IDE位为显性,表示数据帧为标准格式;
IDE位为隐性,表示数据帧为扩展帧格式。
IDE位为显性,表示数据帧为标准格式;
IDE位为隐性,表示数据帧为扩展帧格式。
r0保留位必须发送为显性0。
4、数据段
数据的内容,一帧可发送0~8个字节的数据。
5、循环冗余码CRC场
CRC段检查帧的传输错误的段。接收方以同样的算法计算CRC值并进行比较,不一致时会通报错误。。
CRC场包括CRC序列(CRC Sequence,15个位),其后是CRC界定符(CRC Delimiter,1个位)(用于分隔的位)。
CRC界定符是固定的1个隐性位1。
CRC在线计算(包含C语言实现)
例如:
在网页中输入:
得到CRC = 0x3132
注意:
(1)CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段
(2)计算并不包括因为5个连续相同电平而插入的Bit;
(3)
C#实现:
private void GetCRC(byte[] data) { int[] CRC = new int[15]; //data = new byte[] { 0x01, 0x10, 0x04, 0x12, 0x34, 0x56, 0x78}; for (int i = 0; i < data.Length; i++) { for (int j = 7; j >= 0; j--) { int tmpbit = (data[i] >> j)&0x01; int DoInvert = tmpbit ^ CRC[14]; CRC[14] = CRC[13] ^ DoInvert; CRC[13] = CRC[12]; CRC[12] = CRC[11]; CRC[11] = CRC[10]; CRC[10] = CRC[9] ^ DoInvert; CRC[9] = CRC[8]; CRC[8] = CRC[7] ^ DoInvert; CRC[7] = CRC[6] ^ DoInvert; CRC[6] = CRC[5]; CRC[5] = CRC[4]; CRC[4] = CRC[3] ^ DoInvert; CRC[3] = CRC[2] ^ DoInvert; CRC[2] = CRC[1]; CRC[1] = CRC[0]; CRC[0] = DoInvert; } } string crcstr = ""; for (int j = 0; j < 15; j++) { crcstr += CRC[j].ToString(); } crcstr = new string(crcstr.ToArray().Reverse().ToArray());//字符串转置 crcstr = "0" + crcstr; //CRC15,最高位添0 }
6、应答场
应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),如图所示:
发送单元ACK段:发送2个隐性位1。
接收单元ACK段:既不处于总线关闭态也不处于休眠态的所有接收单元中接收到正常消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。
接收单元ACK段:既不处于总线关闭态也不处于休眠态的所有接收单元中接收到正常消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。
正常消息是指:不含填充错误、格式错误、CRC错误的消息。
7、帧结束
表示数据帧结束的段。由7个“隐性”位组成。
标准帧格式:
三、通讯过程
1、仲裁机制
明确两点:
(1)低波形代表0(显性),高波形代表1(隐性);
(2)当隐性碰到显性,就变为显性。
如图所示,节点A和节点B的标识符的第10、9、8 位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。
第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。
因为A节点同时发出显性位,让总线也变成显性了,也就是0。
节点B会退出发送处于单纯监听方式而不发送数据。
节点A成功发送仲裁位从而获得总线的控制权,继而发送全部消息。
总线中的信号持续跟踪最后获得总线控制权发出的报文,本例中节点A的报文将被跟踪。
这种非破坏性位仲裁方法的优点在于,在网络最终确定哪个节点被传送前,报文的起始部分已经在网络中传输了,因此具有高优先级的节点的数据传输没有任何延时。
在获得总线控制权的节点发送数据过程中,其他节点成为报文的接收节点,并且不会在总线再次空闲之前发送报文,在这逐位的比较中,最终节点B因为第七位的偏差丢掉了总线,从此单纯监听,这就是仲裁机制。
无损仲裁方式:就是当两个或者以上的不同ID节点“同时”向总线发送数据时候,优先级最高的就能直接发送。
在总线空闲态,最先开始发送消息的单元获得发送权。
2、错误检测
具有错误检测、错误通知和错误恢复功能所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元。
四、硬件原理
1、引脚分布
2、终端电阻
在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
五、ISO 11519-2与ISO 11898-3之间的关系
CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。标准对于数据链路层的定义相同,物理层不同。
(1)ISO11898
是通信速度为 5kbps-1Mbps的 CAN 高速通信标准。高速CAN网络在每个网络端点端接一个120欧姆的电阻。
(2)ISO11519-2
是通信速度为 125kbps以下的 CAN 低速通信标准,也就是容错CAN(LSFT CAN)。提供从5 Kbit/s到125 Kbits/s的波特率。
该标准允许在CAN总线连线失败时CAN总线通信得以继续进行。在低速/容错CAN网络,每种设备都有它自己的终端。由于终端的类型不同,因此高速和低速/容错CAN设备不能在同一个网络中使用。
(3)ISO-14229https://blog.csdn.net/tfslovexizi/article/details/88523965
六、Intel格式与Motorola格式数据矩阵示例
七、单、双滤波与验收代码寄存器、验收屏蔽寄存器
CAN总线验收代码寄存器(ACR)和验收屏蔽寄存器(AMR)均对于CAN接收而言。
代码寄存器用来指定匹配的格式;
屏蔽寄存器则指定不考虑的位。
验收屏蔽寄存器的某一位等于1时,表示忽略对该位对应ID位的滤波。
如验收屏蔽寄存器值=FFFFFFFF,表示屏蔽ACR的所有滤波位,则可以接收所有的消息。
每个过滤器由两部分组成:验收代码器和验收屏蔽器。
代码寄存器用来指定匹配的格式;
屏蔽寄存器则指定不考虑的位。
验收屏蔽寄存器的某一位等于1时,表示忽略对该位对应ID位的滤波。
如验收屏蔽寄存器值=FFFFFFFF,表示屏蔽ACR的所有滤波位,则可以接收所有的消息。
每个过滤器由两部分组成:验收代码器和验收屏蔽器。
1、单过滤模式
只使用一个过滤器(共8个寄存器——4个验收代码器,4个验收屏蔽器)。
对于标准帧,滤波器只比较11位帧ID、RTR位和帧数据的前2个字节;
对于扩展帧,滤波器比较29位帧ID和RTR位。
当在单过滤模式下接收一个标准帧:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 未使用;
ACR2 和 ACR3 与数据字节1和2比较。
当在单过滤模式下接收一个扩展帧:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;
ACR2.7:0 和 ACR3.7:3 与 ID.12:0 比较;
ACR3.2 与 RTR 位比较;
ACR3.1:0 未使用。
对于标准帧,滤波器只比较11位帧ID、RTR位和帧数据的前2个字节;
对于扩展帧,滤波器比较29位帧ID和RTR位。
当在单过滤模式下接收一个标准帧:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 未使用;
ACR2 和 ACR3 与数据字节1和2比较。
当在单过滤模式下接收一个扩展帧:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;
ACR2.7:0 和 ACR3.7:3 与 ID.12:0 比较;
ACR3.2 与 RTR 位比较;
ACR3.1:0 未使用。
2、双过滤模式
使用两个更小的过滤器(4个验收代码器拆开使用,4个验收屏蔽器拆开使用)。
(相当于定义两组比较规则,收到的帧只要符合任意一组规则就认为是有效帧)
对于标准帧,验收滤波器1比较11位帧ID、RTR位和第1个数据字节,验收滤波器2比较11位帧ID和RTR位;
对于扩展帧,两个滤波器都只比较ID前16位,符合条件就接收。
当在双过滤模式下接收一个标准帧:
过滤器 1:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 与数据字节 1 的高半字节比较;
ACR3.3:0 与数据字节 1 的低半字节比较;
过滤器 2:
ACR2.7:0 和 ACR3.7:5 与 ID.10:0 比较;
ACR3.4 与 RTR 位比较。
当在双过滤模式下接收一个扩展帧:
过滤器 1:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;
过滤器 2:
ACR2.7:0 和 ACR3.7:0 与 ID.28:13 比较。
举例:如果ACR0=11101111,AMR0=00000000,那么要想通过验收滤波,必须ID.28-ID.21=ACR0=11101111。
如果AMR0=00010000,那么ID.28-ID.21=11111111时,也可以通过验收滤波,因为此时AMR0的第五位为1,也就是屏蔽了ACR0的第五位。所以ID的相应位可以不和ACR0一致。
(相当于定义两组比较规则,收到的帧只要符合任意一组规则就认为是有效帧)
对于标准帧,验收滤波器1比较11位帧ID、RTR位和第1个数据字节,验收滤波器2比较11位帧ID和RTR位;
对于扩展帧,两个滤波器都只比较ID前16位,符合条件就接收。
当在双过滤模式下接收一个标准帧:
过滤器 1:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 与数据字节 1 的高半字节比较;
ACR3.3:0 与数据字节 1 的低半字节比较;
过滤器 2:
ACR2.7:0 和 ACR3.7:5 与 ID.10:0 比较;
ACR3.4 与 RTR 位比较。
当在双过滤模式下接收一个扩展帧:
过滤器 1:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;
过滤器 2:
ACR2.7:0 和 ACR3.7:0 与 ID.28:13 比较。
举例:如果ACR0=11101111,AMR0=00000000,那么要想通过验收滤波,必须ID.28-ID.21=ACR0=11101111。
如果AMR0=00010000,那么ID.28-ID.21=11111111时,也可以通过验收滤波,因为此时AMR0的第五位为1,也就是屏蔽了ACR0的第五位。所以ID的相应位可以不和ACR0一致。
八、CAN波形
注意两点:
1、在CAN协议中当连续出现5个相同电平时就需要插入一个反向电平(位填充);
2、在CAN协议中将CAN_H和CAN_L的差值为高电平时定义为显性,逻辑上表示为0,为低电平时定义为隐形,逻辑上表示为1,所以实际读出来的数据要取反。
2、在CAN协议中将CAN_H和CAN_L的差值为高电平时定义为显性,逻辑上表示为0,为低电平时定义为隐形,逻辑上表示为1,所以实际读出来的数据要取反。
通过波形解析can总线数据:https://blog.csdn.net/ciellee/article/details/96160606
九、总线特点
1、可以多主方式工作,网络上任意一个节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。
2、网络上的节点可分成不同的优先级,可以满足不同的实时要求。
3、采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传送数据。
4、可以点对点,一点对多点及全局广播几种传送方式接收数据。
5、直接通信距离最远可达10km(速率4Kbps以下)
6、通信速率最高可达1MB/s(此时距离最长40m)
7、节点数最多可达110个。
8、采用短帧结构,每一帧的有效字节数为8个。
9、每帧信息都有CRC校验及其他检错措施,数据错误率极低。
10、通信介质可采用双绞线,同轴电缆和光纤,一般采用廉价的双绞线即可。
11、节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上的其他操作不受影响。
2、网络上的节点可分成不同的优先级,可以满足不同的实时要求。
3、采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传送数据。
4、可以点对点,一点对多点及全局广播几种传送方式接收数据。
5、直接通信距离最远可达10km(速率4Kbps以下)
6、通信速率最高可达1MB/s(此时距离最长40m)
7、节点数最多可达110个。
8、采用短帧结构,每一帧的有效字节数为8个。
9、每帧信息都有CRC校验及其他检错措施,数据错误率极低。
10、通信介质可采用双绞线,同轴电缆和光纤,一般采用廉价的双绞线即可。
11、节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上的其他操作不受影响。
使用非屏蔽双绞线传输时,传输速率与传输距离的关系如下图所示:
高速CAN系统采用硬线是动力型,速度:500kbps,控制ECU、ABS等;
低速CAN是舒适型,速度:125Kbps,主要控制仪表、防盗等。
十、ACK异常导致CAN发送失败
如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个错误标志,并且发送错误计数器值加8,节点就会对报文进行自动重发,若自动重发依然收不到ACK,则在发送错误计数器计数满128后(即出现16帧错误帧),由错误主动转为错误被动状态。
导致ACK段出错的原因可能有:
(1)总线上只有一个有效节点
发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
(2)波特率不匹配或者节点没有初始化,导致没有ACK;
(3)总线线缆短路,断路,接反;
(4)高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。
发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
(2)波特率不匹配或者节点没有初始化,导致没有ACK;
(3)总线线缆短路,断路,接反;
(4)高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。
十一、CAN总线波特率计算
(1)了解位定时与同步
(2)总线波特率计算及设置方法
1、https://blog.csdn.net/limanjihe/article/details/1202783172、https://blog.csdn.net/Blaider/article/details/7480112
十二、CAN总线模式(SJA1000)
(1)自检测模式:发送CAN帧时不检查应答位;
(2)只听模式:此模式下不发送错误帧,用于自动监测波特率,以不同的波特率接收CAN帧。当收到CAN帧时表明当前波特率与总线波特率相同。
(2)只听模式:此模式下不发送错误帧,用于自动监测波特率,以不同的波特率接收CAN帧。当收到CAN帧时表明当前波特率与总线波特率相同。