HAL库-STM32F103-CAN通信配置(含代码)

本文介绍了如何使用STM32通过CAN总线进行设备控制,涉及硬件电路设计(包括收发芯片、终端电阻和STM32接口),软件设计(波特率设置、数据帧发送流程和CAN发送函数),以及CAN配置和发送仲裁策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标

通过CAN总线,用STM32对设备利用CAN模块发送指令,从而实现对设备的控制。

硬件设计

①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。

②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上60-120欧终端电阻。

电路设计

引脚1:CAN-TX传输数据输入;从CAN控制器读取数据到总线驱动器,与STM32的引脚PA12相连

引脚2:接地(此处的地与其他的地隔离)

引脚4:CAN-RX接收数据输出;从总线线路读出数据到CAN控制器,与STM32的引脚PA11相连

引脚3:3.3V供电或者5V供电

引脚5:基准电压输出,可以选择不适用该引脚

引脚6,7:CAN总线的高、低端

引脚8:选择高速模式或静音模式的输入(高速模式是正常工作模式,通过将引脚S接地来选择。如果引脚S未连接,则为默认模式。但是,为确保仅使用高速模式的应用中的EMI性能,建议将引脚S接地。在静音模式下,发射机被禁用。所有其他IC功能继续运行。通过将引脚S连接到VCC来选择静音模式,并可用于防止由于CAN控制器失控而导致网络通信受阻。)

软件设计

其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。

CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。

CAN配置

1.波特率:通过配置挂在APB1总线上的CAN1模块的几个参数设置从而得到通信速率。

然后通过波特率计算公式(波特率= APB1外设总线速率  * (1/(相位缓冲段 1+相位缓冲段 2+重新同步跳跃段)*(预分频系数)))来设置波特率

这个参数代表波特率=36M/(9*(5+2+1))=500K bps

注意:①相位缓冲段1设置范围:1-16 ②相位缓冲段2设置范围:1-8  ③重新同步跳跃段一般设置为1

2.发送端

(1)设置的数据格式

CAN协议规定发送的数据有几种:数据帧,遥控帧,错误帧,过载帧,间隔帧。我们取其一种:数据帧来举例,故名思意,这种帧就是用来发送数据的,也是应用最广泛的一种数据帧。

帧的格式如下:

(2)发送邮箱

用于存放要发送的数据。

程序选择 1 个空置的邮箱(TME=1)-->设置标识符(ID)数据长度(DLC)和发送数据(数据帧)-->设置 CAN_TIxR 的 TXRQ 位为 1,请求发送-->邮箱挂号(等待成为最高优先级)-->预定发送(等待总线空闲)-->发送-->邮箱空置。

(3)设置过滤器

(4)发送仲裁

如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。
FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

CAN发送函数如下:

在主函数中调用可实现单片机每1s上报一次:

参考博客:https://blog.csdn.net/m0_37844072/article/details/87897004

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值