STM32-CAN通讯
一、发送和接收流程
can通讯传输的是一种差分信号,关于具体的硬件电路略。
1、发送流程
-
前置工作:如 时钟的开启、引脚的配置;CAN邮箱和模式等配置参考下面或HAL库选择
-
选择一个空置的邮箱(判断空置:CAN_TSR的TMEx位);
-
在这个空置邮箱中按数据帧格式设置ID、数据长度以及要发送的数据;
-
请求发送(CAN_TIxR 的 TXRQ = 1 );
-
后面的是硬件来实现的(这个过程可以被软件打断):
- 邮箱挂号(等优先);
- 预定(等总线);
- 发送;
- 空置。
2、接收流程
- 前置工作略
- 配置过滤器:给过滤器绑定一个FIFO,之后以FIFO0为例;
- 硬件自动处理:收到报文后挂号到FIFO0(绑定的)的空闲邮箱深度;如果邮箱深度,再收到报文会溢出;
- 这个挂号和溢出都可以触发中断
- 软件接收:有个邮箱深度里挂过一次号即存一个报文,所以,可以通过挂号的数量来获取到存进来的报文数量。具体参考寄存器的位。
二、数据帧格式
-
标准帧
- 仲裁段:
- SOF : 帧起始,1bit
- ID : 11bit
- RTR : 1bit ------------------- 0数据帧;1远程帧
- 控制段
- IDE : 1bit -------------------- 0标准格式;1扩展格式
- R0 : 1bit ---------------------- 保留位
- DLC : 4bit ---------------------- 数据字节个数 , 虽然有4bit容量,但只能放0-8,也就是最大发送8byte数据
- 数据段 0-64bit,最大64bit,即8byte数据
- CRC段
- CRC : 15bit 校验
- 界定符 : 1bit 校验结束
- ACK段
- ACK : 1bit 确认
- 界定符 : 1bit 确认结束
- 帧结束 7bit
- 仲裁段:
-
扩展帧
略。比标准帧多了 1bit SRR, 18bit ID, 1bit R1保留位。
三、bit时段
为了实现发收双方数据的同步,将传送每个bit的时间分为n个小的时间单位,这个时间单位就是tq, 可配置每个tq的具体时长。
CAN通讯是一种异步传输通讯,通过位时段来确认双方的通讯无误。
- sync (ss) : 同步段。1tq
- prop-set (pts) : 传播时间段。一般 1-8tq,补传输时的延时的误差
- phase1 (pbs1) : 相位缓冲段1。一般 1-8tq,补边沿误差
- phase2 (pbs2) : 相位缓冲段2。一般2-8tq,补边沿误差
硬同步:接收到起始帧SOF时,调整同步段SS,使得与发送方SOF的SS段一致。
再同步:接收过起始帧以后,发现与发送方不同步,则通过拉或缩相位段进行位同步。
采样点:每个bit的采样位置,采样时发现位不同步则进行调整。
在stm32f103中,prop-seg和phase1合作为了一段。
CAN通讯并【不是】通过波特率(每秒传输速率,比如uart中,确定起始位后,可以通过波特率完成)来确保通讯的,但它可以计算出波特率。
1bit花费n个tq
tq = ( CAN_BTR的BRP位 + 1 ) * Tcan频率
1bit中所有时段花费的tq = 1bit花费的时间
波特率 = 1s / 1bit花费的时间
四、工作模式和测试模式
1、工作模式
睡眠、正常、初始化。 通过寄存器控制。
2、测试模式
静默模式(LBKM=0, SILM=1):可以自通讯,对外部只收不发;
环回模式(LBKM=1, SILM=0):可以自通讯,对外部只发不收;
环回静默模式(LBKM=1,SILM=1):可以自通讯,对外部不发不收。
五、CAN主体功能
1、CAN1和CAN2
对于非互联产品,如stm32f103系列,只有一个CAN1,有14个过滤器组;
对于互联型产品,如105、107系列,有一个CAN1和一个CAN2,连个CAN共享28个过滤器组。
2、发送邮箱
3个。将要发送的报文放到某个邮箱中,硬件自动发送出去。
3、接收邮箱和FIFO
关于FIFO和接收邮箱,可以说每个FIFO里有三个邮箱,但一般说法是每个FIFO里有三个邮箱深度。
stm32f103系列中,CAN功能有2个FIFO(队列), 每个FIFO有3个邮箱深度, 每个邮箱深度可放一个报文。
当报文通过滤波器过滤之后,就存储到了某个FIFO的某邮箱中,这个需要FIFO和过滤器进行关联配置。
硬件会遍历配置好的FIFO中的邮箱深度以存储报文。
4、接收滤波器 (关于位宽和模式)
上面说到,stm32103系列CAN功能有14个过滤器组;
每个过滤器组由2个32位寄存器组成。
-
位宽:
可通过CAN_FS1R寄存器的FSCx(0-13)位将这2个32位运用为:
- 0 ———— 4个单位,每个单位16bit
- 1 ———— 2个单位,每个单位32bit
-
过滤器模式:
可通过CAN_FM1R寄存器的FBMx位控制
- 1 ———— 标识符模式: 4或2个单位全填ID, 只有填进去的ID才可通过过滤器放到FIFO的邮箱深度中
- 0 ———— 屏蔽位模式: 4或2个单位 的 其中一半是1/0位,另一半(每个32bit的低16bit)是规则(0验证 1不验证)
六、CAN错误状态
-
错误主动——————出错次数较少, [0, 127]
-
错误被动——————出错次数中等, [128, 255]
-
离线 ——————出错次数较多, [256, ∞)
从离线模式进入正常模式(错误主动)可以由软件或硬件控制,MCR的ABOM位可配置这个。