CAN通信讲义

Porcovsky Lv3

不错的参考博客

秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_can通信协议简单理解_Wireless_Link的博客-CSDN博客

CAN通信速成!从会到不会~_哔哩哔哩_bilibili

CAN通信知识梳理及在Stm32上的应用(HAL库)_冬瓜~的博客-CSDN博客

基本知识

1.CAN通信物理层

image-20250126114246686

具体实现

CAN控制器:STM32F407等MCU上自带的CAN控制器

CAN收发器:SN65HVD230芯片,CA-IS3052G隔离式 CA-IS3052G

image-20250126114534348

2.CAN通信帧

image-20250126114754564

后三种帧是由硬件来完成的,重点关注前两者

image-20250126114842507

image-20250126114852613

ID段:数据的ID号,分为11位的标准格式ID和29位的扩展格式ID

DLC:给定数据长度

CRC:校验段

3.CAN通信的重要基本特征

  1. 差分信号

    隐形电平对应逻辑 1,两线压差为0,显性电平对应逻辑0,两线压差为2.5V 可以使外界干扰减到很小(抑制共模干扰)

    image-20250126115013194

  2. 终端电阻

    120欧 用于减少回波反射

    image-20250126115306798

    多电机模式下设置好电机上的拨档使得终端电阻为120,主控端120欧电阻长期使用后可能掉落,所以最好电表测量实际终端电阻修改对应。

  3. 系统的柔软性

    与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

4.CAN在STM32

  1. 关于采样点和位时序

    见STM32F4中文参考手册 P622

    一个位相当于是一帧数据,控制位时序相当于就是控制一帧数据的时间长度,再将这个时间长度取倒数就得到了波特率。

    这些位都是由最小的时间单元组成,称为一个 time quantum,也就是 1tq

    image-20250126115740427

image-20250126115757140

image-20250126115810229

image-20250126115936455

那么在实际程序中,就需要控制好这些位时序使得波特率正确

1
2
3
4
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;  //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_10tq; //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = 3; //分频系数(Fdiv)为brp+1

因为该板子上的 CAN 是挂载在 APB1 时钟上,分频就是 42Mhz,再分完频就是 14Mhz,所以一个 tp 就是 $\frac{1}{14Mhz}$,而在上述代码中设置了总共 14 个 tp,所以一个位的时间长度是 $\frac{1}{1Mhz}$ ,所以波特率就是 1Mhz

image-20250126115936455

由上图可以看到,SYNC_SEG 和 BS1 结束后为采样点,一般来说把采样点控制在 80% 左右比较合适

  1. 滤波器

    不管是否直接使用滤波器都要配好!

    如下图可见,CAN2不能控制筛选器,如果有CAN2的话,在使用CAN2之前一定要先使能 CAN1的时钟 中文参考手册 P609

    image-20250126120322497

    其中筛选器就是用来筛选有着固定ID的信息,减小总线负担

  • 标题: CAN通信讲义
  • 作者: Porcovsky
  • 创建于 : 2023-09-11 21:58:37
  • 更新于 : 2025-01-26 12:03:57
  • 链接: https://pocro.github.io/2023/09/11/CAN通讯/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论