STM32 的 CAN 通讯全攻略

目录

一、CAN 通讯概述

二、 CAN 通讯原理

1.ISO11898 标准下的物理层特征

2.CAN 协议的帧类型 

3. 总线仲裁介绍

 4.位时序

5.STM32 CAN 控制器简介

6.标识符筛选器 

三、软件设计

1.发送流程

1.1初始化 CAN 控制器

1.2准备发送数据

1.3 将数据填充到发送缓冲区

1.4启动发送 

1.5等待发送完成

2.接收流程 

2.1初始化 CAN 控制器

2.2开启接收中断(可选)

2.3等待数据接收

2.4读取数据 

2.5处理接收的数据


一、CAN 通讯概述

STM32 的 CAN 通讯是一种常用于嵌入式系统的串行通信协议,具有高可靠性和多主控制等特点,广泛应用于汽车电子、工业自动化等领域。

CAN 协议经过 ISO 标准化后有两个标准:ISO11898 标准和 ISO11519 - 2 标准。其中 ISO11898 是针对通信速率为 125Kbps - 1Mbps 的高速通信标准,而 ISO11519 - 2 是针对通信速率为 125Kbps 以下的低速通信标准。STM32 的 CAN 控制器支持 CAN 2.0A 和 CAN 2.0B Active 版本协议。CAN 2.0A 只能处理标准数据帧,扩展帧的内容会识别为错误;CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。

CAN 总线物理层主要有两种形式,一种是遵循 ISO11898 标准的高速、短距离 “闭环网络”,总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个 “120 欧” 的电阻。另一种是遵循 ISO11519 - 2 标准的低速、远距离 “开环网络”,最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个 “2.2 千欧” 的电阻。

CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。差分信号传输方式具有抗干扰能力强、能有效抑制电磁干扰、时序定位精确等优点。

STM32 的 CAN 通讯具有多主控制、系统的柔软性、通信速度较快且通信距离远、具有错误检测和恢复功能、故障封闭功能以及连接节点多等特点。这些特点使得 CAN 特别适合工业过程监控设备的互连,越来越受到工业界的重视。

二、 CAN 通讯原理

1.ISO11898 标准下的物理层特征

CAN 控制器根据 CAN_L 和 CAN_H 上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。显性电平对应逻辑 “0”,此时 CAN_High和 CAN_Low 之差为 2.5V 左右;隐性电平对应逻辑 “1”,此时 CAN_High和 CAN_Low 电压都为 2.5V 左右,电位差为 0V。显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。另外,在 CAN 总线的起止端都有一个 120Ω 的终端电阻,用于匹配总线阻抗,减少回波反射,提高数据通信的抗干扰能力以及可靠性。

2.CAN 协议的帧类型 

CAN 协议有数据帧、遥控帧、错误帧、超载帧和间隔帧五种类型帧。

其中,数据帧最常用且复杂,一般由 7 个段构成,包括帧起始、仲裁段、控制段、数据段、CRC 段、应答段和帧结束

帧起始由 1 个显性位构成,标志着报文的开始。

仲裁段表示该帧优先级,标准格式包含 11 位标识符和远程发送请求位 RTR,扩展格式包含 29 位标识符、SRR 位、IDE 位和 RTR 位。

控制段包含数据长度等信息。

数据段包含要发送的 0 - 8 个字节的数据。

CRC 段用于校验数据是否正确发送。

应答段用于确认是否正常接收。

帧结束由连续的 7 个隐性位组成。

 

3. 总线仲裁介绍

同时多个单元发送数据时,总线仲裁过程如下:多个单元同时开始向总线发送数据,开始部分数据格式一样,无法区分优先级。直到某个时刻,一个单元输出隐性电平,而另一个单元输出显性电平,此时输出隐性电平的单元仲裁失利,立刻转入接收状态工作,不再与其他单元竞争,而输出显性电平的单元则顺利获得总线使用权,继续发送自己的数据。规律为:总线空闲时,最先发送的单元获得发送优先权,一旦发送,其他单元无法抢占;如果有多个单元同时发送,则连续输出显性电平多的单元,具有较高优先级

 4.位时序

位速率是由发送单元在非同步的情况下发送的每秒钟的位数。一个位一般可以分为同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)和相位缓冲段 2(PBS2)

这些段又由可称为 Time Quantum(Tq)的最小时间单位构成,1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。位时间 = 1 / 波特率,知道位时间,我们就可以知道波特率以及 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

5.STM32 CAN 控制器简介

STM32F4 的 bxCAN 支持 CAN 协议 2.0A 和 2.0B 主动模式,波特率最高达 1Mbps,支持时间触发通信,具有 3 个发送邮箱,具有 3 级深度的 2 个接收 FIFO,可变的过滤器组(28 个,CAN1 和 CAN2 共享)。它的设计目标是以最小的 CPU 负荷来高效处理大量收到的报文,对于安全紧要的应用,提供所有支持时间触发通信模式所需的硬件功能。

6.标识符筛选器 

