CAN通信学习笔记(一)

1 CAN通信的基本原理

1.1 基本概念

CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。
  CAN总线通信系统是串行通信的一种,要优于RS485总线,是目前比较常用的一种工业总线,如汽车的电气部分就采用CAN总线实现通信。与I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步半双工通讯。(同步即在同一个时钟驱动下数据通信,半双工即接受与发送不能同时进行)
请添加图片描述

1.2 为什么选择CAN通信

汽车工业蓬勃发展,汽车的电子控制单元逐渐增多。各电控单元之间的信号交换导致汽车线束的级数增加,复杂粗大的线束与汽车有限的布线空间之间矛盾越来越突出,繁多的线束导致电气系统可靠性下降,同时增加了重量。
CAN总线将汽车内部各电控单元之间连接成一个局域网络,实现了信息的共享,大大减少了汽车的线束,如下面的示意图:
请添加图片描述
在汽车、工业控制领域,数据通信的稳定性和正确性要求极高,因为设备的工作环境既有振荡、高温、辐射等各种不定因素,那不是一般的通信协议能够满足的。除此之外,CAN通信还有许多优秀的特点,比如多主控制、故障封闭功能等,非常适用于工控领域方面,将在下文再提。

1.3 CAN协议的组成

CAN协议经过ISO标准化后有两个标准ISO11898标准和IS011519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准(闭环),而IS011519-2是针对通信速率为125Kbps以下的低速通信标准(开环)。

Kbps:总线的通信速率,指的是位速率。或称为比特率(和波特率不是一回事),表示的是:单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。

CAN的组成一般有两种方式:一种是CPU与CAN控制器集成到一起、再外接CAN收发器;另一种是CPU与CAN控制器分开的,使用的时候需要配置CAN接口电路,比较麻烦。STM32中就是采用第一种方式,将CAN接口集成在芯片内,使用的时候再外接CAN收发器(顾名思义,可发送,可接收),常用的有TJA1050或者82C250。

CAN收发器是用于TTL电平与差分电压信号相互转换的,TTL电平即单片机引脚直接提供的电平,逻辑0代表低电平,逻辑1代表高电平;而差分电压信号则为固定的电压值。请添加图片描述

2 CAN通信的流程

以ISO11898 标准的高速、短距离闭环网络为例,总线最大长度为 40m,通信速度最高为 1Mbps。在 CAN 总线的起止端有一个 120Ω的终端电阻,是用来来做阻抗匹配,以减少回波反射。
请添加图片描述

2.1 数据传输原理实现

先知道CAN通信只由两根线完成的,一条称为CAN_H(CAN High),一条称为CAN_L(CAN Low),共同构成一组差分信号线。整个过程是以差分信号的形式进行通讯的,即信号的逻辑 0 和逻辑 1 由两根差分信号线的电压差来表示。
CAN_Rx和CAN_Tx分别是从MCU中接出来的引脚,比如MCU要发送一个逻辑1,则只要将CAN_Tx设置为1,经过CAN收发器转换,CAN_High和CAN_Low 线上的电压均为 2.5v,即传到总线的电压差 Vh-Vl=0V,总线上的状态则就是逻辑1。同样,当CAN_High和CAN_Low 读取到 CAN总线电压分别3.5V和1.5V,即压差为2V,经过收发器转换,MCU则可通过CAN_Rx读取到信号0。
请添加图片描述
可以想象到以差分信号形式传送,稳定性更好,因为即使环境问题导致CAN_High电压发送变化,则CAN_L也会发送同等变化,两者做差即可抵消由于这个环境引起的变化。

发送方通过使总线电平发生变化,将其信息传递到CAN总线上。
接收方通过监听总线电平,将总线上的消息读入自己的接收器。

2.2 通信过程

那么是如何通过一个节点的MCU向总线上那么多节点中的某个节点进行发送信息的?一个节点又是如何知道某个信息是发给自己的或者不是发给自己的?这里或许让你想起 IIC 中以地址方式进行主从点对点的通信,但其实在CAN中并无地址的概念。
少了像IIC中的SCL地址线、SPI中的片选信号线,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议。如何用一个信号通道实现同样、甚至更强大的功能呢?答案是对数据或操作命令进行打包。

2.2.1 通信状态

  • 空闲状态:所谓的空闲状态就是指没有节点正在传输数据的时候,在CAN协议中,当总线上的上出现连续的11位隐性电平,那么总线就处于空闲状态。也就是说对于任意一个节点而言,只要它监听到总线上连续出现了11位隐性电平,那么该节点就会认为总线当前处于空闲状态。
  • 数据传输:每次发送数据前,节点都会监听总线的状态,如果总线状态为空闲时,它就会立即向总线上发送自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,应称为数据包(数据帧),也叫做报文。当报文被传输到其它节点时,只要这些节点按格式去解读,就能还原出原始数据。

2.2.2 数据帧格式

数据帧是在 CAN 通讯中最主要、最复杂的报文,它以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束。在它们之间,分为仲裁段、控制段、数据段、CRC 段和 ACK 段,以标准数据帧为例。

参考链接:

STM32 CAN通信的学习笔记总结(从小白开始)
STM32—CAN总线调试的一点心得总结

### CAN 芯片 TX 端口连接 对于 CAN (Controller Area Network) 协议,通信方式采用的是总线型结构,不同于 UART 的点对点通信模式。CAN 总线上所有的节点都是通过两条信号线 CAN_H 和 CAN_L 来实现双向通讯的[^1]。 具体来说,在实际应用中: - **CAN 收发器**:通常用于将微控制器单元(MCU)上的逻辑电平转换成能够在物理层上传输的标准 CAN 信号。 - **TXD/RXD 接口**:这些接口主要用于 MCU 或其他处理器与 CAN 控制器之间的串行通信。而真正的 CAN 物理层传输并不区分传统的 TXRX 概念,而是依赖于 CAN_High (CAN_H)CAN_Low (CAN_L) 两根线路来完成数据交换。 因此,如果提到 CAN 芯片中的 "TX" 端口,则该术语在此上下文中可能指的是 CAN 控制器内部负责发送消息的部分。然而,在外部硬件连接方面,并不存在直接对应的传统意义上的 “TX” 或者 “RX”。相反,应该关注如何正确地将 CAN 设备接入共享的 CAN_H/CAN_L 总线网络。 为了建立两个 CAN 设备间的有效通信链路,应当按照以下原则操作: - 将第个设备的 CAN_H 连接到第二个设备的 CAN_H; - 同样地,把第个设备的 CAN_L 连接到第二个设备的 CAN_L。 这种配置确保了所有参与同 CAN 网络内的装置都能互相监听并响应彼此发出的数据帧。 ```python # Python 示例代码展示 CAN 配置概念(仅作示意) can_config = { 'device_1': {'can_h': 'pin_A', 'can_l': 'pin_B'}, 'device_2': {'can_h': 'pin_C', 'can_l': 'pin_D'} } def connect_can_devices(config): """模拟连接两个 CAN 设备""" print(f"Connecting {config['device_1']['can_h']} to {config['device_2']['can_h']}") print(f"Connecting {config['device_1']['can_l']} to {config['device_2']['can_l']}") connect_can_devices(can_config) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值