CAN——基于STM32F407ZGT6(上)-CSDN博客
STM32的CAN外设
STM32 CAN外设简介
STM32内置bxCAN外设(CAN控制器),支持CAN2.0A和2.0B,可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节。
-
波特率最高可达1兆位/秒
-
3个可配置优先级的发送邮箱
-
2个3级深度的接收FIFO
-
14个过滤器组(互联型28个)
-
时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、 接收FIFO溢出处理方式可配置、发送优先级可配置、双CAN模式
一、CAN网拓扑结构
二、CAN框图
1)双CAN框图
STM32 的有两组CAN 控制器,其中CAN1 是主设备,“存储访问控制器”是由CAN1控制的,CAN2 无法直接访问存储区域,所以使用CAN2 的时候必须使能CAN1 外设的时钟。
图中主要包含CAN 控制内核、发送邮箱、接收FIFO 以及验收筛选器。
程序通过读写寄存器来操纵电路的运行
2)CAN基本结构
3)发送过程
基本流程:选择一个空置邮箱→写入报文 →请求发送
4)接收过程
基本流程:接收到一个报文→匹配过滤器后进入FIFO 0或FIFO 1→CPU读取
5)发送和接收配置位
-
NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功
-
TXFP:置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符值小的先发送(标识符值相等时,邮箱号小的报文先发送)
-
RFLM:置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖
6)标识符过滤器
每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]
FSCx:位宽设置 置0,16位;置1,32位
FBMx:模式设置 置0,屏蔽模式;置1,列表模式
FFAx:关联设置 置0,FIFO 0;置1,FIFO 1
FACTx:激活设置 置0,禁用;置1,启用
每组筛选器包含2 个32 位的寄存器,分别为CAN_FxR1 和CAN_FxR2,它们用来存储要筛选的ID 或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致。
例如,在掩码模式时,第一个寄存器存储要筛选的ID,第二个寄存器存储掩码,掩码为1 的部分表示该位必须与ID 中的内容一致,筛选的结果为表中第三行的ID 值,它是一组包含多个的ID 值,其中x 表示该位可以为1 可以为0。
如果使能了筛选器,且报文的ID 与所有筛选器的配置都不匹配,CAN 外设会丢弃该报文,不存入接收FIFO。
7)过滤器配置示例
8)模式介绍
设置CAN 的工作模式,可设置为正常模式(CAN_Mode_Normal)、回环模式(CAN_Mode_LoopBack)、静默模式(CAN_Mode_Silent) 以及回环静默模式(CAN_Mode_Silent_LoopBack)。
各个工作模式介绍如下:
• 正常模式
正常模式下就是一个正常的CAN 节点,可以向总线发送数据和接收数据。
• 静默模式
静默模式下,它自己的输出端的逻辑0 数据会直接传输到它自己的输入端,逻辑1 可以被发送到总线,所以它不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。
• 回环模式
回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。
• 回环静默模式
回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。
9)工作模式
初始化模式:用于配置CAN外设,禁止报文的接收和发送 正常模式:配置CAN外设后进入正常模式,以便正常接收和发送报文 睡眠模式:低功耗,CAN外设时钟停止,可使用软件唤醒或者硬件自动唤醒 AWUM:置1,自动唤醒,一旦检测到CAN总线活动,硬件就自动清零SLEEP,唤醒CAN外设;置0,手动唤醒,软件清零SLEEP,唤醒CAN外设
10)位时间特性
波特率 = APB1时钟频率 / 分频系数 / 一位的Tq数量 = 36MHz / (BRP[9:0]+1) / (1 + (TS1[3:0]+1) + (TS2[2:0]+1))
SS = 1Tq BS1 = 1~16Tq BS2 = 1~8Tq
SJW=1~4Tq
11)中断
CAN外设占用4个专用的中断向量
发送中断:发送邮箱空时产生
FIFO 0中断:收到一个报文/FIFO 0满/FIFO 0溢出时产生
FIFO 1中断:收到一个报文/FIFO 1满/FIFO 1溢出时产生
状态改变错误中断:出错/唤醒/进入睡眠时产生
12)时间触发通信
TTCM:置1,开启时间触发通信功能;置0,关闭时间触发通信功能 CAN外设内置一个16位的计数器,用于记录时间戳 TTCM置1后,该计数器在每个CAN位的时间自增一次,溢出后归零 每个发送邮箱和接收FIFO都有一个TIME[15:0]寄存器,发送帧SOF时,硬件捕获计数器值到发送邮箱的TIME寄存器,接收帧SOF时,硬件捕获计数器值到接收FIFO的TIME寄存器 发送邮箱可配置TGT位,捕获计数器值的同时,也把此值写入到数据帧数据段的最后两个字节,为了使用此功能,DLC必须设置为8
13)错误处理和离线恢复
TEC和REC根据错误的情况增加或减少 ABOM:置1,开启离线自动恢复,进入离线状态后,就自动开启恢复过程;置0,关闭离线自动恢复,软件必须先请求进入然后再退出初始化模式,随后恢复过程才被开启