CAN笔记(14) STM32-M4 寄存器

CAN笔记(14) STM32-M4 寄存器


1. 主控制寄存器

首先,来看 CAN 的主控制寄存器 CAN_MCR
该寄存器各位描述如图 :
CAN笔记(14) STM32-M4 寄存器

  • 位 0 INRQ初始化请求 (Initialization request)
    软件通过将此位清零,来将硬件切换到正常模式
    一旦在 Rx 信号上监测到连续 11 个隐性位, CAN 硬件即完成同步并准备进行发送和接收
    硬件通过将 CAN_MSR 寄存器的 INAK位清零来指示此事件
    软件通过将此位置 1 来请求 CAN 硬件进入初始化模式
    一旦置 1, CAN 硬件将等待当前 CAN 活动(发送或接收)结束,然后进入初始化模式
    硬件通过将 CAN_MSR寄存器的 INAK 位置 1 来指示此事件

  • 位 1 SLEEP: 睡眠模式请求 (Sleep mode request)
    0:将退出睡眠模式
    1:用于请求 CAN 硬件进入睡眠模式,一旦当前 CAN 活动(发送或接收CAN帧)结束,即进入睡眠模式
    AWUM 位置 1 以及在 CAN RX 信号上检测到 SOF 位时,硬件即将此位清零
    复位后,此位将置 1,CAN 启动睡眠模式

  • 位 2 TXFP: 发送 FIFO 优先级 (Transmit FIFO priority)
    此位用于控制在几个邮箱同时挂起时的发送顺序
    0:优先级由消息标识符确定
    1:优先级由请求顺序(时间顺序)确定

  • 位 3 RFLM: 接收 FIFO 锁定模式 (Receive FIFO locked mode)
    0:接收 FIFO 上溢后不锁定。接收 FIFO 装满后,下一条传入消息将覆盖前一条消息
    1:接收 FIFO 上溢后锁定。接收 FIFO 装满后,下一条传入消息将被丢弃

  • 位 4 NART: 禁止自动重发送 (No automatic retransmission)
    0:CAN 硬件将自动重发送消息,直到根据 CAN 标准消息发送成功
    1:无论发送结果如何(成功、错误或仲裁丢失),消息均只发送一次

  • 位 5 AWUM: 自动唤醒模式 (Automatic wakeup mode)
    此位控制 CAN 硬件在睡眠模式下接收到消息时的行为
    0:在软件通过将 CAN_MCR 寄存器的 SLEEP 位清零发出请求后,退出睡眠模式
    1:一旦监测到 CAN 消息,即通过硬件自动退出睡眠模式
    CAN_MCR 寄存器的 SLEEP 位和 CAN_MCR 寄存器的 SLAK 位由硬件清零

  • 位 6 ABOM: 自动的总线关闭管理 (Automatic bus-off management)
    此位控制 CAN 硬件在退出总线关闭状态时的行为
    0:在软件发出请求后,一旦监测到 128 次连续 11 个隐性位,并且软件将 CAN_MCR 寄存器的 INRQ 位先置 1 再清零,即退出总线关闭状态
    1:一旦监测到 128 次连续 11 个隐性位,即通过硬件自动退出总线关闭状态

  • 位 7 TTCM:时间触发通信模式 (Time triggered communication mode)
    0:禁止时间触发通信模式
    1:使能时间触发通信模式

  • 位 14:8 保留
    必须保持复位值

  • 位 15 RESET: bxCAN 软件主复位 (bxCAN software master reset)
    0:正常工作
    1:强制 bxCAN 进行主复位 -> 复位后激活睡眠模式(FMP位和 CAN_MCR 寄存器初始化为复位值)
    此位自动复位为 0

  • 位 16 DBF: 调试冻结 (Debug freeze)
    0:调试期间 CAN 处于工作状态。
    1:调试期间 CAN 处于接收/发送冻结状态,接收 FIFO 仍可正常访问/控制

  • 位 31:17 保留
    必须保持复位值


2. 位时序寄存器

CAN 位时序寄存器 CAN_BTR

只有 CAN 硬件处于初始化模式时,才能由软件访问此寄存器

