CAN学习笔记(2)

笔者学习主要根据野火的学习资料,还有些是正点原子和网上查找的,自己略微整理了下,作为自己的学习记录,也供大家学习指教

一、STM32 的 CAN 外设简介

​ STM32自带的是bxCAN,即基本扩展CAN(Basic Extended CAN),它支持CAN协议2.0A和2.0B。它的设计目标是以最小的CPU负荷来高效处理大量收到的报文。

​ STM32的bxCAN的主要特点有:

  1. 支持CAN协议2.0A和2.0B主动模式;
  2. 波特率最高达1Mbps;
  3. 支持时间触发通信;
  4. 具有三个发送邮箱;
  5. 具有3级深度的2个接收FIFO;
  6. 可变的过滤器组(最多28个)。

二、STM32 的 CAN 架构剖析

CAN学习笔记(2)_第1张图片

图1 STM32 的 CAN 外设架构图(互联型产品)

​ 如图1所示,在互联型产品中,共有 2 组 CAN控制器,每组CAN控制器包含了CAN控制内核、发送邮箱和接收FIFO。其中验收筛选器为两组CAN控制共用。同时,作为主设备的CAN1,框图中的“存储访问控制器”是由 CAN1 控制的,CAN2无法直接访问存储区域,所以使用 CAN2 的时候必须使能 CAN1 外设的时钟。如果实际产品只有一组CAN控制,那么也就没有序号⑤的这个部分。

1.CAN 控制内核

​ CAN控制内核就是图1框图中的序号①所框选的部分,其中最主要的就是主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR

(1)主控制寄存器 CAN_MCR

​ 主控制寄存器 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 标准的分时同步通信功能。

③ABOM 自动离线管理

ABOM(Automatic bus-off management) 自动离线管理,它用于设置是否使用自动离线管理功能。当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,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 优先级还是报文存进邮箱的顺序来发送。

(2)位时序寄存器(CAN_BTR)及波特率

​ CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。

​ 为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTRSILMLBKM 寄存器位可以控制使用正常模式静默模式回环模式静默回环模式,见图2。

CAN学习笔记(2)_第2张图片

​ 图2 四种工作模式

​ 各个工作模式介绍如下:

① 正常模式

​ 正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。

② 静默模式

