第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 知识体系总览
下面这张图总结了四种协议的核心特点和应用场景,方便你快速回顾:
好了,这一章的内容就到这里。四种协议各有千秋,选型时一定要结合项目实际需求。下一章咱们聊聊电池的充放电管理,到时候会用到这些协议的知识。