目录
[CAN 标识符寄存器(CAN_(T/R)IxR)](#CAN 标识符寄存器(CAN_(T/R)IxR))
[CAN 过滤器FIFO关联寄存器(CAN_FFA1R)](#CAN 过滤器FIFO关联寄存器(CAN_FFA1R))
[CAN 过滤器激活寄存器(CAN_FA1R)](#CAN 过滤器激活寄存器(CAN_FA1R))
[CAN 过滤器组x寄存器(CAN_FxR(1/2))](#CAN 过滤器组x寄存器(CAN_FxR(1/2)))
CAN简介
CAN(Controller Area Network),是IOS国际标准化的串行通信协议。为了满足汽车产业的"减少线束的数量"、"通过多个LAN,进行大量数据的高速通信"的需求。
CAN总线的发展史:
- 低速CAN(ISO11519)通信速率10~125Kbps,总线长度可达1000米
- 高速CAN(ISO11898)通信速率125Kbps~1Mbps,总线长度≤40米(经典CAN)
- CANFD 通信速率可达5Mbps,并且兼容经典CAN,遵循ISO 11898-1 做数据收发
CAN总线拓扑图
CAN总线由两根线( CANL 和 CANH )组成,允许挂载多个设备节点(低速CAN:20 高速CAN:30)。
CAN总线特定
- 多主控制 每个设备都可以主动发送数据
- 系统的柔软性 没有类似地址的信息,添加设备不改变原来总线的状态
- 通信速度 速度快,距离远
- 错误检测&错误通知&错误恢复功能
- 故障封闭 判断故障类型,并且进行隔离
- 连接节点多 速度与数量找个平衡
CAN应用场景
CAN总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。
CAN的物理层
- CAN使用差分信号进行数据传输,根据CAN_H和CAN_L上的电位差来判断总线电平。
- 总线电平分为显性电平(逻辑0)和隐性电平(逻辑1),二者必居其一。
- 显性电平具有优先权。发送方通过使总线电平发生变化,将消息发送给接收方。
|---------|-----------------------|---------------------------|
| 电平 | 高速CAN | 低速CAN |
| 显性电平(0) | UCAN_H -- UCAN_L= 2V | UCAN_H -- UCAN_L = 3V |
| 隐性电平(1) | UCAN_H -- UCAN_L = 0V | UCAN_H -- UCAN_L = - 1.5V |
CAN的协议层
CAN总线以"帧"形式进行通信。CAN协议定义了5种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用。
|------------------------|---------------------------|
| 帧类型 | 帧作用 |
| 数据帧(Data Frame) | 用于发送单元向接收单元传输数据的帧 |
| 遥控帧(Remote Frame) | 用于接收单元向具有相同ID的发送单元 请求数据的帧 |
| 错误帧(Error Frame) | 用于当检测出错误时向其他单元通知 错误的帧 |
| 过载帧(Overload Frame) | 用于接收单元通知其尚未做好接收准备 的帧 |
| 间隔帧(Inter Frame Space) | 用于将数据帧 及遥控帧与前面的帧 分离开来的帧 |
CAN数据帧介绍
- 帧起始:表示数据帧开始的段,显性信号
- 数据段:数据的内容,一帧可发送0~8字节数据
- 仲裁段:表示该帧优先级的段,优先级
- CRC段:检查帧的传输错误的段
- ACK段:表示确认正常接收的段
- 控制段:表示数据的字节数及保留位的段
- 帧结束:表示数据帧结束的段,7个隐性信号
CAN位时序介绍
CAN总线以"位同步"机制,实现对电平的正确采样。位数据都由四段组成:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每段又由多个位时序Tq组成。
采样点是指读取总线电平,并将读到的电平作为位值的点。
根据位时序,就可以计算CAN通信的波特率。
注意 : 节点监测到总线上信号的跳变在SS段范围内,表示节点与总线的时序是同步,此时采样点的电平即该位的电平。
数据同步过程
CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步。
硬件同步
节点通过CAN总线发送数据,一开始发送帧起始信号。总线上其他节点会检测帧起始信号在不在位数据的SS段内,判断内部时序与总线是否同步。如果起始信号不在SS段内,采样点获取的电平是不正确的,节点会采用硬件同步机制进行调整,把自己的SS段平移到检测到边沿的地方,此时采样点获取的电平是正确的。
再同步
再同步利用普通数据为的边沿信号进行同步。再同步的情况分为两种,边沿信号相对于SS段的位置即超前和滞后。
再同步时,PSB1和PSB2中增加或减少的时间被称为"再同步步长宽度(SJW)",其范围时1-4Tq,限定了SJW的值后,再同步时,不能增加限定长度的SJW值,SJW值较大时,吸收误差的能力更强,但是通信速率会下降。
CAN总线仲裁
当CAN总线处于空闲时,最先开始发送消息的单元获取发送权,当多个单元同时发送时,从报文ID的第一位开始进行仲裁,连续输出显性电平最多的单元可以继续发送,即首先出现隐形电平的单元失去对总线的控制权,变为接收。竞争失败的单元自动检测总线是否空闲,当总线空闲会第一时间再次检测发送。
stm32的CAN控制器
CAN控制器介绍
STM32 CAN控制器(bxCAN),支持CAN 2.0A 和 CAN 2.0B Active版本协议。
CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错误,而CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。CAN 2.0B Passive只能处理标准数据帧且扩展帧的内容会忽略。
bxCAN主要特点:
- 波特率最高可达1M bps
- 支持时间触发通信(CAN的硬件内部定时器可以在TX/RX的帧起始位的采样点位置生成时间戳)
- 具有3级发送邮箱
- 具有3级深度的2个接收FIFO
- 可变的过滤器组(最多28个)
CAN控制器模式
CAN控制器的工作模式有三种:初始化模式、正常模式和睡眠模式。
CAN控制器的测试模式有三种:静默模式、环回模式和环回静默模式,这三种测试模式需要再初始化模式下进行配置。
CAN控制器框图
- CAN内核:包含各种控制/状态/配置寄存器,可以配置模式、波特率等
- 发送邮箱:用来缓存待发送的报文,最多可以缓存3个报文
- 接收FIFO:缓存接收到的有效报文
- 接收过滤器:筛选有效报文
发送处理
发送优先级由邮箱中报文的标识符决定。标识符数值越低有最高优先级。如果标识符值相同,邮箱小的先被发送。
接收处理
有效报文指的是(数据帧直到EOF段的最后一位都没有错误),且通过过滤器组对标识符过滤。
接收过滤器
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。
每个过滤器组都有两个32位寄存器CAN_FxR1和CAN_FxR2。根据过滤器组的工作模式不同(位宽和选择模式),寄存器的作用不尽相同。
位宽可设置32位或16位,寄存器存储的内容就有所区别。
|----------|--------------------------------------|---------------------------------------|
| 过滤器组Reg | 32位 | 16位(寄存器由两部分组成) |
| CAN_FxR1 | STDID[10:0]、EXTID[17:0]、 IDE、RTR | STDID[10:0]、EXTID[17:15]、 IDE、RTR |
| CAN_FxR2 | STDID[10:0]、EXTID[17:0]、 IDE、RTR | STDID[10:0]、EXTID[17:15]、 IDE、RTR |
选择模式可设置屏蔽位模式或标识符列表模式,寄存器内容的功能就有所区别。
屏蔽位模式,可以选择出一组符合条件的报文。寄存器内容功能相当于是否符合条件。
标识符列表模式,可以选择出几个特定ID的报文。寄存器内容功能就是标识符本身。
CAN控制器波特率计算
STM32的CAN外设位时序分为三段:
- 同步段SYNC_SEG
- 时间段1 BS1(PTS +PBS1)
- 时间段2 BS2
波特率=1/(1tq+tq∗(TS1[3:0]+1)+tq∗(TS2[2:0]+1) )