Lazy loaded image
CAN 通讯配置 STM32
Words 3724Read Time≈ 10 min
2024-12-23

二、STM32 CAN 外设简介

notion image
notion image

2.1 CAN 控制和状态寄存器

CAN 主控制寄存器(CAN_MCR)

notion image
  1. TTCM (Time triggered communication mode) :配置CAN时间触发模式。开启后,CAN 硬件的内部计数器激活,用于为接收和发送邮箱生成时间戳值,这些值分别存储在 CAN_RDTxR/CAN_TDTxR 寄存器中;
  1. ABOM (Automatic bus-off management):配置自动离线管理功能。开启后,当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN 不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。
  1. AWUM (Automatic bus-off management):配置自动唤醒功能。开启后,CAN 外设可以使用软件进入低功耗的睡眠模式,如果使能了这个自动唤醒功能,当 CAN 检测到总线活动的时候,会自动唤醒。
  1. NART(No automatic retransmission) :配置报文自动重传功能。开启后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,无论发送结果如何,消息只发送一次。
  1. RFLM(Receive FIFO locked mode):配置FIFO 锁定模式。开启后,该功能用于锁定接收 FIFO 。锁定后,当接收 FIFO 溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文会覆盖原报文。
  1. TXFP(Transmit FIFO priority) :配置报文发送优先级的判定方法。开启后,当 CAN 外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的 ID 优先级还是报文存进邮箱的顺序来发送。
  1. SLEEP(Sleep mode request):配置CAN硬件进入睡眠模式。开启后,一旦当前 CAN 活动(发送或接收 CAN帧)结束,即进入睡眠模式。此位由软件置一清零。
  1. INRQ(Initialization request):配置初始化请求。软件通过将此位清零,来将硬件切换到正常模式。
    1. 一旦在 Rx 信号上监测到连续 11 个隐性位,CAN 硬件即完成同步并准备进行发送和接收。硬件通过将 CAN_MSR 寄存器的 INAK位清零来指示此事件。
    2. 软件通过将此位置 1 来请求 CAN 硬件进入初始化模式。一旦软件将 INRQ 位置 1,CAN 硬件将等待当前 CAN 活动(发送或接收)结束,然后进入初始化模式。
    3. 硬件通过将 CAN_MSR寄存器的 INAK 位置 1 来指示此事件。

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

CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。
notion image
  1. 测试模式:为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR 的 SILM及 LBKM寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式。
    1. notion image
      • 静默模式:只可发送的隐性位(逻辑 1))不会强制影响总线的状态。可以用于分析总线上的流量。
      • 回环模式:输出端内容既传输到输入端,也传输到总线。输入端只接收发送端内容,不接收来自总线内容。使用回环模式可以进行自检。
      • 回环静默模式:自检时不干扰总线。
  1. 位时序
    1. STM32 中 CAN 的位时序
      STM32 中 CAN 的位时序
      • STM32 的 CAN 外设位时序中只包含 3 段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采样点位于 BS1 及 BS2 段的交界处。其中 SYNC_SEG 段固定长度为 1Tq,而 BS1 及 BS2 段可以在位时序寄存器 CAN_BTR 设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度SJW 也可在位时序寄存器中配置;
      • STM32位时序定义与CAN标准时序有一点区别:理解 STM32 的 CAN 外设的位时序时,可以把它的 BS1 段理解为是由前面介绍的 CAN 标准协议中 PTS 段与 PBS1 段合在一起的,而 BS2 段就相当于 PBS2 段;
      • 位时序寄存器 CAN_BTR 的 TS1[3:0] 设定 BS1 长度,TS2[2:0] 设定 BS2 长度;
  1. 波特率配置方式
    1. BS1 段时间:;
    2. BS2 段时间:;
    3. 一个数据位的时间:;
    4. 单个时间片的长度 与 CAN 外设的所挂载的时钟总线及分频器配置有关,CAN1 和 CAN2外设都是挂载在 APB1 总线上的,而位时序寄存器 CAN_BTR 中的 BRP[9:0] 寄存器位可以设置 CAN 外设时钟的分频值 ;PCLK 指 APB1 时钟,默认值为 42MHz。
    5. 最终CAN 通讯波特率:。
    6. 举例:
      参数
      说明
      SYNC_SE 段
      固定为 1Tq
      BS1 段
      设置为 4Tq(实际写入 TS1[3:0] 的值为 3)
      BS2 段
      设置为 2Tq(实际写入 TS2[2:0] 的值为 1)
      T_PCLK
      APB1 按默认配置为 F=42MHz,T_PCLK=1/42M
      CAN 外设时钟分频
      设置为 6 分频(实际写入 BRP[9:0] 的值为 5)
      1Tq 时间长度
      Tq = (BRP[9:0]+1) × T_PCLK = 6 × 1/42M = 1/7M
      1 位的时间长度
      T_bit = 1Tq + TS1 + TS2 = 1 + 4 + 2 = 7Tq
      波特率
      BaudRate = 1/N × Tq = 1/(1/7M × 7) = 1Mbps