该寄存器用于设置分频、Tbs1、Tbs2以及 Tsjw 等非常重要的参数,直接决定了 CAN 的波特率
另外该寄存器还可以设置 CAN 的工作模式

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 9:0 BRP[9:0]: 波特率预分频器 (Baud rate prescaler)
    这些位定义一个时间片的长度
    Tq = (BRP[9:0]+1) x tPCLK

  • 位 15:10 保留
    必须保持复位值

  • 位 19:16 TS1[3:0]: 时间段 1 (Time segment 1)
    这些位定义时间段 1 中的时间片数目
    tBS1 = tCAN x (TS1[3:0] + 1) ,其中 tCAN = 1Tq

  • 位 22:20 TS2[2:0]: 时间段 2 (Time segment 2)
    这些位定义时间段 2 中的时间片数目
    tBS2 = tCAN x (TS2[2:0] + 1)

  • 位 23 保留
    必须保持复位值

  • 位 25:24 SJW[1:0]: 再同步跳转宽度 (Resynchronization jump width)
    这些位定义 CAN 硬件在执行再同步时最多可以将位加长或缩短的时间片数目
    tRJW = tCAN x (SJW[1:0] + 1)

  • 位 29:26 保留
    必须保持复位值

  • 位 30 LBKM: 环回模式(调试) (Loop back mode (debug))
    0:禁止环回模式
    1:使能环回模式

  • 位 31 SILM: 静默模式(调试) (Silent mode (debug))
    0:正常工作
    1:静默模式

STM32F429 提供了两种测试模式:

  • 环回模式
  • 静默模式

当然还可以组合成环回静默模式

这里简单介绍下环回模式:
在环回模式下, bxCAN 把发送的报文当作接收的报文并保存(如果可以通过接收过滤)在接
收邮箱里
也就是环回模式是一个自发自收的模式

CAN 环回模式如图:
CAN笔记(14) STM32-M4 寄存器
环回模式可用于自测试
为了避免外部的影响,在环回模式下 CAN 内核忽略确认错误
(在数据/远程帧的确认位时刻,不检测是否有显性位)

在环回模式下, bxCAN 在内部把 Tx 输出回馈到 Rx 输入上
而完全忽略 CANRX 引脚的实际状态,发送的报文可以在 CANTX 引脚上检测到


3. 发送邮箱标识符寄存器

CAN 发送邮箱标识符寄存器CAN_TIxR(x = 0~2)
因为有 3 个发送邮箱,所以寄存器 CAN_TIxR 有 3 个

当邮箱处于发送挂起状态( TMEx 复位)时,所有发送寄存器均为写保护状态

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 0 TXRQ: 发送邮箱请求 (Transmit mailbox request)
    由软件置 1,用于请求发送相应邮箱的内容
    邮箱变为空后,此位由硬件清零

  • 位 1 RTR: 远程发送请求 (Remote transmission request)
    0:数据帧
    1:遥控帧

  • 位 2 IDE: 标识符扩展 (Identifier extension)
    此位用于定义邮箱中消息的标识符类型。
    0:标准标识符。
    1:扩展标识符。

  • 位 20:3 EXID[17:0]:扩展标识符 (Extended identifier)
    扩展标识符的 LSB

  • 位 31:21 STID[10:0]/EXID[28:18]: 标准标识符或扩展标识符 (Standard identifier or extended identifier)
    标准标识符或扩展标识符的最高加权位MSB(取决于 IDE 位的值)


4. 发送邮箱数据长度和时间戳寄存器

发送邮箱数据长度和时间戳寄存器 CAN_TDTxR(x = 0~2)

该寄存器目前仅用来设置数据长度,即最低 4 个位

当邮箱未处于空状态时,该寄存器的所有位均为写保护状态

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 3:0 DLC[3:0]: 数据长度代码 (Data length code)
    该字段定义数据帧或遥控帧请求中的数据字节数
    一条消息可以包含 0 到 8 个数据字节,具体取决于 DLC 字段的值

  • 位 7:4 保留
    必须保持复位值

  • 位 8 TGT: 发送全局时间 (Transmit global time)
    只有硬件处于时间触发通信模式( CAN_MCR 寄存器的 TTCM 位置 1)时,此位才会激活
    0:不发送时间戳 TIME[15:0]
    1:在 8 字节消息的最后两个数据字节中发送时间戳 TIME[15:0] 的值
    数据字节 7 对应TIME[7:0],数据字节 6 对应 TIME[15:8]
    该值将替换 CAN_TDHxR[31:16] 寄存器( DATA6[7:0] 和 DATA7[7:0])中写入的数据
    DLC 必须编程为 8,才能通过 CAN 总线发送这两个字节

  • 位 15:9 保留
    必须保持复位值

  • 位 31:16 TIME[15:0]: 消息时间戳 (Message time stamp)
    此字段包含在进行 SOF 发送时所捕获的 16 位定时器值


5. 发送邮箱低字节数据寄存器

发送邮箱低字节数据寄存器 CAN_TDLxR(x = 0~2)

