目录
一.CAN协议简介
CAN是Controller Area Network的缩写。它具有高可靠性和错误检查能力,广泛应用在汽车计算机控制系统和环境恶劣,电磁辐射强及振动大的工业环境。
二.CAN物理层
CAN是异步通讯,半双工。有CAN_High和CAN_Low两条通讯信号线共同组成一组差分信号线。
CAN物理层的形式主要分为闭环总线和开环总线网络。
- 闭环总线网络:高速,短距离,两端串联120欧的电阻
- 开环总线网络:低速,远距离。两根总线独立,不形成闭环,每条线上串联2.2k欧电阻
什么是差分信号?差分信号又称差模信号。使用差分信号传输时,需要两根线,这两个信号的振幅相等,相位相反,通过两条线的电压差来表示逻辑0和逻辑1.
差分信号的抗干扰性强,共模噪声完全被抵消。它对外部的电磁干扰可以有效抑制。差分信号的时序定位精准。由于差分信号的这些优点,在USB协议,485协议,以太网协议以及CAN协议的物理层中都使用了差分信号传输。
CAN总线上可以挂载多个节点,节点之间的信号经过总线传输。CAN总线对数据内容进行编码,所以网络中的节点数量不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN_Tx和CAN_Rx使用普通的类似TTL的逻辑信号,而CAN_High和CAN_Low是差分信号。收发器起到两种信号相互转换的作用。
在高速CAN协议中,表示逻辑1(隐形电平),电压差为0;表示逻辑0(显性电平),电压差为2V。在CAN协议中,必须使它处于隐形电平或者显性电平。如果同一时间有一个节点是隐形电平(逻辑1),另一个节点是逻辑0(显性电平),类似I2C的线与特性将使它处于显性电平逻辑0的状态。
三.CAN的协议层
CAN没有时钟信号线,节点间使用配置好的波特率进行通讯,还会使用位同步方式来吸收误差。
1.位时序
为了实现位同步,CAN协议把每一个数据位的时序分解成SS,PTS,PBS1,PBS2四段。分解的最小时间单位为Tq。
信号的采样点在PBS1和PBS2之间。
- SS:同步段。当检测到信号跳变沿在SS范围内,则表示节点与总线是同步的,采样点是有效的。SS段固定为1Tq.
- PTS:这个时间段用来补偿网络的物理延时。
- PBS1:用来补偿边沿阶段的误差,可以加长。
- PBS2:用来补偿边沿阶段的误差,可以缩短。
举例说明PBS1和PBS2对于位同步的作用:
当信号跳变的边沿不在SS段内,而是出现在SS段之前时,可以通过缩短PBS2,使得下一次边沿来临时,落在SS段内;当信号跳变边沿出现在SS段之后时,可以通过加长PBS1,使得下一次边沿来临时,落在SS段内。
2.CAN的报文
(1)有哪些种类?
- 数据帧:向外发送数据
- 遥控帧:请求数据
- 错误帧:通知校验错误,请求重新发送上一个数据
- 过载帧:通知远端节点本节点尚未做好接收准备
- 帧间隔:将数据帧和遥控帧与前面的帧分离开来
(2)数据帧的结构?
- 帧起始:1个低电平,用于通知各个节点有数据传输,其他节点通过帧起始信号的电平跳变边沿进行硬同步。
- 帧结束:7个连续的高电平。
- 仲裁段:主要内容是ID信息。数据帧有标准格式和扩展格式,区别在于ID信息的长度。
- 控制段:
- RTR:远程传输请求位。为1,是遥控帧;为0,是数据帧。
- IDE:标识符扩展位。为1,是扩展格式;为0,是标准格式。
- SRR:用于代替标准格式的RTR,只用于扩展格式。
- r0,r1:默认低电平,是保留位。
- DLC:数据长度,表示报文中的数据段有多少个字节。
- 数据段:发送的数据,MSB先行。
- CRC:校验码。当出现错误时,它会像发送节点反馈,利用错误帧请求重新发送。
- ACK:接收节点发送0表示应答。
ID信息在CAN协议中的作用?
- ID信息决定数据帧发送的优先级。由于线与特性,当总线上同时出现两个节点竞争主权时,ID信息中首先出现低电平的即为优先者。CAN协议不分配中断优先级或者地址,谁可以优先占有总线由信息的重要性决定,也就是ID信息。
- ID信息决定其他节点是否会接收这个数据帧。因为在CAN总线上数据都是广播出去的,所以在总线上的所有节点都可以收到其他节点的信息。由于CAN控制器大多具有根据ID信息过滤报文的功能,它通过ID信息来分辨是否是自己要接收的报文。
四.CAN外设
1.主控制寄存器CAN_MCR
- DBF调试冻结:处于程序调试模式才使用。可以设置CAN处于工作模式还是禁止收发状态,禁止收发时仍可以访问接受FIFO中的数据。
- TTCM时间触发模式:设置CAN的时间触发通信模式。在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR,CAN_TDTxR寄存器中。可以利用它实现标准分时同步通信功能。
- ABOM自动离线管理:当节点检测到他发送错误或者接受错误超过一定值时,会自动离线管理。离线状态下,不能接收或者发送。
- AWUM自动唤醒:在使用软件进入睡眠后,如果使用自动唤醒,在检测到总线活动时,会自动唤醒。
- NART自动重传:当报文发送失败会自动重传直到成功为止。
- RFLM锁定模式:锁定接收FIFO。锁定之后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则会覆盖掉之前的报文。
- TXFP报文发送优先级的判定方法:当邮箱中有多个报文需要发送时,控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。
2.位时序寄存器CAN_BTR
- SILM:为0,正常模式;为1,静默模式
- LBKM:为1,允许回环模式;为0,禁止回环模式
CAN有四种工作模式。由位时序寄存器的SILM和LBKM组合控制。
静默模式可以用于分析总线上的流量,用于检测。
回环模式可以用于自检。
回环静默模式在热自检的时候使用(自我检查的时候,不会干扰总线)。
在STM32中的位时序:
SYNC_SEG,BS1,BS2三段,采样点位于BS1和BS2交界处。SYNC_SEG的固定长度是1Tq.BS1和BS2的长度SJW可以在位时序寄存器中配置。
波特率:
STM32的CAN1和CAN2挂载在APB1上。APB1总线的最大频率是36MHz。在使用CAN2时,必须打开CAN1的时钟。
3.CAN的发送邮箱
CAN外设有三个发送邮箱,即最多可以缓存3个待发送报文。 每个发送邮箱中包含有四个寄存器。
- 标识符寄存器CAN_TIxR(存储待发送报文的ID,扩展ID,IDE位及RTR位),
- 数据长度控制寄存器CAN_TDTxR(存储待发送报文的DLC段),
- 低位数据寄存器CAN_TDLxR(存储数据段的低四个字节内容),
- 高位数据寄存器CAN_TDHxR(存储高四字节的内容)
发送邮箱的工作过程:当需要发送报文时,把报文分解成各个段存储到不同的寄存器中,并对标识符寄存器的发送请求位置1,即可把数据发送出去。
4.CAN的接收FIFO
CAN外设有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收报文。当接收到报文时,FIFO报文计数器会自增,当报文被读取之后,计数器会自减。和发送邮箱类似,FIFO有四个寄存器。
- 标识符寄存器CAN_RIxR(存储接收报文的ID,扩展ID,IDE位及RTR位),
- 数据长度控制寄存器CAN_RDTxR(存储接收报文的DLC段),
- 低位数据寄存器CAN_RDLxR(存储数据段的低四个字节内容),
- 高位数据寄存器CAN_RDHxR(存储高四字节的内容)
5.验收筛选器
STM32F103的CAN外设有14个筛选器组,每组有两个寄存器。CAN1和CAN2共用筛选器。筛选器的作用下,节点只接受需要的报文到自己的FIFO中。筛选器可以调整筛选ID的长度和过滤模式
(1)根据筛选ID长度分类:
- 32位:STDID[10:0],EXTID[17:0],IDE,RTR
- 16位:STDID[10:0],EXTID[17:15],IDE,RTR
(2)根据过滤方式分为:
- 标识符列表模式:要求报文与列表中的ID的每一个标识符相同才接收。
- 掩码模式:只要报文ID中规定的某些位相同,就会被接收。
筛选尺度寄存器CAN_FS1R的FSCx位可以设置工作在32位还是16位;筛选模式寄存器CAN_FM1R的FBMx位可以设置工作在标识符列表模式还是掩码模式。每组筛选器有2个32位寄存器,分别为CAN_FxR1,CAN_FxR2,用来存储要筛选的ID或者掩码。
五.CAN库函数相关结构体
1.初始化GPIO结构体:
因为需要使用引脚的复用功能,所以需要打开AFIO时钟,使用GPIO_Remap函数对CAN1选择Remap1方案(参考数据手册表32).
为什么需要使用IO的复用功能?
看STM32的CAN电路原理图,Tx和Rx连接到PB8和PB9上,这两个引脚是在重映射条件下才能作为CAN接口使用的。在使用复用功能重映射的引脚配置时,需要打开AFIO的时钟。
2.初始化CAN结构体
3.发送及接收结构体
4.筛选器结构体
六.写代码
回环模式:用于自测。
易出错点:
- 引脚使用了重映射,需要打开AFIO的时钟,以及进行GPIO_Remap配置。
- CAN模式配置中需要使传输速率为1Mbps。注意BS1,BS2,SJW,分频因子的取值。
- 筛选器配置,特别是模式的配置,还有IDHigh,IDLow。
- 需要配置NVIC,设置中断优先级;打开CAN的接收中断。对应地,需要在it.c文件里写对应的中断服务函数。中断服务函数中需要对接收到的数据进行ID筛选,决定是否接收。
转自:https://blog.csdn.net/2301_76924398/article/details/130293760