2. CANFD硬件接口:收发器选型、控制器配置与总线拓扑

好,咱们进入第二章。这一章聊的是硬件,是OTA升级的物理基础。你想想看,协议栈写得再漂亮,如果硬件接口掉链子,数据传不过去,一切都是白搭。我个人习惯,做项目第一步就是先把硬件接口吃透,不然心里没底。

2.1 CANFD收发器选型:别小看这颗芯片

收发器,说白了就是MCU的CAN控制器和物理总线之间的“翻译官”。它把控制器输出的差分信号,转换成总线上的CANH/CANL电平。反过来也一样。

选型时,我重点关注这几个参数:

  • 速率支持:CANFD的数据段速率最高能到8Mbps甚至更高。普通CAN收发器(比如TJA1050)只能到1Mbps,跑不了CANFD。必须选支持CANFD的型号,比如TJA1044、TJA1463、SN65HVD255这些。
  • 待机与唤醒:OTA升级场景里,ECU经常需要休眠。选带低功耗待机模式和远程唤醒功能的收发器,能省不少电。我记得有个项目,客户要求待机电流小于10μA,最后选了TJA1044,实测下来完全没问题。
  • EMC与保护:车载环境干扰大。收发器最好带±8kV以上的ESD保护,以及共模扼流圈集成。我曾经在EMC测试时吃过亏,没加防护的收发器在辐射发射测试中直接超标,后来换了带集成共模电感的型号才过。

避坑指南:我曾经遇到过一款号称支持CANFD的收发器,结果在5Mbps速率下眼图质量很差,导致丢包率飙升。后来查手册才发现,它所谓的“支持”只是兼容模式,实际最高稳定速率只有2Mbps。所以选型时,一定要看数据手册里的“CAN FD Data Phase Timing”参数,别只看标题。

2.2 MCU内部CANFD控制器配置

控制器在MCU内部,负责协议层的处理。配置它,是咱们嵌入式工程师的日常。嗯,这里要注意,不同厂家的MCU,寄存器名字和配置流程可能不一样,但核心思路是相通的。

配置步骤,我一般这么来:

  1. 时钟使能:先打开CANFD控制器的时钟。比如在STM32上,就是RCC_APB1PeriphClockCmd()。
  2. 引脚复用:把CANFD的TX和RX引脚,配置成对应的复用功能。别搞错引脚,我见过有人把TX和RX接反了,查了半天。
  3. 初始化参数:设置波特率、采样点、同步跳转宽度等。CANFD有两个波特率:仲裁段(通常250k或500k)和数据段(最高8M)。
  4. 滤波器配置:设置ID过滤,只接收需要的报文。OTA升级时,通常只接收特定ID的升级数据包,其他一概过滤掉,减轻CPU负担。
  5. 中断使能:打开接收中断、错误中断等。我习惯把错误中断也打开,方便调试。

下面是一个简化的配置代码示例,以STM32H7的CANFD为例:

// CANFD初始化示例(STM32H7)
void CANFD_Init(void)
{
    hfdcan1.Instance = FDCAN1;
    hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;  // 启用BRS,数据段高速
    hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
    hfdcan1.Init.AutoRetransmission = ENABLE;       // 自动重发,我建议开启
    hfdcan1.Init.TransmitPause = DISABLE;
    hfdcan1.Init.ProtocolException = DISABLE;

    // 仲裁段:500kbps,数据段:2Mbps
    hfdcan1.Init.NominalPrescaler = 2;
    hfdcan1.Init.NominalSyncJumpWidth = 1;
    hfdcan1.Init.NominalTimeSeg1 = 13;
    hfdcan1.Init.NominalTimeSeg2 = 2;

    hfdcan1.Init.DataPrescaler = 1;
    hfdcan1.Init.DataSyncJumpWidth = 1;
    hfdcan1.Init.DataTimeSeg1 = 13;
    hfdcan1.Init.DataTimeSeg2 = 2;

    if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
    {
        Error_Handler();  // 初始化失败,检查时钟和引脚
    }
}

个人经验:采样点的设置很关键。我一般把采样点设在75%~80%的位置。比如仲裁段500kbps,时间份额Tq=100ns,那么采样点= (1 + 13) / (1 + 13 + 2) = 87.5%,稍微偏高了。实际项目中,我会根据总线长度和节点数量微调,确保采样点在信号最稳定的时刻。

2.3 CANFD终端电阻与总线拓扑

终端电阻,这是老生常谈,但也是最容易出问题的地方。CAN总线两端各需要一颗120Ω的电阻,用来匹配阻抗,防止信号反射。

为什么是120Ω? 因为CAN总线的特征阻抗大约是120Ω。如果不加终端电阻,或者只加了一颗,信号在总线末端会反射回来,造成波形畸变。你想想看,高速通信时波形都畸变了,数据还能对吗?

实际项目中,我见过几种拓扑:

  • 直线型(最推荐):所有节点都挂在一条主干线上,终端电阻在主干线两端。这是最标准、最可靠的拓扑。OTA升级时,我强烈建议用这种。
  • 星型:所有节点通过一个中心节点连接。这种拓扑容易产生反射,而且中心节点一旦故障,整个网络就瘫了。我不建议在CANFD上使用。
  • 混合型:主干线加短分支。分支长度要尽量短,一般不超过0.3米。分支越长,信号质量越差。
拓扑类型 优点 缺点 CANFD适用性
直线型 信号质量好,易于扩展 布线要求高 强烈推荐
星型 布线灵活 反射严重,可靠性差 不推荐
混合型 兼顾灵活与性能 分支长度需严格控制 谨慎使用

警告:我曾经在一个项目中,为了省事,只在总线一端加了120Ω电阻。结果在2Mbps速率下,通信时好时坏。用示波器一看,CANH和CANL的差分信号在末端有超过1V的过冲和振铃。后来老老实实两端都加上电阻,波形立刻干净了。所以,终端电阻千万别省,也别只加一端。

另外,有些MCU内部集成了终端电阻,可以通过寄存器使能。但我个人习惯,还是用外部贴片电阻,更可靠,也方便调试时更换。

好了,这一章的内容就这些。硬件接口是OTA升级的基石,收发器选型、控制器配置、终端电阻和拓扑,每一步都马虎不得。下一章,咱们开始聊CANFD协议栈的软件架构,那才是真正烧脑的地方。