做嵌入式这几年凡是产品里要跑 CAN 或者 CAN FD 总线低功耗这一项基本躲不掉。TCAN1043A 是我在低功耗 CAN 收发器里用得比较顺的一颗料它的优势不是单个参数有多夸张而是把总线收发、低功耗休眠、远程唤醒和电源管理几个需求打包到了一起省掉了一大圈外围逻辑。无论你在做车身控制器、T-Box、BMS 从控还是工业现场设备只要涉及常供电 低功耗 总线唤醒的场景TCAN1043A 都值得认真看一下。这颗芯片本质上是 CAN 控制器的物理层接口负责把 MCU 里头的逻辑电平转成 CANH/CANL 差分信号同时兼顾总线保护、故障检测和电源控制。很多初学者容易忽略的是CAN 收发器不是随便选一颗能发数据就行尤其在有休眠唤醒需求的产品里选错料后面补电路补到你怀疑人生。TCAN1043A 最打动我的地方是把四种工作模式、本地唤醒、远程唤醒、INH 电源管理和 CAN FD 能力集成在了一颗料里。这篇文章会按我实际做项目的思路来写先讲这颗芯片解决了什么核心问题再拆引脚和模式然后给出一套可以直接抄的应用电路最后聊软件控制顺序和现场调试常见的坑。内容不会只停在概念层面每一步会尽量说清楚为什么这么设计帮助你既能把电路画出来也能真正理解背后的工程逻辑。1. 为什么我会盯上 TCAN1043A1.1 CAN 收发器在系统里到底干什么先花一分钟把角色对齐。MCU 内部的 CAN 控制器处理的是逻辑帧但它在物理上输出的是普通 0/1 电平没法直接驱动长距离差分总线。CAN 收发器就是干这个转换活的发送时把 TXD 上的逻辑电平变成 CANH/CANL 上的差分信号接收时再把总线差分信号还原成 RXD 上的逻辑电平。听起来简单但实际工程里收发器还要扛住很多外部恶劣条件。比如汽车 12V 系统里CANH 线意外搭到电源正极或者地线如果收发器没有高耐压和保护能力一颗异常电压就能烧掉一整版。TCAN1043A 在这个方向的指标做得比较稳总线引脚能承受 ±58V 的故障电压基本覆盖了常见的短路和搭接场景。另一个核心点就是低功耗。很多 ECU 在车辆下电后还要保持连接状态以便随时被总线报文唤醒但同时整机静态电流要求非常苛刻。TCAN1043A 的睡眠模式和待机模式就是为这个场景设计的它可以把功耗压到微安级同时还在持续监听总线和本地唤醒信号。1.2 TCAN1043A 适合用在什么地方如果你做的产品没有睡眠和唤醒需求其实普通 CAN 收发器就够用没必要选这颗。但下面这些场景TCAN1043A 基本就是为它们量身定做的车身控制器、门模块、座椅控制器车辆休眠后还要等待开关信号唤醒本地唤醒和总线唤醒缺一不可。T-Box / 远程信息终端熄火后需要保持极低功耗同时能接收远程网络管理报文唤醒系统。BMS、充电机内部通信节点常用 CAN FD 跑大数据量同时整车下电后需要低功耗待命。工业设备、AGV、工程机械控制器现场长期供电偶尔通信希望模块空闲时能自动进入低功耗。我自己的项目里最典型的用法是 MCU 接一个常电 5V 或者经过 LDO 的 5V 给收发器供电VIO 接 3.3V 逻辑电源INH 去控制后端 DCDC 或 LDO 的使能脚。系统休眠时TCAN1043A 把 INH 拉低整机后端电源切断只剩下收发器和极少量唤醒电路带电。等总线出现唤醒报文它先把 INH 拉高把系统电源打开再把 MCU 从睡眠中唤醒整个过程不需要额外加一颗独立的电源管理芯片。2. 硬件设计前先搞懂引脚和内部逻辑2.1 引脚功能速览TCAN1043A 常见的封装是 14 脚拿过来第一眼可能觉得脚多但真正控制逻辑就几个关键脚。我习惯把它的脚位分成三类来看总线侧、控制器侧、电源管理侧。脚位区域典型引脚功能设计注意点总线侧CANH / CANL差分总线收发端需要外接终端电阻必要时加 TVS 管控制器侧TXD / RXD接 MCU 的 CAN 控制器电平以 VIO 为参考不能直接接 5V 逻辑而不改 VIO控制侧STB_N / EN决定工作模式必须明确上下拉防止上电乱入模式电源管理VCC / VIO / INH收发器供电和系统电源控制VIO 决定逻辑电平INH 只是使能信号其他WAKE / SPLIT本地唤醒输入和分端接电压输出WAKE 极性根据硬件需求配置这里最容易被忽略的是 VIO 引脚。TCAN1043A 的 TXD/RXD 以及 STB_N、EN 这些逻辑脚不是以 VCC 为参考而是以 VIO 为参考。如果 MCU 是 3.3V 系统VIO 就接 3.3V如果 MCU 是 5V 系统VIO 接 5V。VIO 接错或者悬空最直接的表现就是 CAN 收发器看着没坏但无论如何都不通信因为逻辑电平根本对不上。SPLIT 脚是给分端接用的默认会输出一个近似 VCC/2 的电压参考用来配合两颗 60Ω 电阻做 split termination。这个设计对共模噪声抑制有一定帮助后面应用电路部分再细说。WAKE 脚则是本地唤醒输入接一个开关或者外部电平信号可以在总线没有活动时把系统从休眠状态拉起来非常适合门锁开关、按键唤醒这类场景。2.2 四种工作模式怎么切TCAN1043A 最需要理解清楚的就是模式状态机。模式由 STB_N 和 EN 两个脚共同决定常见组合如下ENSTB_N模式发送器接收器INH00睡眠模式 Sleep关闭低功耗监听低10待机模式 Standby关闭低功耗监听高01静音模式 Silent关闭正常工作高11正常模式 Normal使能正常工作高正常模式就是日常收发 CAN 报文的模式TXD/RXD 全速工作。静音模式也叫监听模式接收链路正常但发送器强禁适合做总线诊断、监听工具或者做总线故障时不打扰总线。待机模式是低功耗模式发送器关闭接收器用低功耗方式监听总线上是否有唤醒报文。睡眠模式功耗最低INH 拉低会把后端电源切掉。有个容易搞混的点睡眠模式和待机模式都支持总线唤醒但睡眠模式必须经过待机模式才能进入。换句话说不能从正常模式直接一步踩到睡眠模式软件切换时最好先进待机再落睡眠。这个细节如果不注意很可能出现写的切换指令没生效、但还以为是芯片坏了的情况。2.3 唤醒机制和 INH 电源管理TCAN1043A 的唤醒来源主要有两类远程唤醒和本地唤醒。远程唤醒靠总线上的差分电平翻转比如总线上出现特定宽度的显性脉冲收发器会识别为唤醒请求。这类唤醒不需要 MCU 参与即使 MCU 已经进入深睡眠收发器也能独立工作把系统从断电状态拉回来。本地唤醒靠 WAKE 引脚。把 WAKE 接一个开关到地或者接一个电平信号平时处于确定状态开关动作产生沿变化后收发器一样会退出低功耗状态。实际做门模块时我喜欢把门把手开关直接接 WAKE不用让 MCU 一直开 ADC 或 GPIO 中断扫描省出来的静态电流非常可观。INH 脚是这套方案的精髓。平时正常、待机、静音模式下INH 输出高电平睡眠模式下输出低电平。把这个脚接到外部 DCDC 或 LDO 的 EN 上就可以实现系统跟着收发器走的效果。总线上有唤醒报文时TCAN1043A 先把 INH 拉高把后级电源打开MCU 上电跑完初始化后发现是总线唤醒再进入正常模式收发数据。整个过程像是一个小型的电源管理总指挥。这里要特别说明INH 不是电源输出脚不能拿它直接给大电流负载供电它只是一个控制信号。实际设计里INH 到 EN 之间可以串一个 10kΩ 左右的电阻同时在 EN 脚加一个小电容做滤波防止睡眠瞬间产生毛刺把外部电源重新触发打开。3. 应用电路设计与参数计算3.1 基本外围电路VCC、VIO、终端电阻TCAN1043A 的 VCC 典型应用是 5VVIO 根据 MCU 电平选。假如 MCU 是 3.3V 系统电路就按 VCC5V、VIO3.3V 来设计。VCC 引脚旁边需要放去耦电容我一般至少放一组 100nF 4.7µF 的组合100nF 靠近 VCC 引脚4.7µF 可以稍微远一点用来吸收总线瞬态对电源的冲击。TXD 和 RXD 的走线不要太长尽量靠近 MCU 的 CAN 控制器引脚。TXD 上建议加一个 10kΩ 上拉电阻到 VIO保证 MCU 没初始化之前 TXD 处于隐性电平避免收发器一上电就往总线上发显性电平卡住整条总线。终端电阻是整个 CAN 网络最关键的部分。标准做法是在总线物理两端各放一个 120Ω 电阻终端电阻不是每颗收发器都配而是一条总线只在两端各放一组。如果模块是总线中间节点不需要加终端电阻如果拿一个模块单独测试那必须在板子 CANH/CANL 之间放 120Ω否则通信极不稳定。终端电阻我建议用 0805 封装的精密电阻精度不低于 1%功率至少 0.1W别省这一点。3.2 SPLIT 分端接怎么做如果产品对 EMC 和抗干扰要求比较高可以用 split termination 替代普通单电阻端接。TCAN1043A 的 SPLIT 脚就是为此设计的。标准做法是在 CANH 和 SPLIT 之间放一颗 60Ω 电阻在 SPLIT 和 CANL 之间再放一颗 60Ω 电阻SPLIT 脚再通过一个小电容到地。这样从总线看进去CANH 到 CANL 之间仍然是 120Ω但中间点被 SPLIT 钳在 VCC/2 附近给共模噪声提供了一个低阻抗泄放路径。实际效果就是总线的共模抑制更好尤其是对地线噪声比较敏感的长线缆场景差别挺明显。电容取值要参考收发器数据手册和应用笔记常见在 4.7nF 到 100nF 之间。我个人习惯先放 4.7nF/50V 电容再做 EMC 预测试如果低频噪声偏大就稍微加大。注意这个电容不要一味加大太大会拖慢 CAN FD 高速信号的边沿。3.3 INH 和电源拓扑INH 的接法决定了整个节点能不能睡干净。比较推荐的结构是外部供电先经过一颗带使能脚的 DCDC 或 LDO输出给 MCU 和大多数外设供电TCAN1043A 的 VCC 由这颗电源的 5V 输出供电INH 接到这颗电源芯片的 EN 引脚。系统进入睡眠模式后TCAN1043A 拉低 INH外部电源芯片关断MCU、传感器、执行器等全部断电只有 TCAN1043A 和常电部分继续工作。这里一定要确认一个问题收发器自身 VCC 在当前拓扑下还能不能可靠供电。如果 VCC 也是被 INH 切断的电源供电那睡下去之后就没人干活了。这个问题很多人第一次画板子都会踩。正确的做法是让 TCAN1043A 自身的 VCC 来自一路不受 INH 控制的常电 5V或者来自一个微功耗 LDO 后面。VIO 也是一样通常接 MCU 电源域但如果 MCU 被断掉VIO 可能也掉电此时要确认收发器在睡眠模式下 VIO 掉电是否允许。数据手册里对 VIO 掉电有明确说明设计前一定翻一下别想当然。INH 到电源 EN 之间的串联电阻我用 10kΩ同时在 EN 脚到地放一个 100nF 电容主要是防毛刺。有些电源芯片 EN 内部有上拉这个电阻能限制电流有些 EN 是高电平使能配好上下拉后睡眠拉低才能可靠关断。3.4 PCB 布局与总线保护PCB 布局上我会把 TCAN1043A 放在板边靠近连接器的地方TXD/RXD 走线较短CANH/CANL 从连接器侧出来尽量减少高速差分信号在板内穿行。CANH/CANL 作为差分对在进入连接器前要保持等长、靠近走避免走线阻抗突变和大回流路径。如果空间允许CANH/CANL 下方尽量铺完整地不要跨分割。总线保护上TCAN1043A 自身已经有很强的 ESD 和故障耐压能力但产品过安规或做现场测试时我依旧会在连接器侧加一颗 TVS 管比如 PESD1CAN 这类专用于 CAN 总线的 TVS。TVS 要放在连接器和收发器之间靠近连接器放置泄放路径越短效果越好。有些方案还会在 CANH/CANL 上各串一颗几十欧姆的电阻用来限流代价是会增加总线衰减高速 CAN FD 下慎用。还有一个小细节VCC 和 VIO 的去耦电容地端一定要就近接到地平面不要绕一圈再打孔接地。高频噪声最容易从这种看起来无关紧要的走线里耦合进总线导致 CAN 波形边沿变差。4. 软件控制与时序细节4.1 模式切换伪代码硬件画好之后软件层面的核心就是控制 STB_N 和 EN 两个 GPIO。我通常会封装成三个函数逻辑很直白void can_normal_mode(void) { EN_GPIO_SET_HIGH(); // EN 1 STBN_GPIO_SET_HIGH(); // STB_N 1 } void can_standby_mode(void) { STBN_GPIO_SET_LOW(); // STB_N 0 EN_GPIO_SET_HIGH(); // EN 1 } void can_sleep_mode(void) { // 从 Standby 进入 Sleep EN_GPIO_SET_LOW(); // EN 0 STBN_GPIO_SET_LOW(); // STB_N 0 }上电复位后TCAN1043A 的默认状态要查数据手册不能假设一定是正常模式。如果 EN 或 STB_N 悬空芯片可能直接进入睡眠模式或者待机模式总线通信无反应。所以应用电路里这两个引脚必须接明确上下拉MCU 初始化后再覆盖成正式工作状态。4.2 进入睡眠和唤醒的流程完整的睡眠流程不是简单拉两个 GPIO 就完事。我的建议是先让 CAN 控制器进入初始化/准备模式停止发出新报文等总线上当前报文传输完成然后调用 can_standby_mode 进入待机模式再等待几个毫秒最后调用 can_sleep_mode。这样顺序切模式可以避免在总线还有活动时强行关闭发送器产生半截帧干扰别人。唤醒流程要注意方向。总线唤醒发生时TCAN1043A 会先拉高 INH外部电源开始给 MCU 供电。MCU 上电启动后不能马上进正常模式发报文应该先检查一下节点状态是本地唤醒还是远程唤醒。如果是远程唤醒总线可能已经有通信在跑建议先以静音模式或正常模式接收几帧确认网络管理逻辑正常后再开始发送避免跟其他节点撞车。唤醒后的复位响应时间这个参数挺关键。MCU 从断电到跑起来需要几十毫秒甚至更久所以收发器唤醒后要挺住这段时间不能刚拉高 INH 又掉下去。TCAN1043A 在这块处理得不错但设计时还是要在 MCU 初始化代码里尽早把 EN 和 STB_N 拉成正常模式避免 INH 状态被意外改变。4.3 CAN 通信初始化建议如果 MCU 用的是内置 CAN FD 控制器初始化时要注意总线速率、采样点和位时间配置。TCAN1043A 数据段最高支持 5Mbps但实际能不能跑满取决于总线长度、节点数、终端匹配和收发器组合。工程上不要一上来就冲 5Mbps我一般先用 500kbps 仲裁段 2Mbps 数据段做验证确认波形和误码率没问题再往上调。CAN FD 比经典 CAN 对位定时更敏感采样点建议设置在 75%~80% 之间具体要看控制器时钟和波特率计算。测试时观察 RXD/TXD 波形确认显性和隐性电平干净、边沿没有明显振铃。示波器测 CANH 和 CANL 之间的差分波形显性电平应该在 2V 左右隐性电平接近 0V。如果波形台阶明显、边沿圆钝优先检查终端电阻和走线而不是怀疑收发器。5. 常见问题与排查实录5.1 节点不上线总线上看不到 ACK这个现象我自己遇到过几次排查顺序一般是先量 VCC 和 VIO 电压是否正常再看 STB_N 和 EN 电平是否真的在正常模式组合然后用示波器看 TXD 引脚有没有波形最后看 CANH/CANL 差分波形。最容易犯的错误是 VIO 没接或者接错电压。TCAN1043A 的 RXD/TXD 是以 VIO 为参考的VIO 悬空时逻辑脚电平可能飘在半空MCU 侧看到的数据全是乱的。还有一个高频坑STB_N 和 EN 两个引脚没有设置上下拉上电瞬间芯片落在睡眠模式之后代码忘了切正常模式总线当然没反应。5.2 总线出现大量错误帧如果终端电阻没放CAN 总线波形反射非常严重错误帧和总线错误计数会暴涨。单独测试一块板子时至少要在板子上的 CANH/CANL 之间接一个 120Ω。如果是两个节点对接必须两头各放 120Ω而不是只在一边放。另外注意总线供电共地。CAN 收发器的地线如果跟对端设备之间存在较大压差即使差分信号本身抗共模也可能因为地环路导致错误帧。分布式现场设备之间建议做好等电位连接必要时加隔离式收发器方案但 TCAN1043A 是带电源管理功能的最低成本方案隔离设计要额外处理 VCC 和逻辑电源复杂度会高一截。CAN FD 速率跑高之后线缆上的分布电容和终端容性负载影响会明显放大。每条短的支线(stub)都会恶化信号质量尽量把节点做成真正的主干线结构支线越短越好。5.3 睡不下去或者睡下去就醒睡眠失败首先要查 INH 是不是真的拉低了。用万用表量 INH 电压如果睡眠模式下还是高电平说明芯片并没有进入睡眠模式或者进入了待机模式但没有执行最后一步 EN0。也有可能是 MCU 的 CAN 还在持续发送请求TXD 一直有活动收发器认为总线还在忙不配合进睡眠。睡下去就醒这个现象排查方向完全不同。最常见的是总线上存在干扰脉冲被收发器当成远程唤醒信号。这时候可以先用示波器勾住 CANH/CANL观察睡眠期间是否有毛刺尤其是电机、继电器、大功率负载切换瞬间。解决办法是加强总线的滤波、增加 TVS 管、调整终端电容或者在软件里对唤醒事件做延时确认别一有沿变化就立刻上电。本地唤醒的 WAKE 引脚如果悬空也可能因为电场耦合产生误唤醒。建议 WAKE 引脚接一个稳定的上下拉电阻让它处于确定电平开关再并一个滤波电容过滤掉按键抖动或线束噪声。5.4 现场调试避坑清单按我实际项目经验TCAN1043A 相关的问题大多集中在下面几个位置直接做成检查清单比较好用VCC、VIO 电压和连接是否正确VIO 必须接到 MCU 对应 IO 电源域。STB_N、EN 是否有明确上下拉上电默认模式是否符合需求。CANH/CANL 终端电阻是否到位总线两端是否各 120Ω。INH 的负载能力是否被超过EN 脚是否需要串电阻限流。TXD 是否在 MCU 复位期间保持隐性高电平。WAKE 脚是否有稳定的偏置开关滤波是否到位。波形测试时是否同时观察了差分波形和 TXD/RXD 逻辑波形。软件进睡眠的顺序是否足够慢是否给总线留下了结束当前帧的时间。这颗芯片我用下来最大的感受是它把低功耗 CAN 节点最麻烦的那部分硬件逻辑收敛掉了剩下需要花心思的不是芯片本身而是电源拓扑和状态切换顺序。只要把 STB_N/EN 的时序捋清楚把 INH 的电源控制关系理顺整个节点就会非常省心。最后分享一个小技巧初期调板子时可以在 INH 到外部电源 EN 之间先不焊串阻直接用跳线帽短接这样遇到一睡下去就再也醒不来的问题时可以用跳线把 INH 强制拉高先把系统救活再慢慢排查睡眠逻辑。等逻辑确认没问题再恢复原样能省不少反复断电上电的时间。
