《STM32从零开始学习历程》@EnzoReventon
相关链接:
《STM32从零开始学习历程》——CAN通讯协议物理层
CAN-bus规范 V2.0版本
CAN总线入门
周立功-CAN协议中文版
参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
CAN-bus规范 V2.0版本
CAN总线入门
周立功-CAN协议中文版
① CAN控制内核:继承了许多收发相关的寄存器。
② CAN发送邮箱:有三个发送邮箱,可以将报文存储于邮箱之中,根据需要或者总线空闲时将报文发送出去。
③ CAN接收FIFO:2个深度为3级的FIFO。
④ 验收筛选器:根据ID号对报文进行筛选,将筛选出来的报文存储到FIFO中。
⑤ CAN2整体控制逻辑:从设备,STM32中有两组CAN控制器,CAN2无法直接使用,如果要时钟需要闲时能CAN1的时钟
===========位 31:17 保留,必须保持复位值。
============位 16 DBF:调试冻结 (Debug freeze)
0:调试期间 CAN 处于工作状态。
1:调试期间 CAN 处于接收/发送冻结状态。接收 FIFO 仍可正常访问/控制。
============位 15 RESET:bxCAN 软件主复位 (bxCAN software master reset)
0:正常工作。
1:强制 bxCAN 进行主复位 -> 复位后激活睡眠模式(FMP 位和 CAN_MCR 寄存器初始化
为复位值)。此位自动复位为 0。
============位 14:8 保留,必须保持复位值。
============位 7 TTCM:时间触发通信模式 (Time triggered communication mode)
0:禁止时间触发通信模式。
1:使能时间触发通信模式。
注意: 有关时间触发通信模式的更多信息,请参见第 24.7.2 节:时间触发通信模式。
============位 6 ABOM:自动的总线关闭管理 (Automatic bus-off management)
此位控制 CAN 硬件在退出总线关闭状态时的行为。
0:在软件发出请求后,一旦监测到 128 次连续 11 个隐性位,并且软件将 CAN_MCR 寄存
器的 INRQ 位先置 1 再清零,即退出总线关闭状态。
1:一旦监测到 128 次连续 11 个隐性位,即通过硬件自动退出总线关闭状态。
有关总线关闭状态的详细信息,请参见第 24.7.6 节:错误管理。
============位 5 AWUM:自动唤醒模式 (Automatic wakeup mode)
此位控制 CAN 硬件在睡眠模式下接收到消息时的行为。
0:在软件通过将 CAN_MCR 寄存器的 SLEEP 位清零发出请求后,退出睡眠模式。
1:一旦监测到 CAN 消息,即通过硬件自动退出睡眠模式。
CAN_MCR 寄存器的 SLEEP 位和 CAN_MCR 寄存器的 SLAK 位由硬件清零。
============位 4 NART:禁止自动重发送 (No automatic retransmission)
0:CAN 硬件将自动重发送消息,直到根据 CAN 标准消息发送成功。
1:无论发送结果如何(成功、错误或仲裁丢失),消息均只发送一次。
============位 3 RFLM:接收 FIFO 锁定模式 (Receive FIFO locked mode)
0:接收 FIFO 上溢后不锁定。接收 FIFO 装满后,下一条传入消息将覆盖前一条消息。
1:接收 FIFO 上溢后锁定。接收 FIFO 装满后,下一条传入消息将被丢弃。
============位 2 TXFP:发送 FIFO 优先级 (Transmit FIFO priority)
此位用于控制在几个邮箱同时挂起时的发送顺序。
0:优先级由消息标识符确定
1:优先级由请求顺序(时间顺序)确定
============位 1 SLEEP:睡眠模式请求 (Sleep mode request)
此位由软件置 1,用于请求 CAN 硬件进入睡眠模式。一旦当前 CAN 活动(发送或接收 CAN帧)结束,即进入睡眠模式。
此位由软件清零时,将退出睡眠模式。
当 AWUM 位置 1 以及在 CAN RX 信号上检测到 SOF 位时,硬件即将此位清零。
复位后,此位将置 1 - CAN 启动睡眠模式。
============位 0 INRQ:初始化请求 (Initialization request)
软件通过将此位清零,来将硬件切换到正常模式。一旦在 Rx 信号上监测到连续 11 个隐性位,CAN 硬件即完成同步并准备进行发送和接收。硬件通过将 CAN_MSR 寄存器的 INAK位清零来指示此事件。
软件通过将此位置 1 来请求 CAN 硬件进入初始化模式。一旦软件将 INRQ 位置 1,CAN 硬件将等待当前 CAN 活动(发送或接收)结束,然后进入初始化模式。硬件通过将 CAN_MSR寄存器的 INAK 位置 1 来指示此事件。
《STM32中文参考手册》
框图中标号①处的CAN控制内核包含了各种控制寄存器及状态寄存器,我们主要讲解其中的主控制寄存器CAN_MCR及位时序寄存器CAN_BTR。
主控制寄存器CAN_MCR负责管理CAN的工作模式,它使用以下寄存器位实现控制。
– DBF 调试冻结功能
DBF(Debug freeze)调试冻结,使用它可设置CAN处于 工作状态 或 禁止收发 的状态,禁止收发时仍可访问接收FIFO中的数据。这两种状态是当STM32芯片处于程序调试模式时才使用的,平时使用并不影响。
– TTCM 时间触发模式
TTCM(Time triggered communication mode)时间触发模式,它用于配置CAN的时间触发通信模式,在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR、CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用它可以实现ISO 11898-4 CAN标准的分时同步通信功能。在本文及本实验中不使用。
– AWUM 自动唤醒
AWUM(Automatic bus-off management),自动唤醒功能,CAN外设可以使用软件进入低功耗的睡眠模式,如果使能了这个自动唤醒功能,当CAN检测到总线活动的时候,会自动唤醒。
– NART 自动重传
NART(No automatic retransmission)报文自动重传功能,设置这个功能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,无论发送结果如何,消息只发送一次。
– RFLM 锁定模式
RFLM(Receive FIFO locked mode)FIFO锁定模式,该功能用于锁定接收FIFO。锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文会覆盖原报文。
– TXFP 报文发送优先级的判定方法
TXFP(Transmit FIFO priority)报文发送优先级的判定方法,当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID 优先级 还是报文存进邮箱的顺序来发送。
为方便调试,STM32的CAN提供了测试模式,配置位时序寄存器CAN_BTR的SILM及LBKM寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式。
正常模式
正常模式下就是一个正常的CAN节点,可以向总线发送数据和接收数据。
静默模式
静默模式下,它自己的输出端的逻辑0数据会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。
回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。
回环静默模式
回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。
STM32外设定义的位时序与前面解释的CAN标准时序有一点区别:
举个例子:
我们要把波特率配置成1Mbps:
参数 | 说明 |
---|---|
SYNC_SE段 | 固定为1Tq |
BS1段 | 设置为4Tq (实际写入TS1[3:0]的值为3) |
BS2段 | 设置为2Tq (实际写入TS2[2:0]的值为1) |
T_PCLK | APB1按默认配置为F=42MHz,TPCLK=1/42M |
CAN外设时钟分频 | 设置为6分频(实际写入BRP[9:0]的值为5) |
1Tq时间长度 | Tq = (BRP[9:0]+1) x TPCLK = 6 x 1/42M=1/7M |
1位的时间长度 | T1bit =1Tq+T_S1+T_S2 = 1+4+2 = 7Tq |
波特率 | BaudRate = 1/N Tq = 1/(1/7M x 7)=1Mbps |
CAN外设一共有3个发送邮箱,即最多可以缓存3个待发送的报文。
每个发送邮箱中包含有标识符寄存器CAN_TIxR、数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR、CAN_TDHxR,它们的功能如下:
寄存器名 | 功能 |
---|---|
标识符寄存器CAN_TIxR | 存储待发送报文的ID、扩展ID、IDE位及RTR位 |
数据长度控制寄存器CAN_TDTxR | 存储待发送报文的DLC段 |
低位数据寄存器CAN_TDLxR | 存储待发送报文数据段的Data0-Data3这四个字节的内容 |
高位数据寄存器CAN_TDHxR | 存储待发送报文数据段的Data4-Data7这四个字节的内容 |
当要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去。
其中标识符寄存器CAN_TIxR中的STDID寄存器位比较特别。CAN的标准标识符的总位数为11位,而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它与EXTID[17:0]共同组成完整的29位扩展标识符。
CAN外设一共有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文。当接收到报文时,FIFO的报文计数器会自增,而STM32内部读取FIFO数据之后,报文计数器会自减,通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的RFLM位,可设置锁定模式,锁定模式下FIFO溢出时会丢弃新报文,非锁定模式下FIFO溢出时新报文会覆盖旧报文。
跟发送邮箱类似,每个接收FIFO中包含有标识符寄存器CAN_RIxR、数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR、CAN_RDHxR,其功能如下:
寄存器名 | 功能 |
---|---|
标识符寄存器CAN_RIxR | 存储收到报文的ID、扩展ID、IDE位及RTR位 |
数据长度控制寄存器CAN_RDTxR | 存储收到报文的DLC段 |
低位数据寄存器CAN_RDLxR | 存储收到报文数据段的Data0-Data3这四个字节的内容高 |
高位数据寄存器CAN_RDHxR | 存储收到报文数据段的Data4-Data7这四个字节的内容 |
每组筛选器包含2个32位的寄存器,分别为CAN_FxR1和CAN_FxR2,它们用来存储要筛选的ID或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明如下:
模式 | 说明 |
---|---|
32位掩码模式 | CAN_FxR1存储ID,CAN_FxR2存储哪个位必须要与CAN_FxR1中的ID一致,2个寄存器表示1组掩码。 |
32位标识符模式 | CAN_FxR1和CAN_FxR2各存储1个ID,2个寄存器表示2个筛选的ID |
16位掩码模式 | CAN_FxR1高16位存储ID,低16位存储哪个位必须要与高16位的ID一致; CAN_FxR2高16位存储ID,低16位存储哪个位必须要与高16位的ID一致2个寄存器表示2组掩码。16位 |
16位标识符模式 | CAN_FxR1和CAN_FxR2各存储2个ID,2个寄存器表示4个筛选的ID |
ID | 1 | 0 | 1 | 1 | 1 | 0 | 1 | …… |
---|---|---|---|---|---|---|---|---|
掩码 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | …… |
筛选ID | 1 | 0 | 1 | x | x | 0 | x | …… |
CAN2外设的结构与CAN1外设是一样的,它们共用筛选器,且由于存储访问控制器由CAN1控制,所以要使用CAN2的时候必须要使能CAN1的时钟。