CAN控制内核(CAN2.0B)
bxCAN模块可以完全自动地接收和发送CAN报文;
且完全支持标准标识符(11位)和扩展标识符(29位)。
主控制寄存器(CAN_MCR)
(1) DBF 调试冻结功能
(2) TTCM 时间触发模式
(3) ABOM 自动离线管理
(4) AWUM自动唤醒
(5) NART自动重传
(6) RFLM锁定模式
(7) TXFP报文发送优先级的判定方法
位时序寄存器(CAN_BTR)
(1) 测试模式
① SILM和LBKM寄存器位,配置模式。
② 正常模式
③ 静默模式
④ 回环模式
⑤ 回环静默模式
CAN发送邮箱
共3个发送邮箱
标志符寄存器CAN_TIxR | 存储待发送报文的ID、扩展ID、IDE位及RTR位 |
数据长度控制器CAN_TDxR | 存储发送报文的DLC段 |
低位数据寄存器CAN_TDLxR | 存储发送报文数据段的Data0-Data3这四个字节的内容 |
高位寄存器 CAN_TDHxR | 存储待发送报文数据段的Data4-Data7这四个字节的内容 |
对标识符寄存器 CAN_TIxR 中的发送请求寄存器位 TMIDxR_TXRQ 置 1,即可把数据发送出去。
当报文使用扩展标识符的时候,标识符寄存器 CAN_TIxR 中的 STDID[10:0]等效于 EXTID[18:28]位,它与 EXTID[17:0]共同组成完整的 29 位扩展标识符。
CAN接收FIFO
2个FIFO,每个FIFO中有3个邮箱。可以存储6个报文。
当接收到报文时,FIFO 的报文计数器会自增,
而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,
我们通过状态寄存器可获知报文计数器的值,
通过前面主控制寄存器的 RFLM 位,可设置锁定模式,
锁定模式下 FIFO 溢出时会丢弃新报文,
非锁定模式下 FIFO 溢出时新报文会覆盖旧报文。
标识符寄存器 CAN_RIxR | 存储收到报文的 ID、扩展 ID、IDE 位及 RTR 位 |
数 据 长 度 控 制 寄 存 器CAN_RDTxR | 存储收到报文的 DLC 段 |
低位数据寄存器 CAN_RDLxR | 存储收到报文数据段的 Data0-Data3 这四个字节的内容 |
高位数据寄存器 CAN_RDHxR | 存储收到报文数据段的 Data4-Data7 这四个字节的内容 |
通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到 STM32 的内存中。
CAN的工作模式
初始化模式
配置方式
:::info
进入初始化模式
**
设置CAN_MCR寄存器的INRQ位为’1’,请求bxCAN进入初始化模式,
然后等待硬件对CAN_MSR寄存器的INAK位置’1’来进行确认。
:::
:::info
退出初始化模式
清除CAN_MCR寄存器的INRQ位为’0’,,请求bxCAN退出初始化模式,
当硬件对CAN_MSR寄存器的INAK位清’0’就确认了初始化模式的退出。
:::
:::info
特点:
禁止报文的接收和发送,并且CANTX引脚输出隐性位(高电平)。
不会改变配置寄存器。
:::
正常模式
软件可以通过对CAN_MCR寄存器的INRQ位清’0’,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR寄存器的INAK位置’1’的确认。
在跟CAN总线取得同步,即在CANRX引脚上监测到11个连续的隐性位(等效于总线空闲)后,bxCAN才能正常接收和发送报文。
:::info
特点
正常接收和发送报文。
:::
睡眠模式(低功耗)
进入睡眠模式
软件通过对CAN_MCR寄存器的SLEEP位置’1’,来请求进入这一模式。
软件必须对CAN_MCR寄存器的INRQ位置’1’并且同时对SLEEP位清’0’,才能进入初始化模式。
退出睡眠模式(2种方法)
- 通过软件对SLEEP位清’1’,或硬件检测到CAN总线的活动。
- 如果CAN_MCR寄存器的AWUM位为’1’,一旦检测到CAN总线的活动,硬件就自动对SLEEP位清’0’来唤醒bxCAN。
- 如果CAN_MCR寄存器的AWUM位为’0’,软件必须在唤醒中断里对SLEEP位清’0’才能退出睡眠状态。
当硬件对SLAK位清’0’时,就确认了睡眠模式的退出。
:::info
特点
在该模式下,bxCAN的时钟停止了,但软件仍然可以访问邮箱寄存器。
:::
测试模式
通过对CAN_BTR寄存器的SILM和/或LBKM位置’1’,来选择一种测试模式。
在选择了一种测试模式后,软件需要对CAN_MCR寄存器的INRQ位清’0’,来真正进入测试模式
静默模式
通过对CAN_BTR寄存器的SILM位置’1’,来选择静默模式。
在静默模式下,
:::info
特点
bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。
环回模式
通过对CAN_BTR寄存器的LBKM位置’1’,来选择环回模式。
环回静默模式
通过对CAN_BTR寄存器的LBKM和SILM位同时置’1’,可以选择环回静默模式。
功能特性
发送处理
时间触发通信模式
在该模式下,CAN硬件的内部定时器被激活,并且被用于产生(发送与接收邮箱的)时间戳,分别存储在CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在每个CAN位时间(见22.7.7节)累加。
内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。
接收管理
接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。
:::info
有效报文
报文被正确接收(直到EOF域的最后一位都没有错误),并且通过标志符过滤。
:::
FIFO管理
FIFO从空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号**_1**(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为’01’(二进制01b)。
软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置’1’来释放邮箱,这样FIFO又变为空状态了。如果在释放邮箱的同时,又收到了一个有效的报文,那么FIFO仍然保留在挂号_1状态,软件可以读取FIFO输出邮箱来读出新收到的报文。
溢出
当FIFO处于挂号_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出,并且一个报文会丢失。
此时,硬件对CAN_RFR寄存器的FOVR位进行置’1’来表明溢出情况。
至于哪个报文会被丢弃,取决于对FIFO的设置:
● 如果禁用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的报文就被新报文所覆盖。这样,最新收到的报文不会被丢弃掉。
● 如果启用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的报文就被丢弃,软件可以读到FIFO中最早收到的3个报文。
中断
一旦往FIFO存入一个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位 为’1’,那么就会产生一个中断请求。
当FIFO变满时(即第3个报文被存入),CAN_RFR寄存器的FULL位就被置’1’,并且如果CAN_IER寄存器的FFIE位为’1’,那么就会产生一个满中断请求。
在溢出的情况下,FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位为’1’,那么就会产生一个溢出中断请求。
标志符过滤
总共28组筛选器,一个筛选器中有2个32位的寄存器,CAN1和CAN2共用筛选器。
标识符列表模式
它把要接收报文的 ID 列成一个表,
要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
掩码模式
它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。
通过配置筛选模式寄存器 CAN_FM1R 的 FBMx 位可以设置筛选器工作在哪个模式。
过滤器优先级规则
根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存
放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:
● 位宽为32位的过滤器,优先级高于位宽为16位的过滤器
● 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
● 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高
波特率的设置
STM32 的 CAN 外设位时序中只包含 3 段,
分别是
- 同步段 SYNC_SEG
- 位段 BS1
- 位段 BS2
采样点位于 BS1 、 BS2 段的交界处。
同步段 | 1Tq |
---|---|
BS1段 | TS1=Tq x (TS1[3:0] + 1) |
BS2段 | TS2= Tq x (TS2[2:0] + 1) |
一个数据位:
PCLK 指 APB1 时钟
最终可以计算出 CAN 通讯的波特率:
BaudRate = 1/N Tq