历史上的今天
今天是:2025年12月08日(星期一)
2022年12月08日 | STM32CubeMX 之 CAN通讯
2022-12-08 来源:zhihu
一、CAN总线简介
CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。
CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,这点与RS485类似,但两者电平值不同。CAN总线电平分为显性电平和隐性电平。
CAN总线采用两种互补的逻辑数值“显性”和“隐性”。其中,“显性”数值表示逻辑“0”,而“隐性”表示逻辑“1”。
当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。 在“隐性”状态下,VCAN_H和VCAN_L被固定于平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V,如下图所示:

二、CAN帧结构
CAN总线节点上的节点发送数据,是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据,不是则忽略。
● 网络上任何一个节点在任何时候都可以发送数据;
● 多个节点发送数据,优先级低主动退出发送;
● 短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码;
● CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能。
至于报文传输,则由以下5个不同的帧类型所表示和控制:
● 数据帧:数据帧携带数据从发送器至接收器。
● 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
● 错误帧:任何单元检测到总线错误就发出错误帧。
● 帧间隔:数据帧(或远程帧)通过帧间空间与前述的各帧分开。
● 过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供附加的延时。
三、硬件设计
现在很多单片机中内置CAN总线协议控制器,只要外接总线驱动芯片和适当的抗干扰电路就可以很方便地建立一个CAN总线智能测控节点。
驱动芯片如下:

四、软件设计
这里以STM32L431单片机为例,建立STM32CubeMX工程,使能CAN接口,设置时钟及分配系数等参数,如下图所示:

STM32L431的系统时钟为80M,上图中设置的波特率为100kbps。计算方法如下:
CAN波特率为 = 系统时钟/Prescaler/ (SJW+BS1+BS2) = 80MHz/32/(1+16+8) = 100KHz
使能接收中断:

生成代码后,添加CAN滤波器配置函数,如下:

编写接收中断函数和发送数据函数:


在主函数中调用滤波器配置函数,启动CAN总线,使能接收中断,并循环发送测试数据:

通过USB转CAN的工具可以在电脑端查看数据是否成功。可以看到,数据可以正常发送。

史海拾趣
|
红外线发射接收感应开关 要求: 1、 模组由发射管和接收管组成,状态转换时(模组对人体感应到和感应不到两种状态)由一红色LED闪烁一下来指示,模组前面加一个红外线滤光片(可由一具有红外线滤光片作用的塑料外壳替代),不受其他家电红外线遥控 ...… 查看全部问答> |
|
概述 12232F是一种内置8192个16*16点汉字库和128个16*8点ASCII字符集图形点阵液晶显示器,它主要由行驱动器/ 列驱动器及128×32全点阵液晶显示器组成。可完成图形显示,也可以显示7.5×2个(16×16点阵)汉字.与外部CPU接口采用并行或串行方式控制。 ...… 查看全部问答> |
|
级联信号处理器的FPGA实现 需要的下过去看看 摘要:现代通信系统中,数字化已成为发展的必然趋势,数字信号处理则是数字系统中的重要环节。在数字信号处理方面提出一种级联信号处理器的FPGA实现方案,用以取代昂贵的专用数字处理芯片。首先对级联 ...… 查看全部问答> |
|
QT是跨平台的程序设计库,在windows下的程序往往想要有一个好看的图标,方法如下: 1、有无图标的区别: 2、首先要准备好.ico图标 下面这个是可以转换的网站:http://www.ico.la/old.html 可以格式 ...… 查看全部问答> |
|
replyreload += \',\' + 1328453;我们在实际电子产品设计调试过程中,经常会有这样的疑问,MOS管为什么会被静电击穿?静电击穿是指击穿MOS管G极的那层绝缘层吗?击穿就一定短路了吗?JFET管静电击穿又是怎么回事? Timson,如果您要查看本帖隐藏内 ...… 查看全部问答> |
|
#include \"msp430g2553.h\" #include \"UART.h\" void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdo ...… 查看全部问答> |
|
IC封装小知识: 经常看到IC封装中使用BSC,那么BSC到底是什么意思呢? BSC的全称是Basic Spacing between Centers(中心基本距离),一般用在说明IC两引脚中心的基本间距。这是一个无误差的,理论的真实位置尺寸。 … 查看全部问答> |




