STMCU小助手
发布时间:2022-2-5 23:00
|
1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知。通讯协议是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。 CAN通讯全称控制器局域网通讯,是用来在局域网中高效传输,处理信息的一种通讯方式。它采用数据块编码的方式,数据块根据帧类型的不同有四种格式,可使不同的节点接收到相同的数据,然后再根据各节点内CAN配置选择处理还是丢弃该信息(这与TCP/IP协议栈的链路层的MAC地址过滤很相似,是可以互通理解的),CAN的位流是按照非归零(NRZ)码方式编码,一个完整的位电平有显性和隐性两种方式。显性和隐性是根据CAN总线上的差分电压VCAN1H-VCAN1L, 若小于阈值则为隐性位,代表逻辑1,大于阈值则为显性位,代表逻辑0,这种将单电平转换成两根差分线的方式提高了电路的可靠性,不过也决定局域网里同时只能有一路数据传输,因此CAN通讯是半双工的。 2.CAN通讯帧格式 CAN报文有四种不同的帧类型: (1).数据帧:数据帧将数据从发送器传输到接收器。 数据帧和可以使用标准帧和扩展帧两种格式。它们用一个帧间空间与前面的帧分隔。
1).帧起始(SOF) 标志帧的开始,由一个“显性(0)”位构成。只有在总线空闲时才允许节点发送(信号),其它所有节点必须同步于首先开始发送报文的节点的帧起始前沿。 2).仲裁场 由标识符和传送帧类型(RTR)组成的仲裁场 标准帧格式: ![]()
扩展帧格式:
![]() 对于数据帧 RTR恒为0,SRR恒为1,因此可以根据仲裁场起始第12个字符数判断是标准帧还是扩展帧。 3).控制场 保留位R1,R0(恒为0),以及帧长度选择位DLC(4位)构成的。 4).数据场 由数据帧里的发送数据组成,长度由DLC控制,但小于等于8字节。 5).CRC场 由CRC序列(CRC Sequence),以及CRC界定符(CRC Delimiter)构成。CRC序列之后是CRC界定符,它包含一个单独的“隐性(1)”位。 6).应答场(ACK Field) 2位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)中写入显性位(0),在返回给发送器,完成一次通讯(半双工). ① 应答间隙 所有接收到匹配CRC序列的节点会在应答间隙期间用“显性(0)”的位写入发送器的“隐性(1)”位来组成应答数据。 ② 应答界定符 应答界定符是应答场的第二位,并且必须为“隐性(1)”的位。因此,应答间隙(ACK Slot)被两个“隐性”的位所包围,也就是CRC界定符和应答界定符。 7).帧结束 由7个隐性位构成,代表帧的结束。 (2).远程帧:总线节点发出远程帧,请求发送具有同一识别符的数据帧。
![]() 远程帧除了RTR位默认为1,没有数据场外,其它与数据帧相同,不在赘述。 (3).错误帧:报文发送过程中,检测到任一节点出错,即于下一位发送出错帧,通知发送端停止发送。 ![]()
错误标志:有两种形式的错误标志:激活错误标志和认可错误标志。 1).激活错误”标志由6个连续的“显性”位组成 2).“认可错误”标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。 错误界定符:错误界定符包括8个“隐性”的位。 错误标志传送了以后,每一个节点就发送一个“隐性”的位,并一直监视总线直到检测出一个“隐性”的位为止,然后就开始发送其余7个“隐性”位。 (4).过载帧:接收端用于要求发送端延缓发送下一个数据帧或者远程帧。
1).超载标志: 过载标志由6个“显性”的位组成。过载标志的所有形式和“激活错误”标志的一样 2).过载界定符包括8个“隐性”的位,具体动作与错误界定符一致 CAN通讯是数据块编码的半双工通讯方式,没有主从设备区别,因此发出报文的节点为该报文的发送器,该节点在总线空闲或丢失仲裁前恒为发送器;如果一个节点不是报文发送器,并且总线不处于空闲状态,则该节点为接收器。 3.CAN通讯的STM32实现 CAN协议是比较复杂的一种通讯协议,因此需要在学习如何使用stm32实现前了解协议本身的很多内容,下面就可以开始stm32中CAN协议环回测试,用来简单的理解CAN协议的测试。既然是要STM32实现,那么步骤的设计如下: (1).工作原理图 了解了CAN通讯,下面进入正题,CAN通讯连接首先看原理图如下:
![]() 从上面可以看出CAN1_TX: PD1 CAN1_RX PD0 (2).CAN硬件驱动配置 CAN通讯端口配置还是比较简单的:
CAN通讯模式配置(因为是简单的测试,因此配置为环回模式,过滤器配置为屏蔽位模式)
完成了驱动方面的配置,下面要进行的就是发送CAN数据和接收CAN数据的生成和实现了:
因为错误帧和超载帧是有stm32自带的硬件实现的,因此由我们提供的是远程帧和数据帧,单个帧内数据0~8字节,如果要发送多个数据,需要在其上添加传输层实现,具体实现我会在以后在研究(双CAN多帧通讯实验)。 主函数的实现如下:
如此就完成了简单的CAN环回测试实验,具体实验可通过串口接收端口查看,如下: ![]()
|
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
STM32G0 系列 I2C 通信异常典型案例分析与解决方案总结
经验分享 | LAT1490 两个STM32G0 I2C 通信异常的案例分析
经验分享 | STM32G0 I2C bootloader Go 命令后调试连接失败:DBG_SWEN 位复位修复
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
微信公众号
手机版