文章分两部分,一是CAN的详解,二是常见问题汇总;文章长,但是都是重点精华,往有帮助~
(参考的是火哥的STM32有关CAN协议的文档)
一、CAN的详解
1. 物理层
- CAN总线:成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。
- CAN是异步通讯,只有CAN_High和CAN_Low两条信号线,且这两条信号线是差分信号线,以差分信号的形式通讯;
- CAN是半双工的,在同一时刻,一个通讯节点发送消息,其他节点只能接收消息;
- CAN物理层的形式分为闭环总线和开环总线,闭环总线是高速短距离的,长度最长40m,通信速度最高10Mbps;开环总线是低速远距离的,长度最长1km,通信速度最高125kbps。开环闭环的区别在于差分信号线是不是连在一起的。
- CAN总线可以挂载多个节点:
- 差分信号:两根信号线的幅度相同,相位相反,通过电压差代表电平1和0;差分信号优点:抗干扰能力强,因为有外界噪声干扰时,会同时耦合到这两条信号线上,由于接收端只关心信号的差值,因此噪声可以抵消。
- 逻辑电平为1是隐性电平,CAN_High和CAN_Low电压都是2.5v,压差为0;逻辑电平为0显性电平,CAN_High电压3.5v和CAN_Low电压1.5v,压差2v。
2. 协议层
- CAN中,每个数据位又分为多个段,包括:SS、PTS、PBS1、PBS2;一个数据位由8~25个Tq表示,这个段的作用是保证让该节点与总线的时序同步,确保通讯正常;
- 通讯波特率由Tq的时间长度,以及每位有多少个Tq决定:
- CAN协议是如何通讯的?对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。具体:在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,这样的报文就被称为 CAN 的“数据帧”。
- CAN有5种数据帧,每种数据帧的用途不一样:
- 具体介绍数据帧:数据帧以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束,在它们之间,分别有仲裁段、控制段、数据段、 CRC 段和 ACK 段。
- 帧起始,以显性电平开始,用于通知各个节点将有数据传输;
- 仲裁段:通过仲裁ID来决定优先级,优先级高的ID先把数据发出去,利用隐性和显性电平作为仲裁,谁先出现隐性电平,谁就先失去对总线的占有权。标准格式ID是11位,扩展格式ID为29位。
- 控制段中的DLC段,表示报文数据段有多少个字节。
- 数据段有0到8个字节组成。
- CRC段是校验位,接收节点算出的 CRC 码跟接收到的 CRC 码不同, 则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。
- ACK段是应答段,发送节点发送的是隐性位,而接收节点则发送显性位以示应答。
- 帧结束,由7个隐性位表示结束。
3. STM32有关CAN的配置
- CAN 控制内核包含了各种控制寄存器及状态寄存器,如主控制寄存器 CAN_MCR 及位时序寄存器 CAN_BTR。
- 主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式,如自动唤醒、自动离线;
- 位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数;
①测试模式包括:正常模式、静默模式、回环模式及静默回环模式;
- 正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。
- 静默模式只可向总线发送数据1,不能发送数据0,可从总线接收数据,用于监测,它可以用于分析总线上的流量;
- 回环模式,输入端只接收自己发送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检;
- 回环静默模式,输入端只接收自己发送端的内容,不接收来自总线上的内容,用于自检;
②位时序:
STM32 的 CAN 外设位时序中只包含 3 段,分别是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采样点位于 BS1 及 BS2 段的交界处;这个位时序对应了CAN一个数据位的不同段,即N*Tq=一个数据位;
③计算波特率:
一个数据位的Tq是等于同步段、BS1和BS2段这三个段Tq的总和,CAN1和CAN2挂载在APB1上,位时序寄存器可以分频时钟,Tq=分频数/36MHz,CAN的波特率=1/N*Tq。
二、STM32对CAN的发送邮箱
- 3个发送邮箱,最多可以缓存 3 个待发送的报文;
- 当我们要使用 CAN 外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中;
三、STM32对CAN的接收邮箱FIFO:它一共有 2 个接收 FIFO,每个 FIFO 中有 3 个邮箱,即最多可以缓存 6 个接收到的报文;
- 通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到 STM32 的内存中。
- 接收报文时,通过检测标志位获知接收 FIFO 的状态,若收到报文,可调用库函数CAN_Receive 把接收 FIFO 中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文了。
四、验收筛选器:有 14个筛选器组,每个筛选器组有 2 个寄存器。
发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作, STM32 的 CAN 外设接收报文前会先使用验收筛选器检查,只接收需要的报文到 FIFO 中;
- 筛选器工作的时候,可以调整筛选 ID 的长度及过滤模式
(1) 标识符列表模式,它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
(2) 掩码模式,它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。
4. STM32软件编程
(1)配置GPIO,开时钟,设定好对应的引脚,对应到TX和RX;
- TX推挽输出、RX浮空输入,引脚复用功能重映射。
(2)配置CAN初始化结构体,即配置工作模式,先开时钟;
(3)配置筛选器
(4)配置发送报文:包括使用扩展还是标准的ID,选择扩展还是标准模式,发送是数据还是其他内容,设置数据的长度,设置将要发送的数据:
(5)在中断中接收报文,因此要分为以下两个步骤
- 配置NVIC结构体,设置好优先级,包括优先级组、抢占优先级、子优先级;
- 在中断服务函数中,接收报文时,通过检测标志位获知接收 FIFO 的状态,若收到报文,可调用库函数CAN_Receive 把接收 FIFO 中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文了。(注意:必须要在中断内调用 CAN_Receive 函数读取接收FIFO 的内容,因为只有这样才能清除该 FIFO 的接收中断标志,如果不在中断内调用它清除标志的话,一旦接收到报文, STM32 会不断进入中断服务函数,导致程序卡死)
二、CAN的常见问题
1、Can总线有什么了解?可以从物理层、协议层再到STM32对CAN三个方面去介绍。
2、仲裁机制?以ID来区别优先级,若有两个节点同时发送数据,那么由于是半双工,在一个时间只能一个节点发送数据,那么就要比较这两个节点的ID,谁的ID先出现隐性电平,即高电平,谁就失去了对CAN发送数据的控制权。
3、can总线,波特率?(与Tq的大小,即与时钟大小有关;一个数据位包括的Tq的个数有关)帧?(了解到的是数据帧,包括起始帧、仲裁帧、控制帧、数据帧、校验帧、应答帧、结束帧)报文?(具体:在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,这样的报文就被称为 CAN 的“数据帧”)
4、can的传输距离,分为开环和闭环,闭环是高速近距离:10Mbps传输40m,开环是低速远距离:125kbps传输1km。
5、CAN初始化配置步骤?看软件编程那里
6、CAN发送数据格式?
总结就是:包括使用扩展还是标准的ID,选择扩展还是标准模式,发送是数据还是其他东西,设置数据的长度,设置将要发送的数据。
7、CAN总线是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电子干扰性,并且能够检测出产生的任何错误。文章来源:https://www.toymoban.com/news/detail-715844.html
8、CAN总线原理:CAN总线以广播的方式从一个节点向另一个节点发送数据,当一个节点发送数据时,该节点的CPU把将要发送的数据和标识符发送给本节点的CAN芯片,并使其进入准备状态;一旦该CAN芯片收到总线分配,就变为发送报文状态,该CAN芯片将要发送的数据组成规定的报文格式发出。此时,网络中其他的节点都处于接收状态,所有节点都要先对其进行接收,通过检测来判断该报文是否是发给自己的。文章来源地址https://www.toymoban.com/news/detail-715844.html
到了这里,关于CAN协议详解+常见问题汇总,吐血整理!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!