CAN 的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值,来决定是否接收对应消息。STM32 CAN 控制器提供了 28 个可配置的筛选器组,可降低 CPU 处理 CAN 通信的开销。STM32 CAN 控制器每个筛选器组由 2 个 32 位寄存器组成。根据位宽不同,每个筛选器组可提供

  • 1 个 32 位筛选器,包括 STDID [10:0]、EXTID [17:0]、IDE 和 RTR 位;
  • 或者2 个 16 位筛选器,包括 STDID [10:0]、IDE、RTR 和 EXTID [17:15] 位。

筛选器可配置为屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照 “必须匹配” 或 “不用关心” 处理。

 

三、软件设计

1.发送流程

1.1初始化 CAN 控制器
  • 配置时钟:使能 CAN 控制器对应的时钟源。
  • 设置工作模式:如正常模式、环回模式等。
  • 配置波特率:通过设置位时序参数(同步段、传播段、相位缓冲段等)来确定合适的波特率。
  • 初始化过滤器:设置过滤器的模式、位宽、标识符等,以确定哪些报文可以被接收。
1.2准备发送数据

定义一个CAN_TxHeaderTypeDef结构体变量,设置报文的标识符、数据长度、发送类型等信息。例如:

CAN_TxHeaderTypeDef txHeader;
txHeader.StdId = 0x123; // 标准标识符
txHeader.ExtId = 0; // 不使用扩展标识符
txHeader.DLC = 8; // 数据长度为 8 字节
txHeader.TransmitGlobalTime = DISABLE;
1.3 将数据填充到发送缓冲区

定义一个数组用于存储要发送的数据。例如:

uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
1.4启动发送 

使用HAL_CAN_AddTxMessage函数将数据发送到 CAN 总线。例如:

HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &txMailbox);
if (status!= HAL_OK) {
    // 处理发送错误
}

该函数会返回发送状态,可根据返回值判断发送是否成功。如果发送失败,可以根据具体情况进行错误处理。

1.5等待发送完成

可以通过查询发送邮箱的状态标志或者使用中断方式来判断发送是否完成。例如,使用轮询方式:

while (HAL_CAN_IsTxMessagePending(&hcan, txMailbox)) {
    // 等待发送完成
}

2.接收流程 

2.1初始化 CAN 控制器
  • 配置时钟:使能 CAN 控制器对应的时钟源。
  • 设置工作模式:如正常模式、环回模式等。
  • 配置波特率:通过设置位时序参数(同步段、传播段、相位缓冲段等)来确定合适的波特率。
  • 初始化过滤器:设置过滤器的模式、位宽、标识符等,以确定哪些报文可以被接收。
2.2开启接收中断(可选)

如果希望使用中断方式接收数据,可以配置相应的中断并开启中断。例如:

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *hcan) {
    // 接收中断处理函数
}
2.3等待数据接收

可以通过查询接收邮箱的状态标志来判断是否有新的数据到达。例如:

if (HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) > 0) {
    // 有数据到达
}
2.4读取数据 

当检测到有数据接收后,使用HAL_CAN_GetRxMessage函数从接收邮箱中读取数据。例如:

CAN_RxHeaderTypeDef rxHeader;
uint8_t rxData[8];
HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rxHeader, rxData);

该函数会将接收到的报文信息填充到传入的结构体和数据缓冲区中。

2.5处理接收的数据

根据实际应用需求对接收的数据进行处理。例如,可以根据标识符判断数据的来源和类型,然后进行相应的操作。

STM32是一种高性能的32位微控制器,具有广泛的应用领域。其中,CAN(Controller Area Network)通讯STM32最常用的通信协议之一。下面是关于STM32 CAN通讯例程的一些介绍。 STM32 CAN通讯例程是一种用于实现CAN通讯功能的开发示例。该例程提供了一套完整的CAN通讯工作流程,包括初始化CAN模块、配置CAN通讯参数、发送CAN帧和接收CAN帧等。 在使用STM32 CAN通讯例程之前,首先需要在STM32开发板上连接CAN总线,以实现外部设备和STM32的通信。然后,需要通过调用相应的函数来初始化CAN模块,并设置通讯参数,如波特率、过滤器和模式等。 一旦CAN模块初始化完毕,就可以使用相应的函数来发送和接收CAN帧。发送CAN帧需要将数据打包为CAN帧的格式,并使用相应的标识符将其发送到总线上。接收CAN帧需要使用相应的函数持续监听总线上的数据,并将接收到的数据解析为可用的格式。 在进行CAN通讯时,还可以使用中断或DMA来处理接收和发送数据。中断可以实现数据的实时处理和异步通知,而DMA可以实现高速的数据传输,提高系统性能。 STM32 CAN通讯例程具有广泛的应用场景,如汽车电子系统、工业自动化控制和智能家居等。通过学习和理解STM32 CAN通讯例程,开发者可以更好地使用STM32的CAN通讯功能,实现各种实际应用的需求。 总之,STM32 CAN通讯例程提供了一套方便易用的开发示例,帮助开发者快速上手并实现CAN通讯功能。通过学习该例程,开发者可以扩展STM32的应用范围,实现更多有趣和实用的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千千道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值