第1章 电池通信协议:SMBus、HDQ、CAN总线、I2C在BMS中的应用

做BMS(电池管理系统)这些年,我接触过不少通信协议。说实话,刚开始我也觉得协议这东西,能通就行。直到有一次项目调试,电池数据死活读不出来,折腾了两天才发现是协议时序没配好。嗯,从那以后我再也不敢小看这些通信协议了。

今天咱们就来聊聊BMS里最常见的四种通信协议:SMBus、HDQ、CAN总线和I2C。它们各有各的脾气,选对了事半功倍,选错了……你懂的。

1.1 I2C:最基础的“通用语言”

I2C是BMS里最常用的协议之一。它只有两根线:SCL(时钟线)和SDA(数据线)。说白了,就是一根线负责打拍子,一根线负责说话。

核心特点:

  • 主从架构:一个主设备,多个从设备
  • 7位或10位地址,最多支持127个设备
  • 标准模式100kHz,快速模式400kHz
  • 支持多主机仲裁

实际应用场景:

我习惯用I2C连接电量计芯片(比如TI的BQ系列)和主控MCU。因为I2C的从设备地址是固定的,只要不冲突,挂多少个都行。

// I2C读取电池电压示例(伪代码)
uint16_t read_battery_voltage(void) {
    uint8_t reg_addr = 0x08;  // 电压寄存器地址
    uint8_t data[2];
    
    i2c_start();
    i2c_write(0xAA);  // 设备地址+写
    i2c_write(reg_addr);
    i2c_stop();
    
    i2c_start();
    i2c_write(0xAB);  // 设备地址+读
    data[0] = i2c_read(ACK);
    data[1] = i2c_read(NACK);
    i2c_stop();
    
    return (data[0] << 8) | data[1];
}

避坑指南:

我曾经遇到过I2C总线被锁死的情况。原因是从设备没释放SDA线,导致主设备一直等不到应答。解决办法是加一个超时机制,或者用GPIO模拟I2C时序。

1.2 SMBus:I2C的“升级版”

SMBus(System Management Bus)是基于I2C发展而来的。它俩物理层一样,但SMBus在协议层加了更多规矩。

SMBus vs I2C:

特性 I2C SMBus
时钟频率 100kHz/400kHz 10kHz~100kHz
超时机制 35ms超时
地址解析协议 支持ARP
分组错误校验 支持PEC
最小时钟低电平时间 无要求 4.7μs

你想想看,SMBus多了超时和校验,可靠性自然更高。我建议在消费电子产品的BMS里优先用SMBus,尤其是笔记本电池这种需要热插拔的场景。

个人经验:

我记得有一次做笔记本电池项目,客户要求支持SMBus的智能电池协议(Smart Battery Data)。这个协议定义了标准的寄存器地址,比如0x08是电压,0x0C是剩余容量。用起来很方便,但要注意不同厂家的电池可能寄存器地址不一样。

1.3 HDQ:TI的“独门秘籍”

HDQ是TI(德州仪器)推出的单线协议。没错,就一根线,既传数据又传时钟。这玩意儿在TI的BQ系列电量计芯片里很常见。

HDQ的特点:

  • 单线双向通信
  • 主从架构,一个主设备对应一个从设备
  • 数据速率约5kbps
  • 基于脉冲宽度调制

说白了,HDQ就是通过脉冲的宽度来表示0和1。宽脉冲是1,窄脉冲是0。这种方式抗干扰能力不错,但速率上不去。

// HDQ读取数据时序示例
// 1. 主机发送BREAK信号(拉低240μs)
// 2. 主机发送命令字节(7位地址+1位R/W)
// 3. 从机返回数据(8位数据)

void hdq_read_byte(uint8_t cmd) {
    // 发送BREAK
    hdq_pin_low();
    delay_us(240);
    hdq_pin_high();
    delay_us(40);
    
    // 发送命令
    for(int i=0; i<8; i++) {
        if(cmd & (1<<i)) {
            // 宽脉冲表示1
            hdq_pin_low();
            delay_us(36);
            hdq_pin_high();
            delay_us(72);
        } else {
            // 窄脉冲表示0
            hdq_pin_low();
            delay_us(72);
            hdq_pin_high();
            delay_us(36);
        }
    }
}

什么时候用HDQ?

我建议在引脚资源紧张的项目里用HDQ。比如有些小尺寸的TWS耳机充电仓,MCU引脚就那么几个,用HDQ可以省一根线。但要注意,HDQ的速率慢,不适合大数据量传输。

1.4 CAN总线:工业级的“老大哥”

CAN总线在汽车BMS里用得最多。它跟前面几种协议不一样,是差分信号传输,抗干扰能力特别强。

CAN总线的优势:

  • 差分信号,共模抑制能力强
  • 多主架构,任何节点都能主动发数据
  • 错误检测机制完善(CRC、位填充、格式检查等)
  • 传输距离远(可达1km)
  • 速率高(最高1Mbps)

你想想看,汽车里电磁环境那么复杂,要是用I2C或者SMBus,数据早就被干扰得不成样子了。CAN总线就不一样,差分信号天生抗干扰。

特性 CAN 2.0A CAN 2.0B CAN FD
标识符长度 11位 29位 11/29位
最大数据长度 8字节 8字节 64字节
最大速率 1Mbps 1Mbps 8Mbps
典型应用 简单BMS 复杂BMS 高带宽BMS

避坑指南:

我曾经在电动汽车BMS项目里踩过CAN总线的坑。当时电池包里有十几个从控模块,每个模块都往总线上发数据。结果总线负载率太高,导致优先级低的报文发不出去。后来重新设计了报文优先级和发送周期,才解决问题。

1.5 协议对比与选型建议

说了这么多,到底该选哪个?我整理了一个对比表,方便你参考:

协议 线数 速率 距离 抗干扰 成本 典型应用
I2C 2 400kHz 几米 消费电子
SMBus 2 100kHz 几米 笔记本电池
HDQ 1 5kbps 1米 极低 小尺寸设备
CAN 2 1Mbps 1km 汽车BMS

我的选型建议:

  • 消费电子(手机、平板):优先SMBus,兼容性好,可靠性高
  • 小尺寸设备(TWS耳机、智能手表):HDQ,省引脚
  • 汽车BMS:CAN总线,没得选
  • 工业设备:CAN或SMBus,看距离和速率要求

个人习惯:

我一般会在项目初期先确定通信距离和速率要求,再选协议。如果距离超过10米,直接上CAN。如果距离短但设备多,用I2C或SMBus。如果引脚紧张,HDQ是个不错的选择。

1.6 知识体系总览

下面这张图总结了四种协议的核心特点和应用场景,方便你快速回顾:

BMS电池通信协议知识体系 BMS通信协议 I2C SMBus HDQ CAN总线 2线 · 400kHz 消费电子 2线 · 100kHz 笔记本电池 1线 · 5kbps 小尺寸设备 2线 · 1Mbps 汽车BMS 选型建议 • 消费电子 → SMBus(兼容性好) • 小尺寸设备 → HDQ(省引脚) • 汽车BMS → CAN总线(抗干扰强) • 工业设备 → CAN或SMBus(看距离)

好了,这一章的内容就到这里。四种协议各有千秋,选型时一定要结合项目实际需求。下一章咱们聊聊电池的充放电管理,到时候会用到这些协议的知识。