CAN总线基础详解以及stm32的CAN控制器

目录

CAN简介

CAN总线拓扑图

CAN总线特定

CAN应用场景

CAN的物理层

CAN的协议层

CAN数据帧介绍

CAN位时序介绍

数据同步过程

硬件同步

再同步

CAN总线仲裁

stm32的CAN控制器

CAN控制器介绍

CAN控制器模式

CAN控制器框图

接收过滤器

CAN控制器波特率计算

CAN相关寄存器

CAN主控制寄存器(CAN_MCR))

CAN位时序寄存器(CAN_BTR)

[CAN 标识符寄存器(CAN_(T/R)IxR)](#CAN 标识符寄存器(CAN_(T/R)IxR))

数据长度和时间戳寄存器(CAN_(T/R)DTxR)

CAN低位数据寄存器(CAN_(T/R)DLxR)

CAN高位数据寄存器(CAN_(T/R)DHxR)

CAN过滤器模式寄存器(CAN_FM1R)

CAN过滤器位宽寄存器(CAN_FS1R)

[CAN 过滤器FIFO关联寄存器(CAN_FFA1R)](#CAN 过滤器FIFO关联寄存器(CAN_FFA1R))

[​CAN 过滤器激活寄存器(CAN_FA1R)](#CAN 过滤器激活寄存器(CAN_FA1R))

[CAN 过滤器组x寄存器(CAN_FxR(1/2))](#CAN 过滤器组x寄存器(CAN_FxR(1/2)))


CAN简介

CAN(Controller Area Network),是IOS国际标准化的串行通信协议。为了满足汽车产业的"减少线束的数量"、"通过多个LAN,进行大量数据的高速通信"的需求。

CAN总线的发展史:

  • 低速CAN(ISO11519)通信速率10~125Kbps,总线长度可达1000米
  • 高速CAN(ISO11898)通信速率125Kbps~1Mbps,总线长度≤40米(经典CAN
  • CANFD 通信速率可达5Mbps,并且兼容经典CAN,遵循ISO 11898-1 做数据收发

CAN总线拓扑图

CAN总线由两根线( CANL 和 CANH )组成,允许挂载多个设备节点(低速CAN:20 高速CAN:30)。

CAN总线特定

  1. 多主控制 每个设备都可以主动发送数据
  2. 系统的柔软性 没有类似地址的信息,添加设备不改变原来总线的状态
  3. 通信速度 速度快,距离远
  4. 错误检测&错误通知&错误恢复功能
  5. 故障封闭 判断故障类型,并且进行隔离
  6. 连接节点多 速度与数量找个平衡

CAN应用场景

CAN总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。

CAN的物理层

  1. CAN使用差分信号进行数据传输,根据CAN_H和CAN_L上的电位差来判断总线电平。
  2. 总线电平分为显性电平(逻辑0)和隐性电平(逻辑1),二者必居其一。
  3. 显性电平具有优先权。发送方通过使总线电平发生变化,将消息发送给接收方。

|---------|-----------------------|---------------------------|
| 电平 | 高速CAN | 低速CAN |
| 显性电平(0) | UCAN_H -- UCAN_L= 2V | UCAN_H -- UCAN_L = 3V |
| 隐性电平(1) | UCAN_H -- UCAN_L = 0V | UCAN_H -- UCAN_L = - 1.5V |

CAN的协议层

CAN总线以"帧"形式进行通信。CAN协议定义了5种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用。

|------------------------|---------------------------|
| 帧类型 | 帧作用 |
| 数据帧(Data Frame) | 用于发送单元向接收单元传输数据的帧 |
| 遥控帧(Remote Frame) | 用于接收单元向具有相同ID的发送单元 请求数据的帧 |
| 错误帧(Error Frame) | 用于当检测出错误时向其他单元通知 错误的帧 |
| 过载帧(Overload Frame) | 用于接收单元通知其尚未做好接收准备 的帧 |
| 间隔帧(Inter Frame Space) | 用于将数据帧 及遥控帧与前面的帧 分离开来的帧 |

CAN数据帧介绍

  1. 帧起始:表示数据帧开始的段,显性信号
  2. 数据段:数据的内容,一帧可发送0~8字节数据
  3. 仲裁段:表示该帧优先级的段,优先级
  4. CRC段:检查帧的传输错误的段
  5. ACK段:表示确认正常接收的段
  6. 控制段:表示数据的字节数及保留位的段
  7. 帧结束:表示数据帧结束的段,7个隐性信号

CAN位时序介绍

CAN总线以"位同步"机制,实现对电平的正确采样。位数据都由四段组成:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每段又由多个位时序Tq组成。

​采样点是指读取总线电平,并将读到的电平作为位值的点。

​根据位时序,就可以计算CAN通信的波特率。

​注意 : 节点监测到总线上信号的跳变在SS段范围内,表示节点与总线的时序是同步,此时采样点的电平即该位的电平。

数据同步过程

CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步。

硬件同步

节点通过CAN总线发送数据,一开始发送帧起始信号。总线上其他节点会检测帧起始信号在不在位数据的SS段内,判断内部时序与总线是否同步。如果起始信号不在SS段内,采样点获取的电平是不正确的,节点会采用硬件同步机制进行调整,把自己的SS段平移到检测到边沿的地方,此时采样点获取的电平是正确的。

再同步

再同步利用普通数据为的边沿信号进行同步。再同步的情况分为两种,边沿信号相对于SS段的位置即超前和滞后。

再同步时,PSB1和PSB2中增加或减少的时间被称为"再同步步长宽度(SJW)",其范围时1-4Tq,限定了SJW的值后,再同步时,不能增加限定长度的SJW值,SJW值较大时,吸收误差的能力更强,但是通信速率会下降。

CAN总线仲裁

当CAN总线处于空闲时,最先开始发送消息的单元获取发送权,当多个单元同时发送时,从报文ID的第一位开始进行仲裁,连续输出显性电平最多的单元可以继续发送,即首先出现隐形电平的单元失去对总线的控制权,变为接收。竞争失败的单元自动检测总线是否空闲,当总线空闲会第一时间再次检测发送。

stm32的CAN控制器

CAN控制器介绍

​STM32 CAN控制器(bxCAN),支持CAN 2.0A 和 CAN 2.0B Active版本协议。

​CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错误,而CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。CAN 2.0B Passive只能处理标准数据帧且扩展帧的内容会忽略。

​bxCAN主要特点:

  • 波特率最高可达1M bps
  • 支持时间触发通信(CAN的硬件内部定时器可以在TX/RX的帧起始位的采样点位置生成时间戳)
  • 具有3级发送邮箱
  • 具有3级深度的2个接收FIFO
  • 可变的过滤器组(最多28个)

CAN控制器模式

CAN控制器的工作模式有三种:初始化模式、正常模式和睡眠模式。

CAN控制器的测试模式有三种:静默模式、环回模式和环回静默模式,这三种测试模式需要再初始化模式下进行配置。

CAN控制器框图

  • CAN内核:包含各种控制/状态/配置寄存器,可以配置模式、波特率等
  • 发送邮箱:用来缓存待发送的报文,最多可以缓存3个报文
  • 接收FIFO:缓存接收到的有效报文
  • 接收过滤器:筛选有效报文

发送处理

发送优先级由邮箱中报文的标识符决定。标识符数值越低有最高优先级。如果标识符值相同,邮箱小的先被发送。

接收处理

​有效报文指的是(数据帧直到EOF段的最后一位都没有错误),且通过过滤器组对标识符过滤。

接收过滤器

当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。

每个过滤器组都有两个32位寄存器CAN_FxR1和CAN_FxR2。根据过滤器组的工作模式不同(位宽和选择模式),寄存器的作用不尽相同。

​位宽可设置32位或16位,寄存器存储的内容就有所区别。

|----------|--------------------------------------|---------------------------------------|
| 过滤器组Reg | 32位 | 16位(寄存器由两部分组成) |
| CAN_FxR1 | STDID[10:0]、EXTID[17:0]、 IDE、RTR | STDID[10:0]、EXTID[17:15]、 IDE、RTR |
| CAN_FxR2 | STDID[10:0]、EXTID[17:0]、 IDE、RTR | STDID[10:0]、EXTID[17:15]、 IDE、RTR |

​ 选择模式可设置屏蔽位模式或标识符列表模式,寄存器内容的功能就有所区别。

屏蔽位模式,可以选择出一组符合条件的报文。寄存器内容功能相当于是否符合条件。

​标识符列表模式,可以选择出几个特定ID的报文。寄存器内容功能就是标识符本身。

CAN控制器波特率计算

​STM32的CAN外设位时序分为三段:

  • 同步段SYNC_SEG
  • 时间段1 BS1(PTS +PBS1)
  • 时间段2 BS2

波特率=1/(1tq+tq∗(TS1[3:0]+1)+tq∗(TS2[2:0]+1) )

CAN相关寄存器

CAN主控制寄存器(CAN_MCR)
CAN位时序寄存器(CAN_BTR)
CAN 标识符寄存器(CAN_(T/R)IxR)
数据长度和时间戳寄存器(CAN_(T/R)DTxR)
CAN低位数据寄存器(CAN_(T/R)DLxR)
CAN高位数据寄存器(CAN_(T/R)DHxR)
CAN过滤器模式寄存器(CAN_FM1R)
CAN过滤器位宽寄存器(CAN_FS1R)
CAN 过滤器FIFO关联寄存器(CAN_FFA1R)
​CAN 过滤器激活寄存器(CAN_FA1R)
CAN 过滤器组x寄存器(CAN_FxR(1/2))
相关推荐
FanXing_zl16 小时前
整数MCU实现FOC控制:深度解析与优化实践
单片机·嵌入式硬件·mcu·浮点运算
Net_Walke19 小时前
【STM32】CLion STM32开发环境搭建
stm32·单片机
laocooon5238578861 天前
运行当前位置,显示文件全名,检查是否扩展名多次重叠
stm32·单片机·嵌入式硬件
沉醉不知归路11 天前
cursor导入keil工程详细步骤
stm32
D.....l1 天前
STM32学习(MCU控制)(I2C 模拟)
stm32·单片机·学习
A9better1 天前
嵌入式开发学习日志42——stm32之SPI工作方式
stm32·单片机·嵌入式硬件·学习
D.....l1 天前
STM32学习(MCU控制)(SysTick and TIM)
stm32·单片机·学习
python百炼成钢1 天前
10.串口
linux·stm32·单片机·嵌入式硬件
FanXing_zl2 天前
MCU寄存器配置深度解析:从原理到实践
mcu·寄存器·mcu寄存器配置·寄存器配置
充哥单片机设计2 天前
【STM32项目开源】基于STM32的智能水质检测系统
stm32·单片机·嵌入式硬件