CAN通信

CAN通信

什么是CAN通信

基本概念

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议
主要包含三个部分:Host、控制器和收发器
示意图:

img

分类

高速CAN

SO 11898-2 规定要求在高速CAN总线的两端安装端接电阻(RL)以消除反射

电路拓扑图
img
物理信号电平

逻辑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)。
image

电平信号示意图
img

低速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”。

电平示意图
img

CAN通信有什么特点

通信特点

  • 异步半双工通信
    异步:没有共同的同步信号,而是在每个发送单元之前和之后,分别以起始和停止信号的形式包含同步信息
    半双工:双方可以互相通信,但不能同时进行。同一时刻,在通信通道(BUS总线)中,只有一个站点发出信息,其它站点想要发送信息,只能等待通道空闲。
  • 节点采用多主通信
  • 采用短帧结构,报文的有效字节数为8个
  • 报文ID值越小,优先级越高
  • 非破坏性总线仲裁处理机制
    即对各个消息的标识符(即ID号)进行逐位仲裁(比较),如果某个节点发送的消息仲裁获胜,那么这个节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转变为监听(接收)状态
    显性优先级高于隐性
  • 可靠的CRC校验方式
    循环冗余校验
  • 报文帧仲裁失败或者传输期间被破坏有自动重发机制
  • 节点在严重的情况具有自动脱离总线的功能

CAN包含了哪些数据

CAN报文数据结构

image

共包含六种数据类型:

  1. 标准数据帧
  2. 扩展数据帧
  3. 遥控帧
  4. 错误帧
  5. 帧间隔
  6. 过载帧

数据帧

1)标准数据帧

image

注:标准数据帧的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)扩展数据帧

image

注:扩展数据帧的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。
image

完整的校验示例:
现假设选择的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,得到余数;
image

遥控帧

错误帧

过载帧

帧间隔

posted @ 2024-07-18 16:07  不吃番茄味的崽  阅读(343)  评论(0)    收藏  举报