2.2 CAN 邮箱寄存器

针对 STM32F4xx,发送邮箱共有 3 个,接收邮箱共有 2 个。每个接收邮箱允许访问一个深度为 3 级的 FIFO,访问仅限于 FIFO 中最早接收到的消息。
每个邮箱由 4 个寄存器组成。
notion image
 

发送邮箱

寄存器名
功能
标识符寄存器 CAN_TIxR
存储待发送报文的 ID,扩展 ID、IDE 位及 RTR 位
数据长度控制寄存器 CAN_TDTxR
存储待发送报文的 DLC 段
低位数据寄存器 CAN_TDLxR
存储待发送报文数据段的 Data0-Data3 这四个字节的内容
高位数据寄存器 CAN_TDHxR
存储待发送报文数据段的 Data4-Data7 这四个字节的内容
notion image
  • STID[10:0]/EXID[28:18]:标准标识符或扩展标识符 (Standard identifier or extended identifier)
    • 标准标识符,共 11 位。
    • 扩展标识符的 MSB,高 11 位( IDE 为1时)。
  • EXID[17:0]:扩展标识符 (Extended identifier),18位,加 EXID[28:18] 为 29 位。
  • IDE:标识符扩展 (Identifier extension),置1,代表为拓展标志符。
  • RTR:远程发送请求 (Remote transmission request),置1,代表为遥控帧。
  • TXRQ:发送邮箱请求 (Transmit mailbox request),置1,发送相应邮箱内容。
notion image
  • TIME[15:0]:消息时间戳 (Message time stamp) 此字段包含在进行 SOF 发送时所捕获的 16 位定时器值。
  • TGT:发送全局时间 (Transmit global time),只有硬件处于时间触发通信模式,此位才会激活。该位为0,不发送时间戳,该位为1,在 8 字节消息的最后两个数据字节中发送时间戳。
  • DLC[3:0]:数据长度代码 (Data length code)
notion image
 
notion image

接收邮箱

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 这四个字节的内容
其中CAN_RIxR、CAN_RDLxR、CAN_RDHxR与发送邮箱基本类似,具体可以参考RM0090相关章节。这里特别说明一下CAN_RDTxR寄存器。
notion image
  • FMI[7:0]:筛选器匹配索引 (Filter match index)该寄存器包含筛选器索引,邮箱中存储的消息需要经过该筛选器。
 

2.3 CAN 筛选器寄存器

CAN 外设的验收筛选器,一共有 28 个筛选器组,每个筛选器组有 2 个寄存器,CAN1 和 CAN2 共用的筛选器的。
筛选 ID 长度,可通过配置筛选尺度寄存器 CAN_FS1R 的 FSCx 位可以设置。
  1. 检查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,一共 31 位。
  1. 检查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],一共 16 位。
过滤的两种模式,可通过配置筛选模式寄存器 CAN_FM1R 的 FBMx 位可以设置工作模式。
  1. 标识符列表模式:把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
  1. 掩码模式:它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码 (关键字) 相同,就符合要求,报文就会被保存到接收 FIFO。
不同的尺度和不同的过滤方法可使筛选器工作在下图的 4 种状态。
筛选器的 4 种工作状态
筛选器的 4 种工作状态
下表筛选器的工作状态说明
模式
说明
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 位标识符模式
CAN_FxR1 和 CAN_FxR2 各存储 2 个 ID,2 个寄存器表示 4 个筛选的 ID。
如果使能了筛选器,且报文的 ID 与所有筛选器的配置都不匹配,CAN 外设会丢弃该报文,不存入接收 FIFO。

三、HAL 库相关结构体

 

3.1 初始化结构体

 
 
 

四、

 

4.1 Configure the CAN peripheral

      引用

      1. RM0090_STM32F405或415, STM32F407或417, STM32F427或437和STM32F429或439单片机参考手册
      上一篇
      C++ String 常用操作
      下一篇
      嵌入式工程师习题集

      Comments
      Loading...