CAN通信
什么是CAN通信
基本概念
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议
主要包含三个部分:Host、控制器和收发器
示意图:
分类
高速CAN
SO 11898-2 规定要求在高速CAN总线的两端安装端接电阻(RL)以消除反射
电路拓扑图
物理信号电平
逻辑1:CANH 和 CANL 电压相同(CANH = CANL = 2.5V)时为逻辑“1”。
逻辑0:CANH 和 CANL 电压相差 2V(CANH = 3.5V, CANL = 1.5V) 时为逻辑“0”。
显性状态:高速CAN收发器在共模电压范围内(-12V ~ 12V),将CANH和CANL电压相差大于 0.9V 解释为显性状态(Dominant)
隐性状态:而将CANH和CANL电压相差小于 0.5V 解释为为隐性状态(Recessive)。
电平信号示意图
低速CAN
低速CAN最高速度只有 125Kbps,因此 ISO 11898-3 没有要求端接
逻辑1:CANH和CANL电压相差 5V (CANH = 0V, CANL = 5V)时为逻辑“1”
逻辑0;CANH和CANL电压相差 2.2V (CANH = 3.6V, CANL = 1.4V)时为逻辑“0”。
电平示意图
CAN通信有什么特点
通信特点
- 异步半双工通信
异步:没有共同的同步信号,而是在每个发送单元之前和之后,分别以起始和停止信号的形式包含同步信息
半双工:双方可以互相通信,但不能同时进行。同一时刻,在通信通道(BUS总线)中,只有一个站点发出信息,其它站点想要发送信息,只能等待通道空闲。 - 节点采用多主通信
- 采用短帧结构,报文的有效字节数为8个
- 报文ID值越小,优先级越高
- 非破坏性总线仲裁处理机制
即对各个消息的标识符(即ID号)进行逐位仲裁(比较),如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态
显性优先级高于隐性 - 可靠的CRC校验方式
循环冗余校验 - 报文帧仲裁失败或者传输期间被破坏有自动重发机制
- 节点在严重的情况具有自动脱离总线的功能
CAN包含了哪些数据
CAN报文数据结构
共包含六种数据类型:
- 标准数据帧
- 扩展数据帧
- 遥控帧
- 错误帧
- 帧间隔
- 过载帧
数据帧
1)标准数据帧
注:标准数据帧的ID为11位
信息描述:
域段 | 域段名 | 位宽:bit | 描述 |
---|---|---|---|
帧起始 | SOF(Start Of Frame) | 1 | 数据帧起始标志,固定为1bit显性('b0) |
仲裁段 | Identify(ID) | 11 | 本数据帧的 ID 信息, ID 信息的作用:① 如果同时有多个节点发送数据时,作为优先级依据(仲裁机制);② 目标节点通过 ID 信息来接受数据(验收滤波技术) |
RTR | Remote Transmission Request BIT | 1 | RTR标识是否是远程帧(0,数据帧;1,远程帧),在数据帧里这一位为显性('b0) |
IDE | Identifier Extension Bit | 1 | IDE用于区分标准格式与扩展格式,在标准格式中 IDE 位为显性(‘b0),在扩展格式里 IDE 位为隐性(’b1) |
R0 | 保留位 | 1 | 1bit保留位,固定为1'b0 |
DLC | data length | 4 | 由 4 位组成,MSB 先行(高位先行),它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0到8,若接收方接收到 9~15 的时候并不认为是错误 |
数据段 | data | 0~64 | 据帧的核心内容,它由 0~8 个字节(0 ~ 64位)组成,MSB 先行 |
CRC段 | CRC | 15 | 段用于检查帧传输错误,发送方以一定的方法计算包括:帧起始、仲裁段、控制段、数据段;接收方以同样的算法计算 CRC 值并进行比较,如果不同则会向发送端反馈出错信息,重新发送;计算和出错处理一般由 CAN 控制器硬件完成或由软件控制最大重发数。 |
CRC界定符 | 1 | CRC 界定符(用于分隔的位),为隐性位(1'b1),主要作用是把CRC 校验码与后面的 ACK 段间隔起来 | |
ACK 槽 | ACK slot | 1 | 在 ACK 槽位中,发送端发送的为隐性位,而接收端则在这一位中发送显性位以示应答;发送 ACK/返回 ACK这个过程使用到回读机制,即发送方先在 ACK 槽发送隐性位后,回读到的总线上的电平为显性0,发送方才知道它发送成功了,不用重发 |
ACK界定符 | 1 | 在 ACK 槽和帧结束之间由 ACK 界定符间隔开,为隐性位 | |
帧结束 | EOF | 7 | 由发送端发送 7 个隐性位表示结束 |
示例
报文信息 | 0 | 00010100010 | 0 | 0 | 0 | 0001 | 0101 1000 | XXXXXXXXXXXXXXX | 1 | 1 | 1 | 1111111 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
信息描述 | 帧起始 | ID | RTR | IDE | R0 | DLC | DATA | CRC | CRC界定 | ACK | ACK界定 | 帧结束 |
2)扩展数据帧
注:扩展数据帧的ID是29位
循环冗余校验(CRC)
CRC校验值是通过对数据字段、控制字段、和标识符字段进行一定的数学运算得到的
- 发送端:假设发送端数据为M,有m个数据;在M后添加n位冗余码,然后构成一帧发出,共(m+n)位
【PS:冗余码:二进制模2运算进行2^n*M(相当于M左移n位,即在M后补n个0,现在M是m+n位);用M除以收发双方事先商定的长度为n+1的除数P;得到余数R,这个R就是FCS(帧检验序列),这个FCS序列加到M上然后发出去】 - 接收端:在接收端把接受到的数据以帧为单位进行CRC校验;把收到的每一个帧都除以同样的除数P,然后检查余数R;如果余数R为0,则在传输过程中没有差错;如果出现误码,那么余数R为零的概率非常小
CRC校验的具体做法:
①选定一个标准除数(P位二进制数据串)
②在要发送的数据(M位)后面加上P-1位0,然后将这个新数(M+P-1位)以模2除法的方式除以上面这个标准除数,所得到的余数也就是该数据的CRC校验码(注:余数必须比除数少且只少一位,不够就补0)
③将这个校验码附在原M位数据后面,构成新的M+P-1位数据,发送给接收端。
④接收端将接收到的数据除以标准除数,如果余数为0则认为数据正确。
示例说明:
设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R = 5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。
完整的校验示例:
现假设选择的CRC生成多项式为 P(X) = X^4 + X^3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程 :
①将多项式转化为二进制序列,由 P(X) = X^4 + X^3 + 1可知二进制一共有5位,第4位、第3位和第0位分别为1,则序列为11001;
②多项式的位数5,则在数据帧的后面加上5-1位0,数据帧变为10110011 0000,然后使用模2除法除以除数P(X) = 11001,得到余数;