STM32_CAN架构.xmind

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’,来真正进入测试模式
image.png

静默模式

通过对CAN_BTR寄存器的SILM位置’1’,来选择静默模式。

在静默模式下, :::info 特点
bxCAN可以正常地接收数据帧和远程帧,但只能发出隐性位,而不能真正发送报文。

:::

环回模式

通过对CAN_BTR寄存器的LBKM位置’1’,来选择环回模式。

环回静默模式

通过对CAN_BTR寄存器的LBKM和SILM位同时置’1’,可以选择环回静默模式。

功能特性

发送处理

外设_CAN - 图2image.png

时间触发通信模式

在该模式下,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 位可以设置筛选器工作在哪个模式。

image.png

image.png
过滤器优先级规则
根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存
放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:
● 位宽为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)



一个数据位:外设_CAN - 图6

外设_CAN - 图7

PCLK 指 APB1 时钟

最终可以计算出 CAN 通讯的波特率:
BaudRate = 1/N Tq