这里写文章的前言:
江协科技,Can总线学习
CAN简介&硬件电路
一、CAN简介
CAN 总线(Controller Area Network Bus)即控制器局域网总线
是由 BOSCH 公司开发的一种串行通信总线,具有简洁易用、传输速度快、易扩展、可靠性高等特点,广泛应用于汽车、嵌入式、工业控制等领域。
其具体特征如下:
- 物理线路:采用(CAN_H、CAN_L)两根通信线,线路较少,且无需共地,使用差分信号进行通信,抗干扰能力强。
- 通信速率与传输距离: 高速 CAN(ISO11898):通信速率在 125k~1Mbps 之间,传输距离小于 40 米。 低速 CAN(ISO11519):通信速率在 10k~125kbps 之间,传输距离小于 1 千米。
- 通信方式: 异步通信,无需时钟线,通信速率由设备各自约定。 半双工模式,可挂载多个设备。当多设备同时发送数据时,通过仲裁判断发送的先后顺序。
- 报文 ID:具备 11 位或 29 位报文 ID,用于区分消息功能,同时也决定了消息的优先级。
- 有效载荷:可配置 1 至 8 字节的有效载荷。
- 传输方式:可实现广播式和请求式两种传输方式。
- 其他特性:具备应答、CRC 校验、位填充、位同步、错误处理等特性 。
二、主流通信协议对比
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 | 应用场景 |
UART | TX、RX | 全双工 | 异步 | 单端 | 点对点 | 两个设备互相通信 |
I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块 |
SPI | SCK、MOSI、MISO、SS | 全双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块(高速) |
CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 | 多个主控互相通信 |
三、CAN硬件电路
- 每个设备通过CAN收发器挂载在CAN总线网络上
- CAN控制器引出的TX和RX与CAN收发器相连, CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
- 高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
- 低速CAN使用开环网络CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
高速CAN硬件电路图

- 高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻 终端电阻的作用主要有两个: 1. 防止回波反射(用于处理高频信号远距离传输时 信号在终端反射,干扰原始信号) 2. 在没有设备操作时,将两个差分线的电压“收紧”, 使其电压一致。(在没有设备操作时,这个电阻会把两个差分线的电压拉到同一水平,也就是代表默认的‘1’状态) (类似于I2C的上拉电阻)
- CAN控制器:比如STM32等
- CAN收发器:一颗芯片,主要实现电平转换、输出驱动和输入采样的功能
- CAN控制器的TX和CAN收发器的TX相连、RX与CAN收发器的RX相连,无需交叉
低速CAN硬件电路图

- 这里的两颗2.2K的电阻,知识一端接到CAN总线上, 另一端是悬空的,这里也是用于防止回波反射。但是具体多大作用就不知道了~
四、CAN电平标准
CAN 总线采用差分信号,即通过两线电压差(V_CAN_H 减 V_CAN_L)传输数据位
- 高速 CAN 规定: 电压差为 0V 时表示逻辑 1(隐性电平) 电压差为 2V 时表示逻辑 0(显性电平)
- 低速 CAN 规定: 电压差为 - 1.5V 时表示逻辑 1(隐性电平) 电压差为 3V 时表示逻辑 0(显性电平)

两线“收紧”是默认状态,表示逻辑1, 所以叫隐性。
两线“张开”产生电压差,表示逻辑0,所以叫显性。
高速CAN和低速CAN的电压不一样哦。低速CAN是考虑传输速度更远,所以把电压的1和0的电压差距加大了
在日常中,有事也用逻辑电平来表示CAN的时序,但是要明白的是 实际的电路中 是通过差分电平来判断此时是隐性电平1 还是 显性电平0。 ”CAN的差分电平就像南通的腿,张开是0, 闭合就是1“
五、CAN收发器-TJA1050(高速CAN)

- GND、VCC提供5V供电
- TXD、RXD与CAN控制器相连
- CAN_H、CAN_L与CAN总线相连
- Vref 是参考电压输出,可以不用。
- S 是选择高速模式还是静默模式,(理解成开关)
输入部分原理详解

- RECEIVER 用于比较CAN_H与CAN_L的电压差, 当有电压差是输出1, 没电压差输出0.
- 两个 MOSFET管 上管为Pmos,下管为Nmos 当RECEIVER输出1时,上管断开,下管导通,RXD与GND相连 ,输出 显性电平 ‘0’ 当RECEIVER输出0时,上管导通,下管断开,RXD与VCC相连 ,输出 隐性电平 ‘1’
- 总的来说:当有电压差时输出 显性电平 ‘0’ ; 没有电压差时输出隐性电平 ‘1’。
输出部分原理详解

- 两个25K的电阻,并联,他们各分得0.5倍VCC电压,也就是2.5V。这就会在没有外力影响时,将电压固定在2.5V。也就是隐性电平的 ‘0’。(两线“拉紧”的力,主要是靠外部的终端电阻。)
- DRIVER会控制两个mos管(蓝色圆圈)的状态。 当TXD输入1时,上下两管同时断开,两根总线回归2.5V。 当TXD输入0时,上下两管同时导通,CANH被VCC拉高,CANL被GND拉低。使总线产生电压差。
其他部分功能介绍

