CAN简介:控制器局域网总线,两根通信线(CAN_H、CAN_L),差分信号通信,抗干扰能力强,异步半双工。可实现广播式和请求式。
主流通信协议对比

一、硬件简介
1、CAN硬件电路
•每个设备通过CAN收发器挂载在CAN总线网络上
•CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
•高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
(a.防止终端信号反射。b.收紧线路)
•低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻

2、CAN电平标准
总线的状态采用差分信号,两线电压差传输数据位
•CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位
•高速CAN规定: 电压差为0V时表示逻辑1(隐性电平)电压差为2V时表示逻辑0(显性电平)
•低速CAN规定: 电压差为-1.5V时表示逻辑1(隐性电平)电压差为3V时表示逻辑0(显性电平)

3、CAN收发器

TXD输出部分,RXD输入部分
4、CAN物理层特性

二、CAN总线帧格式
五种类型帧

1、数据帧

各部分用途简介
•SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位
•ID(Identify):标识符,区分功能,同时决定优先级
•RTR(Remote Transmission Request ):远程请求位,区分数据帧和遥控帧
•IDE(Identifier Extension):扩展标志位,区分标准格式和扩展格式
•SRR(Substitute Remote Request):替代RTR,协议升级时留下的无意义位
•r0/r1(Reserve):保留位,为后续协议升级留下空间
•DLC(Data Length Code):数据长度,指示数据段有几个字节
•Data:数据段的1~8个字节有效数据
•CRC(Cyclic Redundancy Check):循环冗余校验,校验数据是否正确
•ACK(Acknowledgement):应答位,判断数据有没有被接收方接收
•CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
•EOF(End of Frame ):帧结束,表示数据位已经传输完毕
2、遥控帧
无数据段

3、错误帧
•总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
4、过载帧
•当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
5、帧间隔
•将数据帧和遥控帧与前面的帧分离开
6、位填充

三、位同步
•CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
•发送方以约定的位时长每隔固定时间输出一个数据位
•接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
•理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
1、位时序
•为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
ØSS = 1Tq
ØPTS = 1~8Tq
ØPBS1 = 1~8Tq
ØPBS2 = 2~8Tq

2、硬同步
•每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
•硬同步只在帧的第一个下降沿(SOF下降沿)有效
•经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近


3、再同步
•若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
•再同步可以发生在第一个下降沿之后的每个数据位跳变边沿

4、波特率计算
•波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)
•例如:
SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq
Tq = 0.5us
波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps

四、仲裁
多设备同时发送遇到的问题
•CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
•解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线
1、规则一:先占先得
•若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
•任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
•一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
•若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
2、规则二:非破坏性仲裁
•若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
•实现非破坏性仲裁需要两个要求:
Ø线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
Ø回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
过程:(1)数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利,即数据位被破坏。

(2)数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧
(3)标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)
五、错误处理
1、错误类型
•错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误

2、错误状态
•主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧
•被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧
•总线关闭状态的设备不能参与通信
•每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态

3、错误计数器

六、CAN外设简介
1、基本结构

(1)发送过程
流程:选择一个空置邮箱→写入报文 →请求发送

(2)接收过程
流程:接收到一个报文→匹配过滤器后进入FIFO 0或FIFO 1→CPU读取

(3)发送和接收配置位
•NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功
•
•TXFP:置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符值小的先发送(标识符值相等时,邮箱号小的报文先发送)
•
•RFLM:置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖
(4)标识符过滤器
•每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]
•FSCx:位宽设置
置0,16位;置1,32位
•FBMx:模式设置
置0,屏蔽模式;置1,列表模式
•FFAx:关联设置
置0,FIFO 0;置1,FIFO 1
•FACTx:激活设置
置0,禁用;置1,启用
映像图参考
配置实例:

(5)测试模式
•静默模式:用于分析CAN总线的活动,不会对总线造成影响
•环回模式:用于自测试,同时发送的报文可以在CAN_TX引脚上检测到
•环回静默模式:用于热自测试,自测的同时不会影响CAN总线

(6)工作模式
•初始化模式:用于配置CAN外设,禁止报文的接收和发送
•正常模式:配置CAN外设后进入正常模式,以便正常接收和发送报文
•睡眠模式:低功耗,CAN外设时钟停止,可使用软件唤醒或者硬件自动唤醒
•AWUM:置1,自动唤醒,一旦检测到CAN总线活动,硬件就自动清零SLEEP,唤醒CAN外设;置0,手动唤醒,软件清零SLEEP,唤醒CAN外设

(7)位时间特性

•波特率 = APB1时钟频率 / 分频系数 / 一位的Tq数量
= 36MHz / (BRP[9:0]+1) / (1 + (TS1[3:0]+1) + (TS2[2:0]+1))
(7)中断
•CAN外设占用4个专用的中断向量
•
•发送中断:发送邮箱空时产生
•
•FIFO 0中断:收到一个报文/FIFO 0满/FIFO 0溢出时产生
•
•FIFO 1中断:收到一个报文/FIFO 1满/FIFO 1溢出时产生
•
•状态改变错误中断:出错/唤醒/进入睡眠时产生

(8)时间触发通信(了解)
•TTCM:置1,开启时间触发通信功能;置0,关闭时间触发通信功能
•CAN外设内置一个16位的计数器,用于记录时间戳
•TTCM置1后,该计数器在每个CAN位的时间自增一次,溢出后归零
•每个发送邮箱和接收FIFO都有一个TIME[15:0]寄存器,发送帧SOF时,硬件捕获计数器值到发送邮箱的TIME寄存器,接收帧SOF时,硬件捕获计数器值到接收FIFO的TIME寄存器
•发送邮箱可配置TGT位,捕获计数器值的同时,也把此值写入到数据帧数据段的最后两个字节,为了使用此功能,DLC必须设置为8

(9)错误处理和离线恢复
•TEC和REC根据错误的情况增加或减少
•ABOM:置1,开启离线自动恢复,进入离线状态后,就自动开启恢复过程;置0,关闭离线自动恢复,软件必须先请求进入然后再退出初始化模式,随后恢复过程才被开启

七、示例:单个设备环回测试(自发自收)
传统流程:
1、GPIO初始化,开启时钟,指定寄存器、配置结构体
2、CAN初始化,配置CAN模式结构体

3、过滤器结构体配置

IdHigh和IdLow、MaskIdHigh和MaskIdLow的组合可以配置模式
4、CAN传递函数(发送)

5、查询接收