CAN(Controller Area Network)总线是ISO国际标准化的串行通信协议,在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。
一、基本概念
CAN协议经过ISO标准化后有两个标准ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准(闭环),而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准(开环)。
CAN的组成一般有两种方式:
- CPU与CAN控制器集成在一起(如STM32),再外接CAN收发器(常用TJA1050或82C250);
- CPU与CAN控制器分开,使用时需配置CAN接口电路(比较麻烦)。
CAN通信是通过CAN_High和CAN_Low两根差分信号线实现的:
-
CAN_High - CAN_Low < 0.5V 时候为隐性,逻辑信号表现为"逻辑1",即高电平。
-
CAN_High - CAN_Low > 0.9V 时候为显性的,逻辑信号表现为"逻辑0",即低电平。
注意:显性(逻辑0)的优先级比隐形(逻辑1)高,可用来进行多主机的仲裁。(在总线上只要有一个节点输出显性电平总线上即为显性电平,而只有所有的单元都输出隐式电平,总线上才为隐形电平)
二、通信过程
空闲状态:总线上出现连续11位隐性电平
开始传输数据:在总线状态为空闲时,节点向总线发送包括本身ID信息或其他控制指令的数据包(数据帧,也叫报文),其他节点按格式去解读得到原始数据。
报文:在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。类似这样的数据包就被称为 CAN 的数据帧。为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧(数据帧、遥控帧、错误帧、过载帧、帧间隔)。
数据帧是CAN通讯中最主要、最复杂的报文。以标准数据帧为例(扩展数据帧ID为29位,且仲裁段增加了1位隐性位SRR,控制段增加了1位显性位R1):
域段 | 域段名 | 位宽(bit) | 说明 |
帧起始 | SOF(Start of Frame) | 1 | 起始标志,固定为显性位0 |
仲裁段 | ID(Identify) | 11 | 多个节点同时发送数据时的优先级依据(仲裁机制),目标节点通过ID信息接收数据(验收滤波技术) |
RTR(Remote Transmission Request) | 1 | 数据帧此位为0,远程帧为1 | |
控制段 | IDE(Identifier Extension) | 1 | 标准格式此位为0,扩展格式为1 |
R0 | 1 | 保留位,固定为显性位0 | |
DLC(Data Length) | 4 | 数据字节长度,高位在前 | |
数据段 | Data | 0~64 | 0~8个字节,高位在前 |
CRC段 | CRC | 15 | 用于检查帧传输错误 |
CRC界定符 | 1 | 用于分隔CRC校验码和ACK段的位,为隐性位1 | |
ACK段 | ACK slot | 1 | 发送端发送隐性位1,接收端发送显性位0以示应答 |
ACK界定符 | 1 | 用于分隔ACK槽和帧结束,为隐性位1 | |
帧结束 | EOF(End of Frame) | 7 | 结束标志,固定为7个连续的隐性位1 |
例: 总线上有3个节点,节点1ID为000101 00010,节点2验收滤波ID表中有节点1的ID号,而节点3中的验收滤波ID表中没有节点1的ID号,节点1向节点2发送1字节的信息0101 1010。
则节点1发送的报文信息:0 000101 00010 0 0 0 0001 0101 1010 XXXXXXXXXXXXXXX 1 1 1 1111111
1 仲裁机制(线与和回读机制)
当多个节点同时向一个节点发送数据时,通过对各个消息的标识符(ID号)进行逐位仲裁(比较),即将ID的每一位与总线状态相与,(回读)比较线与的结果与本身是否一致,结果一致表示仲裁通过,该节点将获取总线的发送权,仲裁失败的节点则立即停止发送并转为监听(接收)状态。
由于显性优先级高于隐性,仲裁可以直接通过ID中0的数量来比较,0数量多的优先级高。
注意,仲裁段除了报文ID外,还有RTR位和IDE、SRR位(扩展模式中),当ID全都一样时,会继续比较接下来的几位。
2 位时序
CAN总线通讯协议的每一个数据帧可以看作一连串的电平信号,每一个电平信号代表一位,每一位又可以分为4段, 同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)、相位缓冲段 2(PBS2)。每个段分解后最小的时间单位是 Tq(位时序),而一个完整的位由 8~25 个 Tq 组成。
CAN的同步分为硬同步和重新同步:
硬同步:根据起始帧来进行同步的方式。即当总线上出现帧起始信号(SOF)时,其他节点控制器根据该下降沿对自己的位时序进行调整,把该下降沿包含到SS段内。无法确保后续一连串的位时序都是同步的。
重新同步:在检测到总线上的时序与节点使用的时序有相位差时(即总线上的跳变沿不在节点时序的 SS 段范围),通过延长 PBS1 段或缩短 PBS2 段,来获得同步。
SS段(SYNC SEG):同步段,大小为1Tq。
PTS段(PROP SEG):传播时间段,用于补偿网络的物理延时时间,包括发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。这个段的时间为以上各延迟时间的和的两倍,大小可以为 1~8Tq。
PBS1段(PHASE SEG1):相位缓冲段,主要用来补偿边沿阶段的误差。初始大小为 1~8Tq,时间长度可以在重新同步的时候加长。
PBS2段(PHASE SEG2):另一个相位缓冲段,也是用来补偿边沿阶段误差的。初始大小为 2~8Tq,时间长度可以在重新同步的时候缩短。
SJW(re Synchronization Jump Width):重新同步补偿宽度,即在重新同步的时候,PBS1 和 PBS2 段的允许加长或缩短的时间长度,SJW 加大后允许误差加大,但通信速度下降。SJW 为补偿此误差的最大值(即每一次误差补偿都不能超过这个值,大小为1~4Tq)。
总线上信号的跳变沿被包含在节点的 SS 段的范围之内,则表示节点与总线的时序是同步的,采样点采集到的总线电平即可被确定为该位的电平。
采样点:读取总线电平的时刻,并将读到的电平作为位值的点。位置在 PBS1 结束处。
延长/缩短PBS段来达到同步: PTS+PBS1小而PBS2加大时采样点前移,PTS+PBS1大而PBS2减小时采样点后移。
3 同步过程
在硬同步阶段,当节点检测到本身SS段并不在总线电平下降沿跳变处,节点则会把自己的位时序中的 SS 段平移至总线出现下降沿的部分,后面三段也跟着上去,以获得同步。(可以理解为节点在检测到帧起始信号时才开始“设置段”)
在重新同步阶段,利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。重新同步的方式以节点SS 段相对于总线跳变沿的位置进行区分,分为超前和滞后两种情况。
①相位超前。节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前SJW,这时控制器在下一个位时序中的 PBS1 段增加 SJW的时间长度,使得节点与总线时序重新同步。
②相位滞后。节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对滞后SJW,这时控制器在前一个位时序中的 PBS2 段减少SJW的时间长度,使得节点与总线时序重新同步。
4 一次数据传输过程
例:总线上有3个节点,节点1ID为000100 00110,节点2ID为000100 00111,节点3验收滤波ID表中有节点1和节点2的ID号,节点1和节点2同时向节点3发送一字节信息。
- 总线空闲,节点1和节点2同时发送帧起始信号,3个节点同时调整时序(硬同步);
- 节点1和节点2开始仲裁,两者同时向总线发送第一位0,同时回读总线状态与本身状态相与,得0,两者第1位仲裁均通过;直到第11位,节点1向总线发送0,节点2向总线发送1,总线状态为显性,两个节点回读总线状态与本身状态相与时,节点1得0(与本身状态相同),而节点2得0(与本身状态不同),此时节点1仲裁胜利,节点2放弃发送请求;
- 从第1位仲裁到第11位仲裁得同时,节点1向其他节点广播了本身的ID,当然节点1本身也接收到节点2的ID信息,因此节点2和节点3也都收到了节点1的ID信息,只不过节点2对节点1不敢兴趣,因而选择了忽略节点1后续的信息,节点3则开始接收节点1的数据;
- 从硬同步之后,每当节点1和节点2发出一个仲裁位,三个节点的CAN控制器都在检测本身的位时序与总线位时序是否一致,当有相位超前或者滞后时则自动进行位时序的重新同步。在后续的报文传送中亦是如此。
详细内容讲解可参考文章CAN总线协议_mustfeng的博客-CSDN博客_can协议