CANBUS协议解析


原文链接: CANBUS协议解析

CAN协议,系统结构和帧结构
一张图诠释CAN标准帧和扩展帧的区别
简单学习STM32CAN协议
[](http://blog.csdn.net/mao0514/article/details/48131597)

  1. RTR Remote Transmission Request 远程帧 [ 隐性(1)为远程帧 )
  2. IDE Identifier Extension 扩展帧 [ 隐性(1) 为扩展帧]
  3. r0 r1 总是用隐性来填充
    CAN BUS(Controller Area Network)即控制器局域网,是国际上应用最广泛的现场总线之一。起先,CAN BUS被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
    CAN BUS是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。当信号传输距离达到10Km时,CAN BUS仍可提供高达5Kbps的数据传输速率。由于CAN串行通讯总线具有这些特性,它很自然地在汽车电子行业中受到广泛应用。
    下面从与我们工作相关的物理层特性、帧格式、命令交互等三个方面来介绍CAN BUS协议。
    Ø 物理层特性:可分为单线CAN协议和双线CAN协议。单线CAN协议目前主要出现在GM车系里面,1号脚通讯,波特率为33.3K。双线CAN协议常见的波特率有500K(6/14)、250K(6/14)和125K(3/11),括号内为通讯脚位。单、双线CAN协议的命令交互格式基本一致。
    Ø 帧格式:
    CAN2.0A标准帧为11个字节,包括信息和数据两部分,前3个字节为信息部分。
    7 6 5 4 3 2 1 0
    字节1 FF RTR x x DLC 数据长度
    字节2 报文识别码 ID.10-ID.3
    字节3 ID.2-ID.0 x x x x x
    字节4 数据1
    字节5 数据2
    字节6 数据3
    字节7 数据4
    字节8 数据5
    字节9 数据6
    字节10 数据7
    字节11 数据8
    字节1 为帧信息 第7位FF 表示帧格式(在标准帧中FF=0,在扩展帧中FF=1)     
    第6位RTR 表示帧的类型(RTR=0表示为数据帧 RTR=1表示为远程帧)  
    DLC 表示在数据帧时实际的数据长度
    字节2-3 为报文识别码11位有效
    字节4-11为数据帧的实际数据,远程帧时无效

命令帧示例:
Tools: 08H 07H E0H 03H 19H 02H FFH 00H 00H 00H 00H
ECU : 08H 07H E8H 10H 0FH 59H 02H FFH 01H 80H 00H
通常情况下,标准CAN协议的响应帧报文识别码就是请求帧的报文识别码加上8,即0x7E8,左移5位后就是我们所看到的FD 00。

CAN2.0B扩展帧信息为13个字节,包括信息和数据两部分,前5个字节为信息部分。

7   6   5   4   3   2   1   0

字节1 FF RTR x x DLC 数据长度
字节2 报文识别码 ID.28-ID.21
字节3 ID.20-ID.13
字节4 ID.12-ID.5
字节5 ID.4-ID.0 x x x
字节6 数据1
字节7 数据2
字节8 数据3
字节9 数据4
字节10 数据5
字节11 数据6
字节12 数据7
字节13 数据8

   字节1 为帧信息  第7位FF 表示帧格式(在标准帧中FF=0,在扩展帧中FF=1)      

第6位RTR 表示帧的类型(RTR=0表示为数据帧 RTR=1表示为远程帧)
DLC    表示在数据帧时实际的数据长度
字节2-5 为报文识别码其高29位有效
字节6-13 为数据帧的实际数据,远程帧时无效
命令帧示例:
Tools: 88H 18H DAH 11H F1H 03H 19H 02H FFH 00H 00H 00H 00H
ECU : 88H 18H DAH F1H 11H 10H 0FH 59H 02H 01H FFH 01H 00H
通常情况下,响应帧的报文识别码只需要把目标地址和源地址交换位置即可。

Ø 命令交互:
CAN协议的主要命令交互形式有发1帧回1帧、发1帧回多帧、发多帧回1帧及发多帧回多帧,下面分别举例说明。
发1帧回1帧:
Tools: 08H 07H E0H 03H 19H 02H FFH 00H 00H 00H 00H
ECU : 08H 07H E8H 04H 59H 02H FFH 01H 80H 01H 00H
第一个字节的低4位表示除报文识别码的两个字节外其他字节的长度,第四个字节03表示后面有效数据的长度。
发1帧回多帧:
Tools: 08H 07H E0H 03H 19H 02H FFH 00H 00H 00H 00H
ECU : 08H 07H E8H 10H 0FH 59H 02H FFH 01H 80H 00H
Tools: 08H 07H E0H 30H 00H 00H 00H 00H 00H 00H 00H
ECU : 08H 07H E8H 21H FFH 01H 79H F1H E3H 01H 62H
ECU : 08H 07H E8H 22H F1H FFH 00H 00H 00H 00H 00H
发出第一条请求帧后,如果响应帧的第四个字节高四位大于0,则表示回多帧。响应帧的有效数据长度为0x100F&0x0FFF=0x0F,表示有15个有效数据的回复帧。设备紧跟着发送流控制帧Tools: 08H 07H E0H 30H 00H 00H 00H 00H 00H 00H 00H来接收下面的有效回复数据,这个流控制帧在不同的车上可能会不一样。
发多帧回1帧:
Tools: 08H 07H E0H 10H 09H 01H 02H 03H 04H 05H 06H
ECU : 08H 07H E8H 30H 00H 00H 00H 00H 00H 00H 00H
Tools: 08H 07H E0H 21H 07H 08H 09H 00H 00H 00H 00H
ECU : 08H 07H E8H 04H 59H 02H FFH 01H 80H 01H 00H
发第一条请求帧的时候,如果请求帧第4个字节高四位大于0,则表示发多帧,发送的命令数据长度有第4,第5个字节一起决定,在这里数据长度为9,这时候ECU响应0x30的流控制帧,Tools继续发送请求帧,蓝色为有效数据,发送完后,ECU响应正确的命令回复。
发多帧回多帧:
Tools: 08H 07H E0H 10H 09H 01H 02H 03H 04H 05H 06H
ECU : 08H 07H E8H 30H 00H 00H 00H 00H 00H 00H 00H
Tools: 08H 07H E0H 21H 07H 08H 09H 00H 00H 00H 00H
ECU : 08H 07H E8H 10H 0FH 59H 02H FFH 01H 80H 00H
Tools: 08H 07H E0H 30H 00H 00H 00H 00H 00H 00H 00H
ECU : 08H 07H E8H 21H FFH 01H 79H F1H E3H 01H 62H
ECU : 08H 07H E8H 22H F1H FFH 00H 00H 00H 00H 00H
在这种情况下的交互,将发1帧回多帧和发多帧回1帧结合就可以了。需要注意的是,对于不同的ECU,由于细微协议的区别,在对于通过流控制帧来发送或接收剩余数据是不一样的,有的时候会通过一条流控制帧将所有数据一次收完,有时候则是采用1对1的方式。

`