​ 静默模式下,它自己的输出端的逻辑 0 数据会直接传输到它自己的输入端,逻辑 1 可以被发送到总线,所以它不能向总线发送显性位(逻辑 0),只能发送隐性位(逻辑 1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。

③ 回环模式

​ 回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。

④回环静默模式

​ 回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。

​ 以上说的各个模式,是不需要修改硬件接线的,例如,当输出直接连输入时,它是在STM32 芯片内部连接的,传输路径不经过 STM32 的 CAN_Tx/Rx 引脚,更不经过外部连接的 CAN 收发器,只有输出数据到总线或从总线接收的情况下才会经过 CAN_Tx/Rx 引脚和收发器。

(3) 位时序及波特率

​ STM32 外设定义的位时序与 CAN 标准时序不同,少了一个PTS 段(PROP SEG),详细见图3。

CAN学习笔记(2)_第3张图片

图3 STM32 中 CAN 的位时序

​ STM32 的 CAN 外设位时序中只包含 3 段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采样点位于 BS1BS2 段的交界处。其中 SYNC_SEG 段固定长度为 1Tq,而BS1BS2 段可以在位时序寄存器 CAN_BTR 设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度 SJW 也可在位时序寄存器中配置。其中, BS1段可以理解为CAN 标准协议中 PTS 段PBS1 段合在一起的,而 BS2 段就相当于 PBS2 段

​ 通过配置位时序寄存器 CAN_BTR 的**TS1[3:0]**及 **TS2[2:0]**寄存器位设定 BS1BS2 段的长度后,我们就可以确定每个 CAN 数据位的时间:

​ BS1 段时间:
T S 1 = T q × ( T S 1 [ 3 : 0 ] + 1 ) TS1=Tq × (TS1[3:0] + 1) TS1=Tq×(TS1[3:0]+1)
​ BS2 段时间:
T S 2 = T q × ( T S 2 [ 2 : 0 ] + 1 ) TS2=Tq × (TS2[2:0] + 1) TS2=Tq×(TS2[2:0]+1)
​ 一个数据位的时间:
$$
T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq

​ 其 中 单 个 时 间 片 的 长 度 ∗ ∗ T q ∗ ∗ 与 C A N 外 设 的 所 挂 载 的 时 钟 总 线 及 分 频 器 配 置 有 关 , C A N 1 和 C A N 2 外 设 都 是 挂 载 在 ∗ ∗ A P B 1 总 线 ∗ ∗ 上 的 , 而 位 时 序 寄 存 器 ∗ ∗ C A N B T R ∗ ∗ 中 的 ∗ ∗ B R P [ 9 : 0 ] ∗ ∗ 寄 存 器 位 可 以 设 置 C A N 外 设 时 钟 的 分 频 值 , 所 以 : ​ 其中单个时间片的长度 **Tq** 与 CAN 外设的所挂载的时钟总线及分频器配置有关,CAN1 和 CAN2 外设都是挂载在 **APB1 总线**上的,而位时序寄存器 **CAN_BTR** 中的 **BRP[9:0]**寄存器位可以设置 CAN 外设时钟的分频值 ,所以: TqCAN线CAN1CAN2APB1线CANBTRBRP[9:0]CAN
Tq = (BRP[9:0]+1) × TPCLK
$$
​ 其中的 PCLKAPB1 时钟

​ 最终可以计算出 CAN 通讯的波特率:
B a u d R a t e = 1 / N T q BaudRate = 1/N Tq BaudRate=1/NTq
​ 以1Mbps为例,详细配置数据如表1所示。

表1 一种配置波特率为 1Mbps 的方式

参数 说明
SYNC_SE 段 固定为 1Tq
BS1 段 设置为 5Tq (实际写入 TS1[3:0]的值为 4)
BS2 段 设置为 3Tq (实际写入 TS2[2:0]的值为 2)
TPCLK APB1 按默认配置为 F=36MHz,TPCLK=1/36M
CAN 外设时钟分频 设置为 4 分频(实际写入 BRP[9:0]的值为 3)
1Tq 时间长度 Tq = (BRP[9:0]+1) x TPCLK =4 x 1/36M=1/9M
1 位的时间长度 T1bit =1Tq+TS1+TS2=1+5+3 = 9Tq
波特率 BaudRate = 1/N Tq=1/(1/9M x 9)=1Mbps
(4) CAN发送邮箱

​ 如图1CAN 外设架构图(互联型产品)所示,一个CAN控制器共有三个发送邮箱,即最多可以缓存 3 个待发送的报文。

​ 每个发送邮箱中包含有标识符寄存器 CAN_TIxR、数据长度控制寄存器 CAN_TDTxR及 2 个数据寄存器 CAN_TDLxRCAN_TDHxR,它们的功能见表 2。

表2 发送邮箱的寄存器

寄存器名 功能
标识符寄存器 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 位扩展标识符。

(5)CAN 接收 FIFO

​ 如图1CAN 外设架构图(互联型产品)所示,一个CAN控制器有 2 个接收 FIFO,每个 FIFO 中有 3 个邮箱,即最多可以缓存 6 个接收到的报文。当接收到报文时,FIFO 的报文计数器会自增,而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的 RFLM 位,可设置锁定模式,锁定模式下 FIFO 溢出时会丢弃新报文,非锁定模式下 FIFO 溢出时新报文会覆盖旧报文。跟发送邮箱类似,每个接收 FIFO 中包含有标识符寄存器 CAN_RIxR、数据长度控制寄存器 CAN_RDTxR 及 2 个数据寄存器 CAN_RDLxRCAN_RDHxR,它们的功能见表3。

表3 接收 FIFO的寄存器

寄存器名 功能
标识符寄存器 CAN_TIxR 存储待发送报文的 ID、扩展 ID、IDE 位及 RTR 位
数 据 长 度 控 制 寄 存 器CAN_TDTxR 存储待发送报文的 DLC 段
低位数据寄存器 CAN_TDLxR 存储待发送报文数据段的 Data0-Data3 这四个字节的内容
高位数据寄存器 CAN_TDHxR 存储待发送报文数据段的 Data4-Data7 这四个字节的内容

​ 通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到 STM32 的内存中。

(6)验收筛选器

​ 如图1CAN 外设架构图(互联型产品)所示,一个CAN 外设的验收筛选器,共有最多一共有 28 个筛选器组,每个筛选器组有 2 个寄存器,CAN1 和 CAN2 共用的筛选器的。其中STM32F103 系列芯片仅有 14 个筛选器组:0-13 号。

​ 在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作,STM32 的 CAN 外设接收报文前会先使用验收筛选器检查,只接收需要的报文到 FIFO 中。筛选器工作的时候,可以调整筛选 ID 的长度及过滤模式。根据筛选 ID 长度来分类有有以下两种:

​ ① 检查 STDID[10:0]EXTID[17:0]IDERTR 位,一共 31 位。

​ ② 检查 STDID[10:0]RTRIDEEXTID[17:15],一共 16 位。

​ 通过配置筛选尺度寄存器 CAN_FS1RFSCx 位可以设置筛选器工作在哪个尺度。

​ 而根据过滤的方法分为以下两种模式:

​ (1) 标识符列表模式,它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。

​ (2) 掩码模式,它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO

​ 通过配置筛选模式寄存器 CAN_FM1RFBMx 位可以设置筛选器工作在哪个模式。

​ 不同的尺度和不同的过滤方法可使筛选器工作在图4 的 4 种状态。

CAN学习笔记(2)_第4张图片

图4 筛选器的 4 种工作状态

​ 每组筛选器包含 2 个 32 位的寄存器,分别为 CAN_FxR1 和 CAN_FxR2,它们用来存储要筛选的 ID 或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明见表 4。

表4 筛选器的工作状态说明

寄存器名 功能
32位掩码模式 CAN_FxR1 存储 ID,CAN_FxR2 存储哪个位必须要与 CAN_FxR1 中 存储待发送报文的 DLC 段的 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位标识符模式 CAN_FxR1 和 CAN_FxR2 各存储 2 个 ID,2 个寄存器表示 4 个筛选的ID.

​ 例如下面的表格所示,在掩码模式时,第一个寄存器存储要筛选的 ID,第二个寄存器存储掩码,掩码为 1 的部分表示该位必须与 ID 中的内容一致,筛选的结果为表中第三行的ID 值,它是一组包含多个的 ID 值,其中 x 表示该位可以为 1 可以为 0。

表5 范例

ID 1 0 1 1 1 0 1
掩码 1 1 1 0 0 1 0
筛选的ID 1 0 1 X X 0 X

​ 而工作在标识符模式时,2 个寄存器存储的都是要筛选的 ID,它只包含 2 个要筛选的ID 值(32 位模式时)。

​ 如果使能了筛选器,且报文的 ID 与所有筛选器的配置都不匹配,CAN 外设会丢弃该报文,不存入接收 FIFO。

| 1    | 0    | ...  |

| 筛选的ID | 1 | 0 | 1 | X | X | 0 | X | … |

​ 而工作在标识符模式时,2 个寄存器存储的都是要筛选的 ID,它只包含 2 个要筛选的ID 值(32 位模式时)。

​ 如果使能了筛选器,且报文的 ID 与所有筛选器的配置都不匹配,CAN 外设会丢弃该报文,不存入接收 FIFO。

你可能感兴趣的:(通讯,can)