长文|关于CAN协议的总结笔记,先收藏了!_焦点讯息

2023-05-21 13:18:51    来源 : 面包芯语

点击上方蓝字谈思汽车

获取更多汽车行业资讯

一. CAN协议概念

1.1 CAN 协议简介

CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。


(资料图片)

1.2 CAN 物理层

1.2.1 闭环总线网络

1.2.2 开环总线网络

1.2.3 通讯节点

我们来用TJA1050来看下原理图:

1.2.4 差分信号

1.2.5 CAN 协议中的差分信号

在 CAN 总线中,必须使它处于隐性电平 (逻辑 1) 或显性电平 (逻辑 0) 中的其中一个状态。假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。

1.3 CAN 协议层

1.3.1 CAN 的波特率及位同步

1.3.2 位时序分解

该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

1.3.3 通讯的波特率

1.3.4 同步过程分析

(2) 重新同步

第二种相位滞后的情况如图 ,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。

在重新同步的时候,PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度SJW* (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降

1.3.5 CAN 的报文种类及结构

1.3.5.1 报文的种类
1.3.5.2 数据帧的结构

数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN

1.3.5.3 其它报文的结构

二. STM32 CAN 控制器介绍

STM32 的有两组 CAN 控制器,其中 CAN1 是主设备,框图中的“存储访问控制器”是由 CAN1控制的,CAN2 无法直接访问存储区域,所以使用 CAN2 的时候必须使能 CAN1 外设的时钟。框图中主要包含 CAN 控制内核、发送邮箱、接收 FIFO 以及验收筛选器,下面对框图中的各个部分进行介绍。

2.1 CAN 控制内核

2.1.1 主控制寄存器 CAN_MCR

(1) DBF 调试冻结功能

2.1.2 位时序寄存器 (CAN_BTR) 及波特率

CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。

2.1.2.1 模式

各个工作模式介绍如下:

2.1.2.2 位时序及波特率

STM32 的 CAN 外设位时序中只包含 3 段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采样点位于 BS1 及 BS2 段的交界处。其中 SYNC_SEG 段固定长度为 1Tq,而 BS1 及 BS2 段可以

推荐一个CAN波特率计算器:

CAN波特率计算 f103AHP1_36M f407AHP1_42M 采样点软件有说明.rar

2.2 CAN 发送邮箱

当我们要使用 CAN 外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器 CAN_TIxR 中的发送请求寄存器位 TMIDxR_TXRQ 置 1,即可把数据发送出去。其中标识符寄存器 CAN_TIxR 中的 STDID 寄存器位比较特别。我们知道 CAN 的标准标识符的总位数为 11 位,而扩展标识符的总位数为 29 位的。当报文使用扩展标识符的时候,标识符寄存器 CAN_TIxR 中的 STDID[10:0] 等效于 EXTID[18:28] 位,它与 EXTID[17:0] 共同组成完整的 29位扩展标识符。

2.3 CAN 接收 FIFO

通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到 STM32 的内存中

2.4 验收筛选器

每组筛选器包含 2 个 32 位的寄存器,分别为 CAN_FxR1 和 CAN_FxR2,它们用来存储要筛选的ID 或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明见表。

例如下面的表格所示,在掩码模式时,第一个寄存器存储要筛选的 ID,第二个寄存器存储掩码,掩码为 1 的部分表示该位必须与 ID 中的内容一致,筛选的结果为表中第三行的 ID 值,它是一组包含多个的 ID 值,其中 x 表示该位可以为 1 可以为 0。

而工作在标识符模式时,2 个寄存器存储的都是要筛选的 ID,它只包含 2 个要筛选的 ID 值 (32位模式时)。

2.5 整体控制逻辑

2.6 STM32 HAL库代码逻辑

2.6.1 初始化

2.6.2 CAN 发送及接收结构体

2.6.3 CAN 筛选器结构体

对这些结构体成员赋值的时候,还要注意寄存器位的映射,即注意哪部分代表 STID,哪部分代表 EXID 以及 IDE、RTR 位。

三. CAN Cubemx配置

问题:怎么配置波特率呢?

我们用采集点为80%,所以BS1为4tq,BS2为2tq,分频系数为12,代进公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(4+2+1)/12=500kHz

我们用采集点为75%,所以BS1为3tq,BS2为2tq,分频系数为7,代进公式Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)=42M/(3+2+1)/7=1MHz

问题:Basic Parameter分别是啥意思呢?

Timer Triggered Communication Mode:否使用时间触发功能 (ENABLE/DISABLE),时间触发功能在某些CAN 标准中会使用到。

问题:为啥CAN分为RX0,RX1中断呢?

答案:STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文,它们完全由硬件来管理。如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理,如图:

问题:CAN SCE中断时什么?

答案:status chanege error,错误和状态变化中断!

四.CAN分析工具的使用

五. 实验

1.Normal模式测试500K 波特率(定时发送,轮询接收)

1.1 CubeMx配置

1.2 设置Filter过滤,我们只使能FIFO0,并且不过滤任何消息

1.3 开启CAN(注意,默认Cubemx生成的代码并没有can start)

1.4 编写发送函数

1.5 编写轮询接收函数

2.1 CubeMx配置

步骤2,3,4跟polling完全一致,我们来直接说下中断怎么用(主要是使能notifity就行了)

参考内容:

标签:

相关推荐

x 广告

如有意见请与我们联系 邮箱:8 97 180 9 @qq.com

豫ICP备2021032478号-31

Copyright ©  2015-2022 元宇宙版权所有