CAN:STM32 CAN外设2 - 详解

目录

1.标识符过滤器

列表模式:

2个32位过滤器-标识符列表

4个16位过滤器-标识符列表

屏蔽模式:

1个32位过滤器-标识符屏蔽

2个16位过滤器-标识符屏蔽

2.过滤器配置示例

3.测试模式

静默模式:

环回模式:

环回静默模式:

4.工作模式

5.位时间特性

6.中断

7.时间触发通信(简单了解,之后需要可深入学习)

8.错误处理和离线恢复


1.标识符过滤器

每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]

FSCx(x是任意值0~13):位宽设置 置0,16位;置1,32位

FBMx:模式设置 置0,屏蔽模式;置1,列表模式

FFAx:关联设置 置0,FIFO 0;置1,FIFO 1

FACTx:激活设置 置0,禁用;置1,启用

列表模式:

将想要的ID写入过滤器里面,过滤器会进行对比报文,在列表中过滤器就会让你利用,反之,不通过,写入一个一个目标ID

2个32位过滤器-标识符列表

通过R1和R2两个寄存器,都写入的是目标ID,能够直接把想要的ID号写入到R1或R2寄存器中,R1和R2两个寄存器,总共许可写两个目标ID,当管理员接收到报文后,会和R1和R2寄存器的目标ID对比

标准ID:写入STID后面的EXID不用管

扩展ID:写入STID和EXID

IDE:扩展标志位,置1扩展ID,置0标准ID

RTR:遥控帧标志位,置0过滤数据帧,置1,过滤遥控帧

最后一位置0

4个16位过滤器-标识符列表

通过R1和R2被拆开,拆成4个16位寄存器,每个寄存器,写入一个标准格式的目标ID,这样一个过滤器就能够写入4个目标

STID:写入标准ID

RTR:置1遥控帧,置0标准帧

IDE:固定写0,因为这个4个16位过滤器-标识符列表只过滤标准数据帧,对2个32位过滤器-标识符列表标准材料帧的补充

EXID:没用,写0即可

屏蔽模式:

R1写ID号,R2决定ID的哪些必须一样,哪些为是容易的,这样就能过滤出一组ID号,比如:设计者要搞100个温度探头,会把高位置1,其他不一样,那么通过屏蔽模式就能过滤出100个温度探头的材料

1个32位过滤器-标识符屏蔽

R1寄存器写入ID号,R2寄存器写入屏蔽位

只需要遥控帧,R1的RTR给1,R2的RTR给1就是比如:过滤出0x1开头的所有标准ID号,11位的二进制表示就是001 xxxx xxxx,写入R1从左到右依次是001 0000 0000,后面的EXID不应该全部填0,IDE给0(因为是标准ID)RTR根据需求(内容帧给0,遥控帧给1)R2寄存器,写1表示进入的数据必须和R1里的ID对应位匹配一致,写0表示R1里的ID对应位1和0均可,这里R2给111 0000 0000,EXID的屏蔽位没用都给0,IDE必须给1(要是给0,说明标准格式和扩展格式无所谓,那么我们想要的是标准ID,扩展ID就可能误入)RTR看情况,如果需数据帧R1的RTR给0,R2的RTR给1,若

2个16位过滤器-标识符屏蔽

和1个32位过滤器-标识符屏蔽同理,不过这里只能通过标准ID扩展ID不能通过


2.过滤器配置示例

这里为了方便用16进制表示ID号范围,ID分组都故意设计成了4位对齐,实际上不设计成4位对齐也可以,比如ID范围是001 01xx xxxx,16进制表示就是0x140~0x17F,一组64个ID


3.测试模式

静默模式:

用于分析CAN总线的活动,不会对总线造成影响

发送端接到接收端,这个模式除了许可自发自收测试,还可以默默地监测CAN总线的报文数据,比如:想做一个CAN报文分析仪,只想看一下总线有哪些报文,而不想输出任何电平

环回模式:

用于自测试,同时发送的报文能够在CAN_TX引脚上检测到

底层的回读电平,该能看发出了什么报文就是这里和回读模式不是一个东西,这个自发自收侧重点是在报文层面上的自发自收,回读模式

环回静默模式:

用于热自测试,自测的同时不会影响CAN总线

不会影响其他设备的通信,也不会被其他设备的通信影响,自测,观看设备是否正常

这些测试模式,不用改变实际的接线,只需要想改变代码


4.工作模式

初始化模式:用于配置CAN外设,禁止报文的接收和发送

正常模式:配置CAN外设后进入正常模式,以便正常接收和发送报文

睡眠模式:低功耗,CAN外设时钟停止,可使用软件唤醒或者硬件自动唤醒AWUM:置1,自动唤醒,一旦检测到CAN总线活动,硬件就自动清零SLEEP,唤醒CAN外设;置0,手动唤醒,软件清零SLEEP,唤醒CAN外设

图中字母上面的横杠表示置0,没有表示置1


5.位时间特性

SS = 1Tq

BS1(在stm32中PTS和PBS1两段合在一起) = 1~16Tq

BS2 = 1~8Tq

SJW=1~4Tq

波特率 = APB1时钟频率 / 分频系数 / 一位的Tq数量 = 36MHz / (BRP[9:0]+1) / (1 + (TS1[3:0]+1) + (TS2[2:0]+1))


6.中断

CAN外设占用4个专用的中断向量

发送中断:发送邮箱空时产生

FIFO 0中断:收到一个报文/FIFO 0满/FIFO 0溢出时产生

FIFO 1中断:收到一个报文/FIFO 1满/FIFO 1溢出时产生

状态改变错误中断:出错/唤醒/进入睡眠时产生


7.时间触发通信(简单了解,之后得可深入学习)

每个节点在一个固定的时间段内发送报文,这样可以避免优先级仲裁就是ISO11898-4协议里规定的更高级的功能,简便的说,可以对所有节点进行同步调度,也就

TTCM:置1,开启时间触发通信效果;置0,关闭时间触发通信功能

CAN外设内置一个16位的计数器,用于记录时间戳

TTCM置1后,该计数器在每个CAN位的时间自增一次,溢出后归零每个发送邮箱和接收FIFO都有一个TIME[15:0]寄存器,发送帧SOF时,硬件捕获计数器值到发送邮箱的TIME寄存器,接收帧SOF时,硬件捕获计数器值到接收FIFO的TIME寄存器

发送邮箱可配置TGT位,捕获计数器值的同时,也把此值写入到素材帧数据段的最终两个字节,为了使用此功能,DLC必须设置为8


8.错误处理和离线恢复

TEC和REC根据错误的情况增加或减少

ABOM(stm32独特小功能):置1,开启离线自动恢复,进入离线状态后,就自动开启恢复过程;置0,关闭离线自动恢复,软件必须先请求进入然后再退出初始化模式,随后恢复过程才被开启

在离线和错误主动之间加了一个开关就是基本和CAN协议一致,就

posted @ 2025-12-21 10:37  gccbuaa  阅读(1)  评论(0)    收藏  举报