- S引脚, 静默或者高速。S引脚的下拉电压源,当S悬空,默认输入0。 最终是控制开关控制器
- 电流源上拉,类似上拉电阻,当TXD悬空时默认输出电平1,防止当TXD引脚电平不确定造成影响。
- TXD显性超时计时器: 当TXD输出出现异常,始终输出显性电平0, 那么CAN总线将始终输出显性电平0 , CAN总线将会瘫痪, 并且其他设备不可阻止。那么这个设备就是收发器的保险,当设备异常,始终拽着总线不放,那么过一段时间后,收发器会自动释放总线,防止总线瘫痪
- 温度保护,当温度异常时,会控制驱动器切断输出,以免干扰CAN总线
六、CAN物理层特性

CAN总线入门帧格式详解
一、CAN总线帧格式
- CAN协议规定了5种类型的帧格式
帧类型 | 用途 |
数据帧 | 发送设备主动发送数据(广播式) |
遥控帧 | 接收设备主动请求数据(请求式) |
错误帧 | 某个设备检测出错误时向其他设备通知错误 |
过载帧 | 接收设备通知其尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开 |
二、数据帧详解

灰色部分D 为显性电平0, Donminant
白色部分R 为隐性电平1,Recessive
蓝色部分D/R为数据,可自定义
- 数据帧分为标准格式和扩展格式
标准格式
- 数据帧开始之前:电平为 隐性电平。逻辑电平1表示
- 帧起始
- 起始帧【SOF】:电平必须为显性电平,逻电平0表示
- 仲裁段
- 发送报文ID【identifier】:标准格式为11位。(ID越小优先级越高,可用于仲裁时)
- 发送远程请求标志位【RTR】:用于区分数据帧(写入)还是遥控帧(读取)。数据帧必须为显性0,遥控帧为隐性1
- 控制段
- ID扩展标志位【IDE】:标准格式固定为显性0,扩展格式固定为隐性1
- 保留位【r0】:目前(2025.5.19)没用到
- 数据段长度【DLC】:用来控制后续的数据段的发送的字节,(例如0001为发送1字节,1000为8字节)
- 数据段【Data】:0-8字节(64bit)。根据数据长度DLC来发送对应长度的数据
- CRC段
- CRC校验段:SOF到Data所有数据位,得到15为bit的CRC校验码附加在数据帧后
- 界定符:必须为隐性电平1
- ACK段
- ACK槽:类似于IIC的应答,当发送方发送完这一帧的主要内容,会在位于ACK槽时释放总线,应答方需要在ACK槽主动拉开总线,时ACK槽为显性电平0。发送方在ACK槽读取总线状态。如果读取为0则数据被正确接收。如果读取为1则未被正确接收。
- ACK界定符:必须为隐性电平1。
- 帧结束【EOF】:七个隐性电平1。标志帧结束。
扩展格式
扩展格式的出现,是因为标准格式的ID不够用了。
- SRR为替代RTR的位。必须位隐性电平1。 因为在CAN中,仲裁时是先比较所有位的ID,再比较RTR,所以RTR一定要再ID的后面。所以就出现了SRR来替代RTR,同时也是为了保证标准格式的优先级高于扩展格式。
- 扩展标志位【IDE】标准格式固定为显性0,扩展格式固定为隐性1
- 扩展部分的ID
- RTR
- r0/r1. 为后续升级奠定基础,
- 其余与标准格式一样
附【数据帧各部分用途简介】:
- SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位
- ID(Identify):标识符,区分功能,同时决定优先级
- RTR(Remote Transmission Request ):远程请求位,区分数据帧和遥控帧
- IDE(Identifier Extension):扩展标志位,区分标准格式和扩展格式
- SRR(Substitute Remote Request):替代RTR,协议升级时留下的无意义位
- r0/r1(Reserve):保留位,为后续协议升级留下空间
- DLC(Data Length Code):数据长度,指示数据段有几个字节
- Data:数据段的1~8个字节有效数据
- CRC(Cyclic Redundancy Check):循环冗余校验,校验数据是否正确
- ACK(Acknowledgement):应答位,判断数据有没有被接收方接收
- CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
- EOF(End of Frame ):帧结束,表示数据位已经传输完毕
附【数据帧的发展】
- CAN 1.2时期,仅存在标准格式,IDE位当时仍为保留位r1

- CAN 2.0时期,ID不够用,出现了扩展格式,增加了ID的位数,为了区分标准格式与扩展格式,协议将标准格式中的r1赋予了新功能—IDE

三、遥控帧
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同

四、错误帧
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备

五、过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失

六、帧间隔
将数据帧和遥控帧与前面的帧分离开

有关CAN总线的其他问题,欢迎您在底部评论区留言,一起交流~
- 作者:L_Z_J
- 链接:https://www.mcoi.top/article/Post-CAN
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。









