在工业和汽车上用的比较多一种通信总线技术。汽车上很多电气部分,通过两根线连接,按照CAN通信的标准读写数据。各个部分遵循同样的协议,每部分对应不同的ID号,以相同的波特率收发数据。每帧数据包含0-8字节及ID及CRC校验码等,通信速度快,距离远,且可靠性高。(SCI通信一次仅1字节,速度也不够高,采用奇偶校验码检测概率低,只适合可速度要求不高的短距离通信)
在网页中输入:
得到CRC=0x3132
C#实现:
privatevoidGetCRC(byte[]data){int[]CRC=newint[15];//data=newbyte[]{0x01,0x10,0x04,0x12,0x34,0x56,0x78};for(inti=0;i
明确两点:
如图所示,节点A和节点B的标识符的第10、9、8位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。因为A节点同时发出显性位,让总线也变成显性了,也就是0。节点B会退出发送处于单纯监听方式而不发送数据。节点A成功发送仲裁位从而获得总线的控制权,继而发送全部消息。总线中的信号持续跟踪最后获得总线控制权发出的报文,本例中节点A的报文将被跟踪。这种非破坏性位仲裁方法的优点在于,在网络最终确定哪个节点被传送前,报文的起始部分已经在网络中传输了,因此具有高优先级的节点的数据传输没有任何延时。
无损仲裁方式:就是当两个或者以上的不同ID节点“同时”向总线发送数据时候,优先级最高的就能直接发送。在总线空闲态,最先开始发送消息的单元获得发送权。
(1)了解位定时与同步
LLC层和MAC层也可以看作是CAN总线数据链路层的两个子层。
1、未接终端电阻-被动型错误帧
这是一幅来自最普通的ISO11898CAN总线的图片,以1Mbps速率运行。收发器是82C251。也就是说,物理层是由ISO11898指定的。示波器接CAN_H(CAN高位)和GND(接地):
示波器接CAN_L(CAN低位)和GND(接地):
这是另一个以125kbps发送的报文:
这是一幅更复杂的图片。它显示与上面例子相同的报文,比特率仍然是125kbps,但是CAN总线上没有端接。CAN线缆是短扁平带状线缆:
经验提示:始终端接CAN总线!反射不一定有害,但是损坏的边缘形状将破坏通信。
端接可以达到两个目的:①消除总线终端处的信号反射。②确保总线获得正确的直流电电平。
2、未接终端电阻-主动型错误帧
CAN总线大约2分米(8英寸)长。信号的下冲和振铃均可见,但是在这种情况中无关紧要。这次,平缓的上升斜率是问题所在。
这里是相同的设置,但是这次传送节点和接收节点都是错误主动型:
发生了什么情况?
3、没有接收节点
这里是另一幅图片。在此设置中,CAN总线上只有一个节点(正确端接)。该节点试图传送一条报文,但是没有其它节点在侦听。
那么,会发生什么情况?
(1)首先,传送节点发送整个报文。(2)传送节点期望在ACK时隙中填充一个显性电平。但是,因为没有其它节点在侦听,没有任何ACK到达,所以传送节点检测到一个应答错误。(3)然后传送器传送一个被动型错误标志(上图中,尝试发送了几秒钟,所以不再是错误主动型,而是被动型)。(4)被动型错误标志后面跟随一个错误定界符和间歇。(5)因为这个节点尝试发送一个报文但是操作失败,它必须再等待8位才能开始新的传送。这种情况在CAN规范中称为“挂起传送”。(6)传送节点还必须将其传送错误计数加8。但是,这是CAN规范中的特殊情况,只有当传送节点是错误主动型时才会发生。当传送节点进入错误被动型时,它不会增加其传送节点错误计数(这种情况中),而是会不断重试传送。