STM32——CAN通讯基础知识

CAN 协议简介

CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下:

高速CAN可以达到40m/1Mbps。低速CAN可以达到1km/40kbps。

闭环总线网络

CAN 物理层的形式主要有两种,图中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离"闭环网络",它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个"120 欧"的电阻。

STM32F1中包含一个CAN控制器,CAN收发器需要另行安装。一个CAN控制器和一个收发器构成一个CAN节点。

差分信号

高速CAN(ISO11898标准)的电平定义,两者物理层电气特性不一样,因此不能将它们连接在一起。可以看到当CAN_H和CAN_L电压相近,则表示隐性电平,对应逻辑1,当两个电压相差较大,表示显性电平,对应逻辑0。

CAN 的报文种类及结构

在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。

报文的种类

CAN一共规定了 5 种类型的帧,它们的类型及用途说明如表

帧起始(Start Of Frame-SOF):1bit,显性信号,表示数据帧(或远程帧)的开始;

仲裁段(Arbitration Field):包括标识符位(Identifier field-ID)和远程发送请求位(Remote Transfer Request,RTR);

标准帧的ID位是11位,即范围是0x000~0x7FF,而扩展帧的ID是11+18=29位;在CAN协议中,ID决定报文的优先级高低,也决定这拓扑结构的节点是否接收此ID的帧数据;

远程发送请求位,用于区分该帧是数据帧还是远程帧,显性信号(0)代表数据帧(Data Frame),隐性信号(1)代表远程帧(Remote Frame);

控制段(Control Field):标准帧中由扩展标识符位(Identifier Extension bit-IDE,1 bit)、保留位0(Reseved bit0-r0,1 bit)、数据长度编码位(Data Length Code-DLC,4 bits)组成;扩展帧用由两个保留位(Reseved bit,2 bit)、数据长度编码位(Data Length Code-DLC,4 bits)组成;

数据段(Data Field):发送数据的内容,最多8个字节(64bit),它的实际长度会写到前面的数据长度编码位DLC里。

循环校验段(CRC Field):包括循环校验序列(CRC Sequence)和界定符(Delimiter,DEL);循环校验序列用于校验传输是否正确;界定符用于表示循环校验序列是否结束;

确认段(ACK Field):包括确认位(ACK SLOT)和界定符(Delimiter,DEL);确认位在节点收到正确的CRC序列时,发送端的ACK位被置位;界定符表示确认是否正常接收;

帧结束(End of Frame-EOF):7位长度,隐性信号,表示帧的结束;

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

为方便调试,STM32 的 CAN 提供了测试模式,配置位时序寄存器 CAN_BTR 的 SILM 及 LBKM寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式,见图。

推荐一个CAN波特率计算器

非常详细的STM32 CAN通信的贴子,从总线细节到编程实现_stm32使用ll库can通讯-CSDN博客

CAN 发送邮箱

图中的 CAN 外设框图,在标号处的是 CAN 外设的接收 FIFO,它一共有 2 个接收 FIFO,每个 FIFO 中有 3 个邮箱,即最多可以缓存 6 个接收到的报文。当接收到报文时,FIFO 的报文计数器会自增,而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的 RFLM 位,可设置锁定模式,锁定模式下 FIFO溢出时会丢弃新报文,非锁定模式下 FIFO 溢出时新报文会覆盖旧报文。跟发送邮箱类似,每个接收 FIFO 中包含有标识符寄存器 CAN_RIxR、数据长度控制寄存器CAN_RDTxR 及 2 个数据寄存器 CAN_RDLxR、CAN_RDHxR,它们的功能见表。

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

CAN 接收 FIFO

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

代码实践

STM32CubeMX与HAL库学习--简单的CAN回环测试_stm32f407 can回环测试-CSDN博客

通过百度网盘分享的文件:CAN

链接:https://pan.baidu.com/s/1PnG0HpaS_QaEgPNi3dDuvQ?pwd=kjpg

提取码:kjpg

--来自百度网盘超级会员V2的分享

相关推荐
stm32发烧友15 小时前
基于STM32的智能家居安防系统设计
stm32·嵌入式硬件·智能家居
LightningJie15 小时前
STM32(hal库)中的定时器从模式TIM_SlaveConfigTypeDef结构体中的含义,以及可选参数的含义都是什么意思
stm32·单片机·嵌入式硬件
小齿轮lsl16 小时前
无桥Boost-PFC 双闭环控制MATLAB仿真
单片机·嵌入式硬件·matlab·电力电子·电源硬件·pfc
Matlab程序猿小助手18 小时前
【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。
开发语言·嵌入式硬件·算法·matlab·机器人
鱼与仙人掌19 小时前
STM32:ADC
stm32·单片机·嵌入式硬件
yangpipi-20 小时前
Linux系统程序设计--2. 文件I/O
linux·stm32·单片机
沐欣工作室_lvyiyi1 天前
汽车牌照识别系统的设计与仿真(论文+源码)
人工智能·单片机·fpga开发·汽车·单片机毕业设计·matlab车牌识别
wenchm1 天前
细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的另一种方法
stm32·单片机·实时音视频
雷打不动的晴天1 天前
关于PCB供电保护的问题
嵌入式硬件
盼海1 天前
stm32 ADC实例解析(3)-多通道采集互相干扰的问题
stm32·单片机·嵌入式硬件