STM32——CAN通讯

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位可配置这个。

热门相关:花都保镖   佣兵之王都市行   抗战老兵之不死传奇   盛宠之嫡女医妃   与校花同居:高手风流