CAN笔记(13) STM32-M4 bxCAN
- 1. STM32-M4
- 2. bxCAN特点
- 3. CAN 控制器
- 4. 滤波器
- 5. 发送流程
- 6. 接收流程
- 7. 位时间特性
1. STM32-M4
手头上有一块STM32F429IGT6,以此为例
STM32F429 自带的是 bxCAN,即基本扩展 CAN,它支持 CAN 协议 2.0A 和 2.0B
设计目标:以最小的 CPU 负荷来高效处理大量收到的报文
它也支持报文发送的优先级要求
对于安全紧要的应用, bxCAN 提供所有支持时间触发通信模式所需的硬件功能
2. bxCAN特点
STM32F429 的 bxCAN 的主要特点有:
- 支持 CAN 协议 2.0A 和 2.0B 主动模式
- 波特率最高达 1Mbps
- 支持时间触发通信
- 具有 3 个发送邮箱
- 具有 3 级深度的 2 个接收 FIFO
- 可变的过滤器组( 28 个, CAN1 和 CAN2 共享)
3. CAN 控制器
在 STM32F429IGT6 中,带有 2 个 CAN 控制器,现在只用了CAN1
双 CAN 的框图:
从图中可以看出两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO
但是,共用 28 个滤波器
可通过写入CAN_FMR
寄存器中的CAN 2SB
[5:0]位来配置 CAN2起始筛选器存储区编号n
4. 滤波器
通过 CAN_FMR
寄存器的设置,可以设置滤波器的分配方式
STM32F429 的标识符过滤是一个比较复杂的东东,它的存在减少了 CPU 处理 CAN 通信的开销STM32F429 的过滤器组最多有 28 个,每个滤波器组由 2 个 32 为寄存器
CAN_FxR1
和 CAN_FxR2
组成
STM32F429 每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求
根据 位宽的不同,每个过滤器组可提供:
- 1 个 32 位过滤器,包括: STDID[10:0]、 EXTID[17:0]、 IDE 和 RTR 位
- 2 个 16 位过滤器,包括: STDID[10:0]、 IDE、 RTR 和 EXTID[17:15]位
此外过滤器可配置为:
- 标识符屏蔽模式
标识符寄存器和屏蔽寄存器一起,指定报文标识符的 任何一位
屏蔽位寄存器的bit15
= 1,标识符寄存器的bit15
= 0,那么接受标识符的bit15
= 0才可能被接受
屏蔽位寄存器的bit15
= 0,接受标识符的bit15
无论为什么值,bit15
都能匹配通过
应该按照“必须匹配”或“不用关心”处理 - 标识符列表模式
屏蔽寄存器也被当作标识符寄存器用,即使用 2 个标识符寄存器
接收报文标识符的 每一位都必须 跟过滤器标识符相同
那么,
为了过滤出 一组标识符,应该设置过滤器组工作在 标识符屏蔽模式
为了过滤出 一个标识符,应该设置过滤器组工作在 标识符列表模式
应用程序不用的过滤器组,应该保持在禁用状态
举个简单的例子,设置过滤器组 0 工作在:
- 1 个 32 位过滤器-标识符屏蔽模式
那么就需要设置FSC0
= 1,FBM0
= 0 - 希望收到的 ID( STID+EXTID+IDE+RTR)是:
0XFFxx00xx
( x 表示不关心)
那么就需要设置CAN_F0R1
=0XFFFF0000
,CAN_F0R2
=0XFF00FF00
收到的 ID其位[31:24]和位[15:8]这 16 个位的必须和CAN_F0R1
中对应的位一模一样
而另外的 16 个位则不关心,可以一样,也可以不一样,都认为是正确的 ID
当然,最好是收到的 ID =0XFFFF0000
啦!
5. 发送流程
CAN 发送流程为:
- 程序选择 1 个空置的邮箱(
TME
= 1) - 设置标识符( ID)、数据长度和发送的数据
- 设置
CAN_TIxR
的TXRQ
位为 1,请求发送 - 邮箱挂号(等待成为最高优先级)
- 预定发送(等待总线空闲)
- 发送
- 邮箱空置
整个流程如图:
上图中,还包含了很多其他处理:
强制终止发送(ABRQ
= 1)和 发送失败处理(禁止自动重传模式NART
)等
6. 接收流程
CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO 中
FIFO 完全由硬件来管理,从而节省了 CPU 的处理负荷
简化了软件并保证了数据的一致性
应用程序只能通过读取 FIFO输出邮箱,来读取 FIFO 中 最先收到的报文
这里的有效报文是指那些正确被接收的(直到 EOF 都没有错误)且通过了标识符过滤的报文
前面了解到 CAN 的接收有 2 个 FIFO,每个滤波器组都可以设置其关联的 FIFO
通过 CAN_FFA1R
的设置, 可以将 滤波器组 关联到 FIFO 0/1
CAN 接收流程为:
- FIFO 空
- 收到有效报文
- 挂号_1(存入 FIFO 的一个邮箱,这个由硬件控制,不需要理会)
- 收到有效报文
- 挂号_2
- 收到有效报文
- 挂号_3
- 收到有效报文
- 溢出
这个流程里面,没有考虑从 FIFO 读出报文的情况
实际情况是:
必须在 FIFO 溢出之前,读出至少 1 个报文
否则下个报文到来,将导致 FIFO 溢出,FOVR
= 1,从而出现报文丢失
每读出 1 个报文,相应的挂号就减 1,直到 FIFO 空
整个流程如图:
在接收到一个报文后,就可以访问接收FIFO的输出邮箱来读取它
一旦软件处理了报文,就应该令CAN_RFxR
寄存器的RFOM
位 = 1,来释放该报文
FIFO 接收到的报文数,可以通过查询 CAN_RFxR
的 FMP
寄存器来得到
只要 FMP
不为 0,就可以从 FIFO 读出收到的报文
7. 位时间特性
STM32F429 的 CAN 位时间特性和 CAN笔记(11) 位时序 介绍的,稍有点区别
STM32F429 把 传播时间段(PTS)和相位缓冲段 1(PBS1)合并成了 时间段 1( BS1)
所以 STM32F429 的 CAN 一个位只有 3 段:
- 同步段(SYNC_SEG)
- 时间段 1(BS1)
- 时间段 2(BS2)
STM32F429 的 BS1 段可以设置为 1~16 个时间单元
刚好等于 传播时间段(1-8Tq)和 相位缓冲段 1 (1-8Tq)之和
STM32F429 的 CAN 位时序如图:
图中还给出了 CAN 波特率的计算公式
只需要知道 BS1 和 BS2 的设置,以及 APB1的时钟频率(一般为 45Mhz)
就可以方便的计算出波特率
比如设置 TS1=9、 TS2=5 和 BRP=6,在 APB1 频率为 45Mhz 的条件下
即可得到 CAN 通信的波特率=45000/[(5+9+1)*6]=500Kbps
参考:
《STM32 CAN控制器原理与配置-M4》
相关推荐:
CAN笔记(12) 同步
CAN笔记(11) 位时序
CAN笔记(10) 错误种类和输出
CAN笔记(9) 位填充
CAN笔记(8) 优先级
谢谢!