STM32 CAN外设

发布于:2025-06-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、硬件简介

(一)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 为0x1230x456的消息。

使用实例:

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溢出时产生
  • 状态改变错误中断:出错/唤醒/进入睡眠时产生

九、时间触发通信

可以对所以节点进行同步调度,每个节点只在一个固定的时间段内发送报文,可以避免优先级仲裁。(个人感觉是高级一点的,要求精度高的场合用到),简单介绍:


网站公告

今日签到

点亮在社区的每一天
去签到