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的分享