STM32 bxCAN
bxCAN 主要特性
- 支持 2.0 A 及 2.0 B Active 版本 CAN 协议
- 比特率高达 1 Mb/s
- 支持时间触发通信方案
发送
- 三个发送邮箱
- 可配置的发送优先级
- SOF 发送时间戳
接收
- 两个具有三级深度的接收 FIFO
- 可扩展的过滤器组:
- 对于双 CAN,CAN1 和 CAN2 之间共享 28 个过滤器组
- 对于单 CAN,则为 14 个过滤器组
- 标识符列表功能
- 可配置的 FIFO 上溢
- SOF 接收时间戳
时间触发通信方案
- 禁止自动重发送模式
- 16 位自由运行定时器
- 在最后两个数据字节发送时间戳
管理
- 可屏蔽中断
- 在唯一地址空间通过软件实现高效的邮箱映射
双 CAN 外设配置
- CAN1:主 bxCAN,用于管理主/从 bxCAN 与 512 字节 SRAM 存储器之间的通信
- CAN2:从 bxCAN,无法直接访问 SRAM 存储器。
- 两个 bxCAN 单元共享 512 字节 SRAM 存储器。
单 CAN 外设配置
- CAN3:具有专用存储器访问控制器单元和 512 字节 SRAM 存储器的主 bxCAN
bxCAN 工作模式
- 初始化模式
该模式下可以进行软件初始化。
有些寄存器配置只能在该模式下进行。
该模式下 CAN 不会接收和发送任何消息,并且 CANTX 输出隐性(高)。
进入初始化模式不会更改任何配置寄存器。 - 正常模式
该模式下可以进行正常的发送和接收。 - 睡眠模式(低功耗)
该模式下,bxCAN 时钟停止。
测试模式
- 静默模式
只接收(有效数据帧和有效遥控帧)不发送(ACK 和错误标志会在内部从 Tx 发送到 Rx,但不会向外部发送)。
- 环回模式
只能接收自身消息,不能接收外部消息。发送消息时一定会发送给自己,也会向外发送。
- 环回静默模式
不对外发送消息,也不接收外部消息。只能在内部向自己发送消息。
bxCAN 功能说明
发送处理
- 选择一个空的发送邮箱
- 设置标识符、数据长度代码 (DLC) 和数据
- 触发请求发送
- 邮箱进入挂起状态,等待成为优先级最高的邮箱
- 邮箱拥有最高优先级,同时 CAN 总线空闲,则开始发送
- 发送成功,邮箱恢复空状态
- 发送优先级
- 按标识符
当多个发送邮箱挂起时,标识符值最低的消息具有最高的优先级。如果标识符值相等,则首先安排发送编号较小的邮箱。 - 按发送请求顺序
将发送邮箱配置为发送 FIFO,按照发送请求顺序发送。
- 按标识符
- 中止
中止发送请求时,在挂起或已安排状态下,邮箱立即中止。 - 禁止自动重发送模式
在此模式下,每个发送仅启动一次。
如果第一次尝试失败,由于仲裁丢失或错误,硬件将不会自动重新启动消息发送。
时间触发通信模式
CAN 硬件会自己计数,并捕获计数器值(时间戳值)。该值不会发送到 CAN 总线。
在此模式下,CAN 硬件的内部计数器激活,在每个 CAN 位时间递增。
在接收和发送时,都会在帧起始位的采样点捕获内部计数器。
接收处理
标识符过滤
最多 28 个过滤器组 (27-0)。
每个过滤器组 x 均包含两个 32 位寄存器,分别是 CAN_FxR0 和 CAN_FxR1。
- F1 系列
- 互联型产品(STM32F105xx 和 STM32F107xx) CAN1 和 CAN2 分享 28 个过滤器组
- 其它 STM32F103xx 系列 产品中有 14 个过滤器组
- F4 系列
- 对于双 CAN,CAN1 和 CAN2 之间共享 28 个过滤器组
- 对于单 CAN,则为 14 个过滤器组
- 可调整的宽度
一个过滤器组可以:- 1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
- 2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
- 掩码模式
标识符寄存器与掩码寄存器关联,用以指示标识符的哪些位“必须匹配”,哪些位“无关”。 - 标识符列表模式
掩码寄存器用作标识符寄存器,使单个标识符的数量加倍。
传入标识符的所有位都必须与过滤器寄存器中指定的位匹配。 - 过滤器组尺度和模式配置
- 过滤器匹配索引
使用同一个接收 FIFO 的所有过滤器组将按过滤器组号从小到达顺序重新从 0 到最大值对所有过滤器进行统一编号(称为过滤器编号或索引)。
- 过滤器优先级规则
- 32 位过滤器优先于 16 位过滤器。
- 对于尺度相等的过滤器,标识符列表模式优先于标识符掩码模式。
- 对于尺度和模式均相等的过滤器,则按过滤器编号确定优先级(编号越低,优先级越高)。
错误管理
位时序
- 同步段 (SYNC_SEG) - 固定 1 Tq。
- 位段 1 (BS1) - 定义采样点的位置。包括 CAN 标准的 PROP_SEG 和 PHASE_SEG1。1 ~ 16 Tq。
- 位段 2 (BS2) - 定义发送点的位置。代表 CAN 标准的 PHASE_SEG2。1 ~ 8 Tq。
- 再同步跳转宽度 (SJW) - 定义位段加长或缩短的上限。1 ~ 4 Tq。
bxCAN 中断
bxCAN 共有四个专用的中断向量。每个中断源均可通过 CAN 中断使能寄存器 (CAN_IER) 来单独地使能或禁止。
- 发送中断可由以下事件产生:
- 发送邮箱 0 变为空,CAN_TSR 寄存器的 RQCP0 位置 1。
- 发送邮箱 1 变为空,CAN_TSR 寄存器的 RQCP1 位置 1。
- 发送邮箱 2 变为空,CAN_TSR 寄存器的 RQCP2 位置 1。
- FIFO 0 中断可由以下事件产生:
- 接收到新消息,CAN_RF0R 寄存器的 FMP0 位不是“00”。
- FIFO0 满,CAN_RF0R 寄存器的 FULL0 位置 1。
- FIFO0 上溢,CAN_RF0R 寄存器的 FOVR0 位置 1。
- FIFO 1 中断可由以下事件产生:
- 接收到新消息,CAN_RF1R 寄存器的 FMP1 位不是“00”。
- FIFO1 满,CAN_RF1R 寄存器的 FULL1 位置 1。
- FIFO1 上溢,CAN_RF1R 寄存器的 FOVR1 位置 1。
- 错误和状态改变中断可由以下事件产生:
- 错误状况,有关错误状况的更多详细信息,请参见 CAN 错误状态寄存器 (CAN_ESR)。
- 唤醒状况,CAN Rx 信号上监测到 SOF。
- 进入睡眠模式。
CAN 寄存器
外设寄存器必须按字(32 位)进行访问。
有些寄存器只能在初始化模式下修改。