一、硬件简介
(一)32引脚资源
(二)CAN收发器电路(TJA1050)
在图中红色箭头指向的电阻就是终端电阻,回顾请看:STM32 CAN简介及帧格式-CSDN博客
若是接三个CAN,就有三个终端电阻了。但起始要求是要两个的。有什么影响呢?
由于不是用的120欧的双绞线,所以都是不匹配的。
同样的收紧的力会更强,张开所需的力更大,功率会更大,3个还在可承受范围之内。
(三)STM32 CAN系统框图
左边部分就是一些寄存器,程序通过读写寄存器来操控电路的运行
主发送邮箱:有三个,每个邮箱可以存入一个CAN报文
接收滤波器:可以设置过滤规则,得到想要的ID报文,通过滤波就可以存在FIFO(先进先出寄存器)里面,等待CPU读取
二、流程框图
首先要配置GPIOTX和RX,TX配置为复用推挽输出,RX配置为上拉输入
发送:想要发送什么报文,把报文的各个参数ID、Data、IDE、RTR,写入到其中一个发送邮箱,然后给一个请求发送的指令。然后发送和接收控制器就会等待空闲,自动发送。若是三个邮箱满了,总线此时空闲,需要选择一个发送时,可以配置先进先出或者是ID小的发送
接收:接收到的报文若是能通过过滤器(主要看ID是否匹配,有14个过滤器),则存入FIFO的队列里(这里是可以自己配置进入哪个FIFO的,每个FIFO有三个邮箱,若是存满,则可以配置为下一个来则不存进去,或者配置为下一个来把邮箱2踢出去,自己存入),CPU直接读取FIFO就行。假设CPU读取完了邮箱0,则后面的往前依次存入,邮箱1到邮箱0,邮箱2到邮箱1。和排队是一样的。
三、发送接收配置位
- NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功
- TXFP:(上面红色字部分)置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符值小的先发送(标识符值相等时,邮箱号小的报文先发送)
- RFLM:(蓝色字部分)置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖
四、过滤器详解
- 每个过滤器的核心由两个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,启用(可以关闭没用到的过滤器)·
- 32 位列表模式:每个过滤器组由 2 个 32 位寄存器组成,这种模式下只能存入2 个ID,常用于扩展帧,其中 ID 的高 29 位被存储。
- 16 位列表模式:将 2 个 32 位寄存器拆分成 4 个 16 位寄存器,这种模式下可以存入4 个标准 ID。
屏蔽模式和列表模式:
屏蔽:需要接收某一类 ID 的场景(如 ID 前缀相同的消息)
例如:接收所有标准帧 ID 以0x1
开头的消息(屏蔽码设为0xFFF F000
,ID 设为0x100 0000
)
列表: 直接存储需要接收的 CAN ID 列表,只有 ID 与列表中任一条目完全匹配的消息才会被接收。
- 需要严格过滤特定 ID 的场景(如设备间的专用通信协议)。
- 示例:只接收 ID 为
0x123
和0x456
的消息。
使用实例:
16位屏蔽:为了接收第一组0X2开头的ID号,需要在表示ID的寄存器,写入0x200,0x2是关键,后面两个0是无关位,然后左移5位(16位寄存器的映像是左对齐的,赋值语句是右对齐,想要写入STID,就必须左移5位,从RTR\IDE\3位EXID中抽离到左边),然后下面的R1高位作为Mask屏蔽位掩码
注:目前表格里是接收数据帧,若是要接收遥控帧,那么上面的ID部分得 | 0x10
五、测试模式
- 静默模式:用于分析CAN总线的活动,不会对总线造成影响(只想看一下总线有哪些报文)
- 环回模式:用于自测试,同时发送的报文可以在CAN_TX引脚上检测到,自己也可以收到自己的报文
- 环回静默模式:用于热自测试,自己发报文,测试自己能不能接收。自测的同时不会影响CAN总线。
六、工作模式
- 初始化模式:用于配置CAN外设,禁止报文的接收和发送
- 正常模式:配置CAN外设后进入正常模式,以便正常接收和发送报文
- 睡眠模式:低功耗,CAN外设时钟停止,可使用软件唤醒或者硬件自动唤醒
- AWUM:置1,自动唤醒,一旦检测到CAN总线活动,硬件就自动清零SLEEP,唤醒CAN外设;置0,手动唤醒,软件清零SLEEP,唤醒CAN外设
七、位时间的特性
八、CAN的中断
CAN外设占用4个专用的中断向量
- 发送中断:发送邮箱空时产生
- FIFO 0中断:收到一个报文/FIFO 0满/FIFO 0溢出时产生
- FIFO 1中断:收到一个报文/FIFO 1满/FIFO 1溢出时产生
- 状态改变错误中断:出错/唤醒/进入睡眠时产生
九、时间触发通信
可以对所以节点进行同步调度,每个节点只在一个固定的时间段内发送报文,可以避免优先级仲裁。(个人感觉是高级一点的,要求精度高的场合用到),简单介绍: