阡陌 发表于 2024-1-22 13:20:58

STM32 CAN 总线通信



CAN 是控制器局域网络 (Controller Area Network, CAN) 的简称,是由以研发和生产汽车电子产品著称的德国 BOSCH(没错,就是那个卖电动工具的博世)公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。

CAN 采用多主工作方式,节点之间不分主从,但节点之间有优先级之分,通信方式灵活,可实现点对点、一点对多点及广播方式传输数据,无需调度。CAN 采用的是非破坏性总线仲裁技术,按优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。CAN 采用短帧结构传输,每帧有效字节为 8 个,传输时间短,受干扰的概率低。而且每帧信息都有 CRC 校验和其它检错措施,保证数据出错率极低。当节点严重错误时,具有自动关闭功能,使总线上其它节点不受影响,所以 CAN 是所有总线中最为可靠的。CAN 总线可采用双绞线、同轴电缆或光纤作为传输介质。它的直接通信距离最远可达 10km,通信速率最高达 1M bps(通信距离为 40m 时),总线上可挂设备数主要取决于总线驱动电路,最多可达 110 个。但 CAN 不能用于防爆区。

CAN网拓扑结构

![](https://file.mculoop.com/images/2024/01/11/202401111150517.png)

CAN 是半双工的。收发数据要分时进行。不管 CAN 网络上挂多少设备,在同一时刻只能有 1 个发送数据。如果有多个需要同时发送则只有优先级别高的先发送,其它等待。控制器有收发两个接口,但是收发器的两个接口变成了 High 和 Low。CAN 总线式两线制的。在这点上可以与 Uart 控制器与 RS-485 收发器来类比。

![](https://file.mculoop.com/images/2024/01/11/202401111150342.png)

CAN 协议目前有 2.0A 和 2.0B。CAN 2.0A 是 CAN 协议的 PART A 部分,此部分定义了 11bit 的标识区 。

CAN 2.0B 是 CAN 协议的扩展部分,也叫 PART B,定义了 29bit 的标识区,设计上与 CAN2.0A 兼容。通常支持 2.0B 协议的芯片同时也支持 2.0A。

STM32 单片机的 CAN 控制器接口有收、发两个口,互联型有两个 CAN 控制器。两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是他们共用 28 个滤波器。通过 CAN_FMR 寄存器的设置,可以设置滤波器的分配方式。

![](https://file.mculoop.com/images/2024/01/11/202401111152174.png)

STM32 的过滤器组最多有 28 个(互联型),但是 STM32F103ZET6 只有 14个(增强型),每个过滤器组由 2 个 32 为寄存器,CAN_FxR1 和 CAN_FxR2 组成。过滤器有两种工作模式:屏蔽位模式和标识符列表模式。工作在屏蔽位模式时 CAN_FxR2 为 1 的位指示了接收到的标识位必须与 CAN_FxR1 相对应的位的 0 或 1 完全一致才能通过过滤器。如果 CAN_FxR2 全为 0 也就意味着不进行任何过滤。工作在标识符列表模式时 CAN_FxR1 和 CAN_FxR2 互不相干,CAN_FxR2 也是一个像 CAN_FxR1 的寄存器,当接收到的标识符与 CAN_FxR1 或 CAN_FxR2 完全匹配时才能通过过滤器。

STM32 提供了两种测试模式,环回模式和静默模式。环回测试模式不需要短接外部的两个脚,它是在内部环回的。

![](https://file.mculoop.com/images/2024/01/11/202401111154282.png)



页: [1]
查看完整版本: STM32 CAN 总线通信