当邮箱未处于空状态时,该寄存器的所有位均为写保护状态

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 7:0 DATA0[7:0]: 数据字节 0 (Data byte 0)
    消息的数据字节 0
    一条消息可以包含 0 到 8 个数据字节,从字节 0 开始
  • 位 15:8 DATA1[7:0]: 数据字节 1 (Data byte 1)
    消息的数据字节 1
  • 位 23:16 DATA2[7:0]: 数据字节 2 (Data byte 2)
    消息的数据字节 2
  • 位 31:24 DATA3[7:0]: 数据字节 3 (Data byte 3)
    消息的数据字节 3

该寄存器用来存储将要发送的数据,这里只能存储低 4 个字节
另外还有一个寄存器CAN_TDHxR,该寄存器用来存储高 4 个字节
这样总共就可以存储 8 个字节
CAN_TDHxR的各位描述同 CAN_TDLxR 类似


6. 接收 FIFO 邮箱标识符寄存器

接收 FIFO 邮箱标识符寄存器 CAN_RIxR (x = 0/1)

该寄存器用于保存接收到的报文标识符等信息,可以通过读该寄存器获取相关信息

该寄存器各位描述同 CAN_TIxR 寄存器几乎一模一样
只是最低位不是发送邮箱请求 TXRQ,而是保留位

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

同样的, CAN 接收 FIFO 邮箱数据长度和时间戳寄存器CAN_RDTxR、 接收 FIFO邮 箱 节 数 据 寄 存 器CAN_RDLxRCAN_RDHxR分别和发送邮箱的: CAN_TDTxRCAN_TDLxR 以及 CAN_TDHxR 类似


7. 过滤器模式寄存器

过滤器模式寄存器 CAN_FM1R

该寄存器各位描述如图

CAN笔记(14) STM32-M4 寄存器

  • 位 27:0 FBMx: 筛选器模式 (Filter mode)
    筛选器 x 的寄存器的模式
    0:筛选器存储区 x 的两个 32 位寄存器处于标识符屏蔽模式
    1:筛选器存储区 x 的两个 32 位寄存器处于标识符列表模式

不过必须在过滤器处于初始化模式下( 过滤器主寄存器 CAN_FMRFINIT 位=1),才可以进行设置


8. 过滤器位宽寄存器

过滤器位宽寄存器 CAN_FS1R

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 27:0 FSCx: 筛选器尺度配置 (Filter scale configuration)
    这些位定义了筛选器 13-0 的尺度配置。
    0:双 16 位尺度配置
    1:单 32 位尺度配置

该寄存器也只能在过滤器处于初始化模式下进行设置


9. 过滤器 FIFO 关联寄存器

过滤器 FIFO 关联寄存器 CAN_FFA1R

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 27:0 FFAx: 筛选器 x 的筛选器 FIFO 分配 (Filter FIFO assignment for filter x)
    通过此筛选器的消息将存储在指定的 FIFO 中
    0:筛选器分配到 FIFO 0
    1:筛选器分配到 FIFO 1

该寄存器也只能在过滤器处于初始化模式下进行设置


10. 过滤器激活寄存器

过滤器激活寄存器 CAN_FA1R

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 27:0 FACTx: 筛选器激活 (Filter active)
    软件将此位置 1 可激活筛选器 x
    0:筛选器 x 未激活
    1:筛选器 x 激活

要修改筛选器 x 的寄存器 (CAN_FxR[0:7]),必须将 FACTx位清零或将 CAN_FMR 寄存器的 FINIT 位置 1


11. 过滤器组 i 的寄存器 x

过滤器组 i 的寄存器 x CAN_FiRx( i = 0~27; x = 1/2)

该寄存器各位描述如图:
CAN笔记(14) STM32-M4 寄存器

  • 位 31:0 FB[31:0]:筛选器位 (Filter bits)
    标识符
    寄存器的每一位用于指定预期标识符相应位的级别
    0:需要显性位
    1:需要隐性位
    掩码
    寄存器的每一位用于指定相关标识符寄存器的位是否必须与预期标识符的相应位匹配
    0:无关,不使用此位进行比较。
    1:必须匹配,传入标识符的此位必须与筛选器相应标识符寄存器中指定的级别相同

每个滤波器组的 CAN_FiRx 都由 2 个 32 位寄存器构成,即: CAN_FiR1CAN_FiR2
根据过滤器位宽和模式的不同设置, 这两个寄存器的功能也不尽相同
具体功能在CAN笔记(13) STM32-M4 bxCAN 中已说明


参考:
《STM32 CAN控制器原理与配置-M4》


相关推荐:
CAN笔记(13) STM32-M4 bxCAN
CAN笔记(12) 同步
CAN笔记(11) 位时序
CAN笔记(10) 错误种类和输出
CAN笔记(9) 位填充


谢谢!

上一篇:FPGA之FIFO和RAM模块创建及封装


下一篇:LINUX进程间通信:PIPE与FIFO