CAN 总线:汽车和工业为什么偏爱这根"抗造"的差分线
拆过汽车线束,或接触过工业变频器、伺服电机、充电桩,多半会撞见 CAN。它和你熟的 I2C、SPI 不是一路货——那两个是"板内几个芯片凑一块儿说话",CAN 是"一辆车里几十个分散节点,隔着十几米线、在电磁噪声满天飞的环境里还得稳稳通信"。它每处设计都冲着"抗造"和"多节点"去。搞懂这两个词,CAN 就通了。
CAN 是什么:一根总线挂一堆节点
CAN 全称 Controller Area Network(控制器局域网),最早是博世给汽车做的。核心画面:一根总线(就两根线),上面并排挂着许多节点,谁都能发、谁都能听。 它和 I2C 一样是一线挂多设备,但有两个根本不同:
- 没有主从。I2C 是主机点名从机才应答;CAN 上人人平等,任何节点随时能抢总线,不用谁批准。这叫多主(multi-master)。
- 发消息不带地址,带的是"消息 ID"。CAN 帧不写"发给谁",只写"这是什么内容的消息"(比如"发动机转速")。所有节点都收到、各自决定要不要。这叫面向消息的广播——转速这条消息,仪表、行车电脑、变速箱能同时听,天然适合"一个数据多处要"的车载场景。
别拿"A 发给 B"的思路套 CAN,它更像车间广播:喊内容,全场都听见。
差分信号:它凭什么在噪声里不出错
CAN 只有两根线:CANH 和 CANL。它不看某一根线对地是几伏,而是看两根线之间的电压差——这就是差分信号。
为什么这么设计?汽车、工厂里电磁干扰极凶——旁边一个大电机启停就能在线上感应出一大坨噪声。若像 UART 那样单端传输(一根线对地比电压),噪声窜进来,高低电平就可能被判错。
差分的妙处在于:干扰是"共模"的。CANH 和 CANL 拧成双绞线,噪声窜进来时两线上感应出的干扰几乎一模一样、同增同减。接收端只算两者差值,一相减那坨共同噪声就被抵消、真正的信号完好无损。这就是差分能在几米线、强噪声下还稳的根本原因——同理,RS485 也靠差分才能拉到上千米。
CAN 用两线电压差表示两种状态:显性(0) 和 隐性(1)。显性时驱动器主动把两线拉开约 2V 差压,隐性时松开、两线靠拢到差压近 0。记住"显性盖过隐性",下面的仲裁全靠它。
多主仲裁:几个节点同时抢总线,谁赢?
多主有个绕不开的问题:人人都能随时发,两个节点同一刻都开口不就撞车了? 以太网撞了退避重发,效率打折。CAN 用了一招漂亮办法——基于 ID 优先级的非破坏性仲裁。
每条 CAN 帧一开头就一位一位地发它的消息 ID。多个节点同时开始发,就同时在发各自 ID 的每一位。关键规则是显性(0)盖过隐性(1),而每个节点发出一位的同时也在回读总线实际电平:
- 你发显性 0、总线也是 0,一致,继续发;
- 你发隐性 1、总线却被别人拉成显性 0——说明有个 ID 更小(优先级更高)的家伙在抢,你立刻退出转去当听众。
一位位比下来,ID 数值最小的节点一路没被盖过,自然赢得总线、把整帧发完。妙在输家"打不过就安静退出",而赢家的数据一位都没被破坏,无缝发完、总线一个时钟没浪费——这就是"非破坏性":仲裁不产生任何冲突损耗。
所以 消息 ID 既是身份也是优先级,越小越优先。刹车、气囊给小 ID 保证抢先发出,车窗、氛围灯给大 ID 自动让路。这让 CAN 天生适合实时性要命的控制场景。
挂总线与 120Ω 终端电阻:不接会怎样
CAN 的物理接法很有讲究,有个新手必栽的坑:总线两端各要接一个 120Ω 终端电阻。
CAN 是总线型拓扑——一根主干线(CANH/CANL 双绞)从头拉到尾,各节点像葡萄一样短短地挂在主干上。主干两个物理末端各跨接一个 120Ω 电阻在 CANH、CANL 之间,两个并联后总线呈现约 60Ω 等效阻抗。
这电阻是匹配阻抗、吸收信号反射用的。高速信号跑到线末端若阻抗不匹配,就会像声音撞墙一样反弹回来叠到后面信号上,把波形搅乱、误码飙升。120Ω 正好等于双绞线的特征阻抗,信号跑到头被电阻"吃掉"、不反弹。
常见翻车:只接一个、一个没接、或图省事在中间随手加——速率一高就疯狂误码甚至完全通不了。记死:终端电阻必须两个、必须在总线两个物理末端、必须 120Ω。 短距低速容错高些,但上速率、拉长线这条就是铁律。
ESP32-S3 怎么接 CAN:TWAI 控制器 + 外接收发器
好消息:ESP32-S3 芯片内置了 CAN 控制器,乐鑫叫它 TWAI(Two-Wire Automotive Interface,其实就是 CAN 2.0,因商标换了名)。组帧、仲裁、错误处理这些协议层芯片全干了,ESP-IDF 里用 twai 驱动配置即可。
但有个必须外接的东西:CAN 收发器芯片,如 SN65HVD230、TJA1050。为什么少不了它?因为 TWAI 引脚出来的是普通 3.3V 逻辑电平(TX/RX 单端信号),根本不是总线那种 CANH/CANL 差分信号。收发器就是中间的翻译:发把 TX 逻辑电平转成 CANH/CANL 差分驱动,收把总线差分信号转回 RX 逻辑电平。接法是 S3 的 TWAI_TX/TWAI_RX 两个 GPIO → 收发器 TXD/RXD,收发器 CANH/CANL → 总线。
没有这颗收发器,S3 上不了真实 CAN 总线——这是新手最常忽略的一步,光配好 twai 驱动没接收发器怎么调都不通。配 S3 选 3.3V 供电的收发器(如 SN65HVD230)最省心。
什么时候该用 CAN
CAN 不是万能的,它慢(经典 CAN 最高 1Mbps,比不过 SPI 的几十 Mbps),也比 I2C 复杂、贵。但它有别人给不了的三样:多节点+长距离+强干扰(几米到几十米、几十个节点、满是电机噪声,正是它的主场)、要命的实时性(优先级仲裁保证急事永远抢先)、高可靠(内建 CRC、错误检测、故障节点自动脱离,不拖垮全网)。
反过来,板内几个芯片近距离通信用 I2C/SPI 又快又省,不涉及汽车/工业多节点抗干扰场景就轮不到 CAN。哪种该用,翻 五大总线怎么选 一表看全。
一句话口诀
CAN 是为汽车工业"远、多、吵"而生的多节点差分总线:CANH/CANL 走差分抗干扰;多主人人能发,靠 ID 优先级非破坏性仲裁决定谁先说(ID 越小越优先、赢家数据零损耗);两端各一个 120Ω 终端电阻吃反射。ESP32-S3 内置 TWAI 控制器管协议,但必须外接收发器(如 SN65HVD230)才能上真实总线。
下一步
同样靠差分抗干扰、但更偏工业长距离点对点的,看 RS485。CAN 和 UART、I2C、SPI 到底该怎么挑,五大总线怎么选 一表说清。回 原理总览 补齐其余基础。