1. 从一颗车规芯片说起:TCAN4550RGYRQ1 到底解决了什么问题
第一次拿到 TCAN4550RGYRQ1 这颗料的时候,我正被一个车载网关项目折磨得够呛。项目要求三路 CAN FD 通道,主控用的是 STM32F103,但翻遍手册发现这颗老将只有一路原生 CAN 控制器,而且只支持经典 CAN,跑不了 5Mbps 的 FD 数据段。换主控?硬件已经打样了,软件栈也铺了大半,推倒重来成本太高。后来在 TI 的选型表里翻到 TCAN4550 系列,才意识到这颗芯片存在的意义就是给这类"主控 CAN 资源不够或者不支持 FD"的场景兜底。
TCAN4550RGYRQ1 是德州仪器推出的一颗汽车级 CAN FD 系统基础芯片(System Basis Chip,SBC),把 CAN FD 控制器和 CAN FD 收发器集成在了一个封装里,对外通过 SPI 接口和主控通信。注意这里的措辞——它不只是收发器,而是"控制器+收发器"二合一。市面上常见的 TJA1042、TJA1051 这类只是物理层收发器,需要主控自带 CAN 控制器;而 TCAN4550 把协议控制器也做进去了,主控只需要通过 SPI 读写寄存器就能收发 CAN FD 报文,相当于给任何带 SPI 的主控外挂了一个 CAN FD 通道。
这颗芯片的封装是 RGY,也就是 20 引脚的 VQFN,带裸露焊盘,尺寸 3.5mm × 3.5mm,对于空间紧张的车载 ECU 来说相当友好。后缀 RQ1 是 TI 的汽车级标识,符合 AEC-Q100 Grade 1 标准,工作温度范围 -40°C 到 +125°C,能扛住发动机舱边缘和车身控制模块的环境温度。供电方面,它支持 5V 到 28V 的宽电压输入,内部集成了 LDO 和看门狗,可以直接从汽车电池取电,省掉了一级外部电源。
我后来把这个方案落地到项目里,实测下来 SPI 时钟跑到 20MHz 稳定通信,CAN FD 数据段 5Mbps 连续跑 72 小时没有丢帧。这篇文章就把整个应用方案从选型逻辑、硬件设计、SPI 驱动、寄存器配置到问题排查完整梳理一遍,适合正在做车载 CAN FD 节点、工业网关或者任何需要给主控扩展 CAN FD 通道的工程师参考。不管你是刚接触 CAN FD 的新手,还是已经用过 MCP2518FD 这类方案的老手,都能从里面找到可以直接抄作业的部分。
2. 方案整体设计与选型逻辑拆解
2.1 为什么选 SBC 而不是分立方案
传统做法是主控 + 独立 CAN 控制器(比如 MCP2515)+ 独立收发器(比如 TJA1050),三颗芯片搭起来。这个方案便宜,但问题也很明显:MCP2515 只支持经典 CAN,跑不了 FD;而且三颗芯片之间的时序匹配、电源上电顺序、EMC 协调都要自己处理,PCB 面积也大。TCAN4550 把这三部分集成到一颗芯片里,对外只暴露 SPI 和 CAN 总线,设计复杂度直接降了一个量级。
更关键的是 SBC 自带电源管理。TCAN4550 内部有 5V LDO 给 CAN 收发器供电,还有 3.3V/5V 的 VIO 引脚适配主控 IO 电平。它还集成了看门狗定时器,可以在主控跑飞的时候复位系统。这些功能在分立方案里都要额外加芯片,算下来 BOM 成本和面积未必比 SBC 低。
我做过一个粗略的对比,同样是给 STM32F103 扩展一路 CAN FD:
| 对比项 | 分立方案(MCP2515+TJA1050) | TCAN4550 SBC 方案 |
|---|---|---|
| 芯片数量 | 2 颗以上 | 1 颗 |
| CAN FD 支持 | 不支持 | 支持,数据段最高 8Mbps |
| SPI 时钟 | 最高 10MHz | 最高 20MHz |
| 电源管理 | 需外部 LDO | 内置 LDO + 看门狗 |
| PCB 面积 | 约 150mm² | 约 60mm² |
| 车规认证 | 需自行验证 | AEC-Q100 Grade 1 |
| 软件复杂度 | 寄存器简单但功能少 | 寄存器多但功能完整 |
从表里能看出来,TCAN4550 的优势在于集成度和车规认证,代价是寄存器配置更复杂,SPI 驱动要写得更细致。如果你的项目对成本极度敏感且不需要 FD,分立方案仍然有优势;但只要涉及 CAN FD 或者车规要求,TCAN4550 基本是首选。
2.2 SPI 接口选型的考量
TCAN4550 对外只有 SPI 一种主控接口,没有并口、I2C 或者 UART 选项。这个设计选择其实很合理:SPI 是全双工同步接口,速率能跑到 20MHz,足够支撑 CAN FD 的吞吐量。算一笔账,CAN FD 数据段 5Mbps,一帧最多 64 字节数据,加上仲裁段和 CRC,一帧大概 80 字节左右。如果总线上负载率 50%,每秒大概要传 3900 帧,也就是 312KB/s 的数据量。SPI 跑 20MHz,理论带宽 2.5MB/s,余量充足。
但 SPI 有个坑:它是四线制(SCLK、MOSI、MISO、CS),加上 TCAN4550 的中断引脚和复位引脚,主控至少要占用 6 个 IO。如果主控 IO 紧张,这会是个问题。另外 SPI 是主从模式,TCAN4550 永远是从机,主控要主动发起读写,不能像 UART 那样被动接收。所以中断引脚很关键——TCAN4550 收到 CAN 报文后会拉低中断引脚,主控通过外部中断触发 SPI 读取,这样才不会漏帧。
我在实际项目里用的是 STM32F103 的 SPI1,配置成主机模式,时钟极性 CPOL=0、相位 CPHA=0,也就是模式 0。TCAN4550 支持 SPI 模式 0 和模式 3,我选模式 0 是因为 STM32 的 SPI 在模式 0 下时序最稳,配合 DMA 传输不容易出错。CS 片选我用的是硬件片选,由 SPI 外设自动控制,比软件拉 IO 更可靠,尤其是在 DMA 传输的时候。
2.3 电源与唤醒策略设计
TCAN4550 的供电设计有几个关键点。首先是 VBAT 引脚,直接接汽车电池,范围 5V 到 28V,内部有反向电池保护和过压保护。其次是 VIO 引脚,这个引脚决定 SPI 和中断引脚的 IO 电平,如果主控是 3.3V 系统就接 3.3V,5V 系统就接 5V。我见过有人把 VIO 悬空,结果 SPI 通信时好时坏,查了半天才发现是电平不匹配。
唤醒策略方面,TCAN4550 支持 CAN 总线唤醒和本地唤醒。CAN 总线唤醒是指总线上一旦有活动,芯片就从睡眠模式唤醒,通过中断通知主控。本地唤醒是通过 WAKE 引脚,可以接门开关、点火信号之类的。这个功能在车载节点上很重要,因为整车休眠时要求所有节点静态电流低于 100μA,TCAN4550 在睡眠模式下典型电流只有 30μA,能满足要求。
注意:VBAT 和 VIO 的上电顺序有讲究。手册建议 VIO 先于 VBAT 上电,或者同时上电。如果 VBAT 先上电而 VIO 还没建立,芯片可能进入不确定状态。我在 PCB 上把 VIO 的滤波电容放得比 VBAT 小,利用 RC 时间常数让 VIO 稍微快一点建立,实测有效。
3. 核心细节解析与硬件设计要点
3.1 引脚功能与外围电路配置
TCAN4550RGYRQ1 是 20 引脚 VQFN 封装,引脚密度高,布线的时候要特别小心。我把关键引脚和外围配置整理成表,方便对照原理图检查:
| 引脚名 | 功能 | 外围配置 | 注意事项 |
|---|---|---|---|
| VBAT | 电池供电输入 | 接 5-28V,并联 10μF+100nF | 必须加 TVS 管防浪涌 |
| VIO | IO 电平参考 | 接主控 IO 电压,并联 100nF | 不可悬空 |
| VCC | 内部 LDO 输出 | 并联 4.7μF+100nF | 仅作滤波,不对外供电 |
| SCLK | SPI 时钟 | 串联 22Ω 电阻 | 降低 EMI |
| MOSI | SPI 主出从入 | 直接连接 | 走线尽量短 |
| MISO | SPI 主入从出 | 串联 22Ω 电阻 | 降低反射 |
| CS | SPI 片选 | 直接连接 | 硬件片选优先 |
| INT | 中断输出 | 上拉 10kΩ 到 VIO | 开漏输出,低有效 |
| RST | 复位输入 | 上拉 10kΩ,接主控 IO | 低有效,上电需复位 |
| CANH/CANL | CAN 总线 | 接共模电感+终端电阻 | 终端电阻 120Ω |
| WAKE | 本地唤醒 | 接唤醒源,上拉 | 可悬空不用 |
| GND | 地 | 接裸露焊盘 | 焊盘必须接地 |
CANH 和 CANL 的外围电路是硬件设计的重点。我一般会在芯片和连接器之间加一个共模电感(比如 ACT45B-101-2P),抑制共模干扰。终端电阻方面,如果这个节点在总线末端,就接 120Ω;如果是中间节点,接分裂终端(两个 60Ω 串联,中间接 4.7nF 到地)。分裂终端的好处是能提供共模稳定性,减少辐射。
3.2 SPI 时序与通信协议细节
TCAN4550 的 SPI 通信协议和普通 SPI Flash 不太一样,它不是简单的地址+数据模式,而是有专门的命令字和寄存器映射。每次 SPI 传输以一个 16 位的命令头开始,格式是:bit15 是读写标志(1 读 0 写),bit14-11 是保留位,bit10-0 是寄存器地址。命令头后面跟数据,读操作时数据从 MISO 返回,写操作时数据从 MOSI 发出。
举个例子,要读寄存器 0x0000(设备 ID),SPI 传输的字节序列是:
- MOSI: 0x41 0x00 0x00 0x00(0x41 = 0100 0001,bit15=0 表示读,地址 0x0000)
- MISO: 0x00 0x00 0x00 0x00(前两个字节是命令回显,后两个字节是数据)
等等,这里有个细节容易搞错。TCAN4550 的 SPI 命令头是 16 位,但实际传输时是先发高字节再发低字节。读操作时,MISO 上第一个字节是命令头的高字节回显,第二个字节是低字节回显,第三个字节开始才是真正的数据。所以如果你用逻辑分析仪抓波形,会看到 MISO 前两个字节和 MOSI 的前两个字节一样,这是正常的。
写操作的时序更简单,命令头之后直接跟数据,MISO 上只有命令头回显,后面都是 0x00。但要注意,写操作完成后需要等待一段时间让芯片内部逻辑处理,具体时间取决于写的寄存器。比如写 CAN 控制寄存器后,要等至少 1μs 才能进行下一次 SPI 传输。
提示:TCAN4550 的 SPI 时钟空闲电平由 CPOL 决定,我用的模式 0 是空闲低电平。如果你用模式 3,空闲高电平,时序也能工作,但要注意和主控 SPI 配置一致。我试过模式 0 和模式 3 混用,结果通信完全失败,查了半天才发现是 CPOL 配错了。
3.3 CAN FD 控制器寄存器映射解析
TCAN4550 的寄存器空间是 16 位地址,分成几个大块:设备配置区(0x0000-0x00FF)、CAN 控制区(0x1000-0x10FF)、报文 RAM 区(0x8000-0xFFFF)。报文 RAM 是重点,它是一块 2KB 的 SRAM,用来存放待发送和已接收的 CAN 报文。
CAN 控制区的寄存器配置顺序很重要,我一般按这个流程来:
- 配置模式寄存器(0x1000),进入配置模式
- 配置位定时寄存器(0x1004-0x100C),设置仲裁段和数据段的波特率
- 配置报文 RAM 的分配,设置发送缓冲区和接收 FIFO 的数量
- 配置中断使能寄存器(0x1010),打开接收中断和错误中断
- 退出配置模式,进入正常模式
位定时寄存器的计算是个难点。CAN FD 的位定时分仲裁段和数据段两部分,仲裁段用经典 CAN 的波特率(比如 500kbps),数据段用更高的波特率(比如 2Mbps 或 5Mbps)。以 40MHz 的 CAN 时钟为例,要配 500kbps 仲裁段和 2Mbps 数据段:
仲裁段:40MHz / 500kbps = 80 个时钟周期。设同步段 1TQ,传播段 31TQ,相位段 1 为 32TQ,相位段 2 为 16TQ,总共 80TQ。对应寄存器值:BRP=1,TSEG1=31,TSEG2=16,SJW=16。
数据段:40MHz / 2Mbps = 20 个时钟周期。设同步段 1TQ,传播段 7TQ,相位段 1 为 8TQ,相位段 2 为 4TQ,总共 20TQ。对应寄存器值:BRP=1,TSEG1=7,TSEG2=4,SJW=4。
这些值要分别写入仲裁段和数据段的位定时寄存器。如果配错了,CAN 总线根本起不来,或者能起来但一收发包就报错。
4. 实操过程与核心环节实现
4.1 硬件上电与复位时序
硬件焊接完成后,第一次上电不要急着跑代码,先用示波器看几个关键信号。我一般按这个顺序检查:
第一步,测 VBAT 和 VIO 的上电时序。VBAT 应该在 5V 到 28V 之间,VIO 应该和主控 IO 电压一致。如果 VIO 比 VBAT 晚太多,芯片可能初始化失败。我遇到过 VIO 滤波电容焊成 10μF 的情况,导致 VIO 上升太慢,芯片一直处于复位状态,SPI 读出来全是 0xFF。
第二步,测 RST 引脚。上电后 RST 应该被主控拉低至少 100ns 再释放,确保芯片内部复位完成。如果 RST 一直低,芯片不工作;如果一直高,可能没复位干净。我习惯在初始化代码里先拉低 RST 延时 10ms,再拉高延时 10ms,然后才开始 SPI 通信。
第三步,测 SPI 的 CS、SCLK、MOSI 波形。用逻辑分析仪抓一次读设备 ID 的传输,看命令头是否正确,MISO 是否有数据返回。如果 MISO 一直是高阻态,可能是 CS 没拉低,或者芯片没上电。
第四步,测 CANH 和 CANL 的静态电平。正常情况 CANH 约 2.5V,CANL 约 2.5V,差分电压接近 0V。如果差分电压很大,可能是收发器损坏或者终端电阻接错。
4.2 STM32 SPI DMA 驱动实现
主控这边我用的是 STM32F103 的 SPI1,配合 DMA 传输。为什么用 DMA?因为 CAN FD 的报文可能很长(64 字节数据),如果 CPU 轮询 SPI 会占用大量时间。DMA 可以在后台搬运数据,CPU 只处理中断和协议解析。
CubeMX 配置步骤:
- 使能 SPI1,模式选 Full-Duplex Master,硬件片选选 Hardware NSS Output
- 时钟极性 CPOL=Low,相位 CPHA=1Edge,也就是模式 0
- 预分频器选 4,SPI 时钟 = 72MHz / 4 = 18MHz(接近 20MHz 上限)
- 数据宽度 8 位,MSB First
- 使能 SPI1 TX DMA 和 RX DMA,模式选 Normal(不是 Circular)
- 使能 SPI1 全局中断,优先级设为中等
DMA 配置的关键是数据宽度和传输方向。TCAN4550 的 SPI 是全双工,每次传输既要发命令又要收数据,所以 TX 和 RX DMA 都要开。我一般定义一个 8 字节的发送缓冲区和 8 字节的接收缓冲区,发送缓冲区填好命令头和数据,然后启动 DMA 传输,等 DMA 传输完成中断触发后再解析接收缓冲区。
代码框架大概是这样:
uint8_t spi_tx_buf[8]; uint8_t spi_rx_buf[8]; volatile uint8_t spi_dma_done = 0; void tcan4550_spi_transfer(uint8_t *tx, uint8_t *rx, uint16_t len) { spi_dma_done = 0; HAL_SPI_TransmitReceive_DMA(&hspi1, tx, rx, len); while (!spi_dma_done); // 等待 DMA 完成 } void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi == &hspi1) { spi_dma_done = 1; } } uint8_t tcan4550_read_reg(uint16_t addr) { spi_tx_buf[0] = 0x40 | ((addr >> 8) & 0x0F); // 读命令 + 地址高 4 位 spi_tx_buf[1] = addr & 0xFF; // 地址低 8 位 spi_tx_buf[2] = 0x00; spi_tx_buf[3] = 0x00; tcan4550_spi_transfer(spi_tx_buf, spi_rx_buf, 4); return spi_rx_buf[3]; // 第 4 个字节是数据 }这里有个细节:TCAN4550 的寄存器是 8 位的,但地址是 16 位的。读命令的格式是 bit15=0,bit14-11 保留,bit10-0 是地址。所以命令头高字节是 0x40 | (addr >> 8),低字节是 addr & 0xFF。我见过有人把地址直接当 16 位发,结果读出来全是错的数据。
注意:DMA 传输完成后不要立即释放缓冲区,因为 DMA 控制器可能还有最后一个字节没写完。我一般会在 DMA 完成中断里加一个 __DSB() 内存屏障指令,确保数据同步。另外,SPI 的 DMA 传输长度要和缓冲区大小匹配,如果 len 超过缓冲区大小会越界。
4.3 CAN FD 报文收发流程
报文发送的流程是:主控把报文写入 TCAN4550 的发送缓冲区,然后置位发送请求位,芯片自动把报文发到 CAN 总线上。发送完成后,芯片会置位发送完成中断标志,主控读取状态寄存器确认发送成功。
具体步骤:
- 读发送 FIFO 状态寄存器(0x10A0),确认有空闲的发送缓冲区
- 把报文 ID、DLC、数据写入对应的发送缓冲区地址
- 写发送请求寄存器(0x10A8),置位对应缓冲区的发送请求位
- 等待发送完成中断,或者轮询状态寄存器
报文接收的流程是:芯片收到 CAN 报文后,自动存入接收 FIFO,并拉低 INT 引脚。主控通过外部中断触发,读取接收 FIFO 状态寄存器,确认有报文后,从 FIFO 地址读出报文。
接收 FIFO 的读取有个技巧:TCAN4550 的接收 FIFO 是环形缓冲区,读指针和写指针由芯片自动管理。主控只需要读 FIFO 状态寄存器获取当前可读报文数量,然后连续读取即可。读完后要写 FIFO 确认寄存器,告诉芯片这些报文已经处理完,可以释放空间。
我实测下来,用中断方式接收比轮询方式可靠得多。轮询方式在总线负载高的时候容易漏帧,因为主控可能正在处理其他任务,没及时读 FIFO。中断方式下,INT 引脚一拉低就触发读取,响应时间在微秒级,基本不会漏帧。
4.4 波特率配置与实测验证
波特率配置是 CAN FD 应用里最容易出错的地方。我一般用这个流程来验证:
第一步,用示波器测 CANH 和 CANL 的波形,看位时间是否符合预期。比如 500kbps 的位时间是 2μs,2Mbps 的位时间是 500ns。如果位时间偏差超过 5%,说明位定时寄存器配错了。
第二步,用 CAN 分析仪(比如周立功的 USBCANFD-200U)连接总线,发送标准帧和扩展帧,看 TCAN4550 能否正确接收。如果收不到,检查验收滤波器配置,默认情况下滤波器可能把所有报文都过滤掉了。
第三步,测试 CAN FD 帧。发送一帧数据段 2Mbps、64 字节数据的报文,看接收端能否正确解析。如果数据段报错,检查数据段位定时寄存器和 BRS 位(波特率切换位)是否使能。
我踩过的一个坑是:仲裁段和数据段的采样点设置不一致。仲裁段采样点设了 75%,数据段设了 80%,结果在数据段高速传输时偶尔报错。后来把两段采样点都统一到 75%,问题消失。采样点的计算公式是 (TSEG1 + 1) / (TSEG1 + TSEG2 + 2),一般建议设在 75% 到 80% 之间。
5. 常见问题与排查技巧实录
5.1 SPI 通信失败排查速查表
SPI 通信失败是最常见的问题,我整理了一个排查表,按顺序检查基本能定位到原因:
| 现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| MISO 一直高电平 | CS 未拉低 | 测 CS 引脚波形 | 检查片选配置 |
| MISO 一直低电平 | 芯片未上电 | 测 VCC 和 VIO | 检查电源电路 |
| 读出来全是 0xFF | SPI 模式错误 | 测 SCLK 空闲电平 | 改 CPOL/CPHA |
| 读出来全是 0x00 | 芯片未复位 | 测 RST 引脚 | 加复位时序 |
| 数据偶尔错误 | 时钟太快 | 降低 SPI 时钟 | 降到 10MHz 测试 |
| 命令头回显错误 | 字节序错误 | 抓 SPI 波形 | 调整发送顺序 |
| 中断不触发 | INT 未上拉 | 测 INT 引脚 | 加上拉电阻 |
我遇到最多的是 SPI 模式配错。STM32 的 SPI 模式 0 是 CPOL=0、CPHA=0,模式 3 是 CPOL=1、CPHA=1。TCAN4550 两种都支持,但必须和主控一致。有一次我用 CubeMX 配了模式 3,但代码里手动改了 CPOL 位,结果模式变成 1,通信完全失败。后来用逻辑分析仪抓波形,发现 SCLK 在 CS 拉低后第一个边沿是下降沿,才意识到模式配错了。
5.2 CAN 总线无法通信的典型原因
CAN 总线调不通,原因通常在这几个地方:
第一,终端电阻。CAN 总线两端各需要一个 120Ω 终端电阻,如果两个都没接,或者只接了一个,总线阻抗不匹配,通信距离短且容易出错。我一般用万用表测 CANH 和 CANL 之间的电阻,正常应该是 60Ω(两个 120Ω 并联)。如果测出来是 120Ω,说明只接了一个;如果是无穷大,说明一个都没接。
第二,波特率不匹配。总线上所有节点的波特率必须一致,包括仲裁段和数据段。如果有一个节点配了 500kbps,另一个配了 250kbps,通信肯定失败。我习惯用 CAN 分析仪先扫一遍总线,确认波特率后再配置节点。
第三,CANH 和 CANL 接反。这个错误很低级但很常见,接反了总线完全没波形。测静态电平,CANH 应该约 2.5V,CANL 也约 2.5V,如果反了,CANH 会接近 0V,CANL 接近 5V。
第四,共模电压超出范围。TCAN4550 的共模电压范围是 -12V 到 +12V,如果总线上的共模电压超出这个范围,收发器会保护性关闭。这种情况一般发生在总线很长或者有强干扰源的时候,加共模电感或者隔离器可以解决。
5.3 中断丢失与 FIFO 溢出处理
中断丢失是 CAN FD 高负载场景下的常见问题。现象是总线负载一高,就偶尔丢帧。原因通常是主控中断响应太慢,或者 FIFO 太小。
我的处理方法是:第一,提高中断优先级,把 CAN 接收中断设成最高优先级,确保第一时间响应。第二,增大接收 FIFO,TCAN4550 的报文 RAM 是 2KB,可以分配多一些给接收 FIFO,比如分配 1KB 给接收,1KB 给发送。第三,在中断服务函数里只做最少的操作,把报文读出来放到环形缓冲区,剩下的解析交给主循环。
如果 FIFO 还是溢出,可以启用 FIFO 溢出中断,一旦溢出就记录错误日志,方便后续分析。我一般会在 FIFO 里留 10% 的余量,比如 FIFO 深度 32 帧,实际用到 28 帧就开始报警,提醒主控加快处理速度。
提示:TCAN4550 的中断引脚是开漏输出,必须加上拉电阻。上拉电阻一般选 10kΩ,太小会增加功耗,太大上升沿会变缓。我试过用 4.7kΩ,上升沿明显变快,但静态电流增加了 0.5mA,对低功耗应用不太友好。
5.4 低功耗模式与唤醒调试
低功耗调试是车载应用绕不开的环节。TCAN4550 支持睡眠模式,进入睡眠后典型电流 30μA。但实际调试时经常发现电流降不下来,原因通常是:
第一,SPI 引脚漏电。如果主控的 SPI 引脚在睡眠时输出高电平,而 TCAN4550 的 VIO 是 3.3V,可能会有漏电流。解决方法是在进入睡眠前把 SPI 引脚配成模拟输入或者低电平输出。
第二,CAN 总线活动阻止睡眠。如果总线上有持续的活动,TCAN4550 会一直被唤醒,无法进入睡眠。这种情况要检查总线上的其他节点,确保没有节点在睡眠时还在发报文。
第三,唤醒源配置错误。TCAN4550 的唤醒源包括 CAN 总线活动和 WAKE 引脚,如果不需要某个唤醒源,要在寄存器里关掉。我见过有人没关 WAKE 引脚唤醒,结果 WAKE 引脚悬空被干扰触发,芯片频繁唤醒,电流一直降不下来。
唤醒调试的时候,我一般用电流探头配合示波器,观察睡眠和唤醒时的电流波形。正常睡眠电流应该是平稳的 30μA 左右,如果看到周期性尖峰,说明有唤醒事件在触发。
6. 方案扩展与实战经验补充
6.1 多路 CAN FD 通道的扩展方法
单颗 TCAN4550 只提供一路 CAN FD 通道,如果项目需要多路,有两种扩展方式。第一种是挂多颗 TCAN4550 到同一个 SPI 总线上,用不同的 CS 片选区分。这种方式硬件简单,但 SPI 带宽是共享的,如果多路同时高负载,SPI 可能成为瓶颈。我算过,三路 CAN FD 同时跑 5Mbps,SPI 需要至少 30MHz 才能不丢帧,而 TCAN4550 最高只支持 20MHz,所以三路以上建议用第二种方式。
第二种方式是用多颗 TCAN4550,每颗挂到独立的 SPI 总线上。STM32F103 有 SPI1 和 SPI2 两个 SPI 外设,可以各挂一颗。如果需要更多路,可以用 SPI 扩展芯片或者换主控。这种方式 SPI 带宽独立,不会互相影响,但占用更多 IO 和 PCB 面积。
我实际项目里用的是两颗 TCAN4550,一颗挂 SPI1 负责动力 CAN,一颗挂 SPI2 负责车身 CAN,两颗芯片的中断引脚分别接到 STM32 的 EXTI0 和 EXTI1,互不干扰。实测两路同时跑 2Mbps,CPU 占用率不到 15%。
6.2 与经典 CAN 方案的兼容性处理
很多项目是从经典 CAN 升级到 CAN FD 的,总线上可能同时存在经典 CAN 节点和 CAN FD 节点。TCAN4550 支持混合模式,可以配置成只收发经典 CAN 帧,也可以配置成同时收发经典 CAN 和 CAN FD 帧。
兼容性处理的关键是波特率。经典 CAN 节点只认仲裁段波特率,不认数据段波特率。所以如果总线上有经典 CAN 节点,CAN FD 帧的数据段波特率不能太高,否则经典 CAN 节点会报格式错误。我一般建议数据段波特率不超过 2Mbps,这样经典 CAN 节点虽然看不懂数据段,但至少不会报错。
另外,CAN FD 帧的 DLC 编码和经典 CAN 不同。经典 CAN 的 DLC 是 0-8,CAN FD 的 DLC 是 0-15,其中 9-15 对应 12、16、20、24、32、48、64 字节。如果主控软件没处理这个映射,收到的报文长度会解析错误。我在代码里加了一个 DLC 映射表,把 CAN FD 的 DLC 值转成实际字节数,避免了解析错误。
6.3 从零搭建测试环境的完整清单
如果你要复现这个方案,这是我从实际项目中总结的测试环境清单:
硬件部分:
- TCAN4550RGYRQ1 评估板或者自制 PCB
- STM32F103 开发板(或者其他带 SPI 的主控)
- CAN 分析仪(支持 CAN FD,比如周立功 USBCANFD-200U)
- 示波器(带宽至少 100MHz,测 SPI 和 CAN 波形)
- 逻辑分析仪(测 SPI 时序,8 通道以上)
- 万用表(测电源和终端电阻)
- 可调电源(模拟汽车电池电压)
软件部分:
- STM32CubeMX(配置 SPI 和 DMA)
- Keil MDK 或者 STM32CubeIDE(编译代码)
- CAN 分析仪上位机软件(收发报文)
- 串口调试助手(打印调试信息)
调试步骤:
- 上电检查电源和复位
- SPI 读设备 ID,确认通信正常
- 配置 CAN 控制器,进入正常模式
- 用 CAN 分析仪发经典 CAN 帧,测试接收
- 发 CAN FD 帧,测试数据段
- 高负载测试,检查丢帧率
- 低功耗测试,检查睡眠电流
这套流程我走过很多遍,基本上半天时间就能把一颗 TCAN4550 调通。最花时间的是波特率配置和中断调试,但只要按步骤来,不会出大问题。
6.4 几个容易忽略的实操细节
最后分享几个我在实际项目中踩过的坑,都是文档里不会写的:
第一,TCAN4550 的 SPI 命令头里有一个"写使能"位。写寄存器之前要先发一个写使能命令,否则写操作会被忽略。我一开始没注意这个,写寄存器一直不生效,查了一天才发现手册里有一行小字提到这个。
第二,CAN 总线的地线要处理好。如果两个节点的地电位差太大,CAN 收发器可能损坏。我一般会在 CAN 连接器附近加一个地线端子,确保所有节点共地。如果地电位差无法消除,就要用隔离型 CAN 收发器。
第三,TCAN4550 的报文 RAM 是 2KB,但实际可用空间要减去寄存器和保留区域。我算过,实际可用于报文存储的空间大概 1.8KB。如果分配太多发送缓冲区,接收 FIFO 就会不够用。我一般分配 512 字节给发送,1.2KB 给接收,剩下的留给寄存器和保留区域。
第四,SPI 的 CS 片选在两次传输之间要保持高电平至少 50ns,否则 TCAN4550 可能把两次传输当成一次。STM32 的硬件片选会自动处理这个间隔,但如果用软件片选,要在代码里加延时。
第五,TCAN4550 的固件版本会影响寄存器行为。我遇到过一批芯片,固件版本是 A,中断寄存器的行为和手册描述不一致,后来换了固件版本 B 的芯片就正常了。所以批量生产前一定要确认芯片的固件版本,最好找 TI 的 FAE 确认一下。
这些细节看起来不起眼,但每一个都可能让你多花半天甚至一天的时间。我在实际使用中的体会是,TCAN4550 这颗芯片功能很强,但寄存器配置比较繁琐,第一次用一定要留足调试时间,不要指望一次成功。把 SPI 通信和波特率配置这两个基础环节做扎实,后面的报文收发和中断处理都是水到渠成的事。