BQ41Z90 BMS集成指南:TMP468温度监控与SHA-1安全认证实战

📅 2026/7/23 10:35:25
BQ41Z90 BMS集成指南:TMP468温度监控与SHA-1安全认证实战
1. 项目概述为什么BMS的温度与安全如此重要在电池管理系统BMS的设计中有两件事是工程师们最常挂在嘴边也最不敢掉以轻心的一是温度二是安全。温度监控不准轻则影响电池寿命和性能重则直接引发热失控后果不堪设想。而安全机制若有漏洞整个系统的控制权就可能旁落数据被篡改设备形同虚设。我经手过不少项目从消费电子到大型储能最后出问题回溯十有八九都跟这两点脱不开干系。德州仪器TI的BQ41Z90作为其旗舰级的电池电量计芯片在这两个核心痛点上给出了相当扎实的解决方案。它不仅仅是一个高精度的电量计更是一个集成了高级安全认证和灵活外部传感器接口的微型控制中枢。特别是它对TMP468这款高精度、多通道数字温度传感器的原生支持以及从SHA-1到ECC的多层次安全认证体系让它在设计高可靠性电池包时成为了一个非常“省心”的选择。简单来说这个项目要探讨的就是如何利用BQ41Z90把TMP468的温度数据“无缝”且“可靠”地整合进你的BMS同时如何配置和运用其强大的安全机制为你的电池系统筑起一道坚固的防线。无论你是正在设计下一代电动工具还是复杂的储能系统理解这些集成细节和安全配置都能让你在调试和量产时少走很多弯路。2. TMP468温度传感器集成从硬件连接到数据应用TMP468是TI推出的一款高精度、多通道数字温度传感器支持最多1个本地通道和8个远程通道。BQ41Z90通过I2C接口与其通信将其变为BMS的“温度感知延伸”。这个集成不是简单的数据读取而是一套包含配置、功耗管理和数据应用的完整方案。2.1 硬件连接与通信基础TMP468与BQ41Z90通过标准的I2C总线连接。通常你会将TMP468的SDA和SCL引脚分别连接到BQ41Z90的相应GPIO引脚需配置为I2C功能。这里有个关键点BQ41Z90是主机MasterTMP468是从机Slave。你需要为TMP468设置一个唯一的I2C设备地址这个地址通过其硬件引脚如A0, A1的电平来设定确保不与总线上其他设备冲突。在BQ41Z90的数据闪存Data Flash配置中你需要使能TMP468功能。具体位置在DA Configuration寄存器中找到[TMP468_EN]这个位将其设置为1。这是整个集成功能的“总开关”。如果这个位没开后续所有关于TMP468的配置都是无效的。实操心得在画原理图时务必确认TMP468的地址选择引脚A0, A1等的上拉/下拉电阻是否正确焊接。我遇到过因为电阻贴错导致地址错误BQ41Z90始终无法识别传感器的情况。调试时可以先用一个简单的I2C扫描工具比如通过MCU确认TMP468的地址是否正确响应这能快速排除硬件连接问题。2.2 传感器通道的配置与启用TMP468最多可以提供8个远程温度通道连接远程PN结如晶体管和1个本地通道。BQ41Z90允许你灵活地将这些外部通道分配给两个关键的监控对象电芯温度Cell Temperature和FET温度FET Temperature。配置分为两步启用特定传感器通道在Ext TMP Temperature Enable寄存器中为你想要使用的TMP468外部通道例如通道1、通道2置位。即使TMP468内部配置启用了某个通道如果BQ41Z90这里没开它也不会使用该通道的数据。特别注意TMP468的本地温度传感器数据BQ41Z90内部是不会使用的。如果你需要读取这个本地温度必须通过后面提到的透传命令ManufacturerAccess() 0x0081 TMPRead1()来手动读取。指定通道用途在Ext TMP Temperature Mode寄存器中为已启用的通道设置其用途。你需要明确指定哪个TMP468通道的数据用于报告“电芯温度”哪个用于报告“FET温度”。BQ41Z90允许你将同一个物理传感器分配给不同的逻辑用途这为硬件布局提供了极大的灵活性。例如你可以用TMP468的通道1监控电池模组中间最热的电芯通道2监控放电MOSFET的温度。这里有一个容易混淆的点BQ41Z90自身通常也集成了至少一个内部温度传感器和多个外部热敏电阻TS接口。DA Configuration中的[CTEMP1]和[CTEMP0]位是用来选择使用内部传感器还是外部热敏电阻作为主温度源的。这个配置独立于[TMP468_EN]的设置。也就是说即使你启用了TMP468[CTEMP1]和[CTEMP0]的功能依然按照其原有逻辑工作它们主要影响的是“主”温度源的选取。TMP468在这里更像是提供了额外的、可配置的“辅助”或“专用”温度监控点。2.3 低功耗电源管理策略在电池供电的设备中每一微安的电流都至关重要。BQ41Z90对TMP468的电源管理设计得非常精细充分考虑了功耗优化。BQ41Z90并非让TMP468一直处于工作状态。它的策略是“按需唤醒用完即睡”唤醒当BQ41Z90需要新的温度数据时根据其内部采样周期它会通过I2C总线给TMP468发送命令将其从关断SHUTDOWN模式唤醒并设置为单次转换模式。转换与读取BQ41Z90等待TMP468完成所有启用通道的温度转换。根据数据手册一次完整的转换所有内部和外部通道大约需要142ms。转换完成后BQ41Z90通过I2C读取整个TMP468的温度数据寄存器阵列。关断数据读取完毕后BQ41Z90立即发送命令将TMP468再次置于SHUTDOWN模式以最小化静态电流消耗。同步休眠当BQ41Z90自身进入SHUTDOWN模式时TMP468也会保持在SHUTDOWN模式确保整个系统处于最低功耗状态。这种间歇性工作的方式使得增加一个高精度、多通道的温度传感器对系统待机功耗的影响微乎其微。实测中在典型的1秒采样周期下TMP468带来的平均电流增加可以控制在10微安以下这对于很多物联网或便携式设备是完全可接受的。2.4 透传访问与高级调试BQ41Z90提供了几个特殊的ManufacturerAccess()命令允许主机直接“穿透”BQ41Z90去读写TMP468的寄存器。这在高级调试和自定义配置时非常有用。读取命令0x0081 TMPRead1(),0x0082 TMPRead2(),0x0083 TMPRead3(),0x0084 TMPRead4()。这些命令会返回TMP468完整的寄存器阵列数据。你可以借此验证TMP468的配置是否正确或者读取BQ41Z90正常流程未使用的数据如TMP468的本地温度。写入命令0x008B TMPWrite()。这是一个字word写入命令。第一个字节是你要写入的TMP468寄存器地址十六进制第二个字节是要写入的数据十六进制。这里有个重要细节即使你尝试写入的TMP468寄存器是只读或已锁定的这个命令的负载payload仍然会被发送到TMP468只是不会产生实际效果。这在编写配置脚本时需要注意避免产生不必要的通信。注意事项使用透传命令时你实际上是在直接操作TMP468。务必确保你了解TMP468的寄存器映射和功能错误的写入可能会影响其正常工作甚至导致BQ41Z90无法正确读取温度数据。建议在开发阶段先通过读取命令确认寄存器状态再进行写入操作。3. BQ41Z90的安全认证机制深度解析如果说温度监控是BMS的“感官系统”那么安全机制就是其“免疫系统”。BQ41Z90提供了SEALED密封、UNSEALED解封和FULL ACCESS完全访三级操作权限并支持SHA-1、SHA-2和ECC椭圆曲线密码学三种认证算法构成了一个层次分明、坚固可靠的安全体系。3.1 三级安全模式权限的精确控制理解这三种模式是进行任何安全配置的基础SEALED密封模式这是产品出厂后的默认安全状态。在此模式下设备仅开放标准的SBS智能电池系统命令和部分数据闪存Data Flash的读取需额外使能DF Read Only模式。绝大多数用于配置、校准和高级诊断的ManufacturerAccess()命令以及数据闪存的写入权限都被禁止。一旦进入SEALED模式设备将无法永久性地回到UNSEALED或FULL ACCESS模式。这是为了防止终端用户或非授权方篡改关键参数如电池容量、保护阈值等。UNSEALED解封模式这是开发、测试和生产校准阶段的主要模式。在此模式下数据闪存DF变为可读可写所有SBS数据也可读取。要进入此模式需要向ManufacturerAccess()依次发送两个16位的密钥字Unseal Key且必须在4秒内完成。默认的Unseal Key是0x0414和0x3672。发送后安全状态标志[SEC1][SEC0]会被清除。FULL ACCESS完全访问模式这是最高权限模式TI出厂时设备即处于此模式。在此模式下可以访问所有命令包括跳转到引导ROMBoot ROM的命令这对于固件更新至关重要。进入此模式同样需要一个两字的Full Access Key序列。这个密钥可以在FULL ACCESS模式下通过SecurityKey()命令进行读取和更改。一个至关重要的安全特性如果设备已被密封SEALED那么无论你在上电前是否将其解封UNSEALED每次上电复位POR后它都会自动回到SEALED状态。这意味着即使你在测试中解封了设备一旦断电重启它又回到了受保护的状态。此外如果你将一个已密封设备的固件SREC文件提取出来并烧录到另一个BQ41Z90中另一个设备上电后也会处于SEALED状态。唯一能永久恢复UNSEALED状态的方法是重新烧录一个“未密封”的SREC文件。这个机制有效防止了通过复制固件来绕过安全限制的行为。3.2 SHA-1认证基于密钥的“数字指纹”验证SHA-1认证是BQ41Z90支持的一种基于哈希的消息认证码HMAC机制。它的核心思想是主机如系统主板和从机BQ41Z90共享一个128位的秘密认证密钥Authentication Key,KD。通过一个公开的随机消息M和这个秘密密钥双方可以独立计算出一个“数字指纹”HMAC值。如果计算出的指纹一致则证明从机拥有正确的密钥从而完成身份认证。其工作流程如下生成随机消息主机使用一个符合FIPS PUB 140-2标准的随机数生成器产生一个160位的随机消息M。这一步确保了每次认证的挑战都是不同的防止重放攻击。主机计算HMAC a. 主机将128位的密钥KD和160位的消息M拼接并按照SHA-1的规范进行填充形成第一个512位的输入块B1。 b. 用SHA-1算法对B1进行哈希得到中间结果HMAC1。 c. 再次将密钥KD和HMAC1拼接并填充形成第二个输入块B2。 d. 对B2进行SHA-1哈希得到最终的160位HMAC值HMAC2。设备端验证 a. 主机先将随机消息M写入BQ41Z90的Authenticate()寄存器。 b. 等待至少250ms这是给BQ41Z90计算的时间。 c. 主机从Authenticate()寄存器中读取BQ41Z90计算出的HMAC值HMAC3。比对主机比较自己计算的HMAC2和设备返回的HMAC3。如果两者匹配则认证成功证明BQ41Z90拥有正确的密钥KD。这个过程确保了即使通信被窃听攻击者由于不知道秘密密钥KD也无法伪造出正确的HMAC响应。SHA-2SHA-256认证的原理类似但使用了更长的256位密钥和哈希输出安全性更高。3.3 数据闪存DF只读访问模式这是一个非常实用的功能尤其对于在SEALED模式下仍需读取某些校准或日志数据的应用场景。在SEALED模式下数据闪存地址0x4000-0x5FFF默认是不可读的。但可以通过一个两字的MAC命令序列临时开启一个“只读窗口”。使能首先需要确保Settings:Auth Config[DF_READ_EN]位被设置为1这通常在UNSEALED或FULL ACCESS模式下配置并写入数据闪存。激活在SEALED模式下向ManufacturerAccess()发送一个特定的两字密钥序列可通过0x0035 Security Keys命令编程设置。这两个字必须在4秒内连续发送。访问与超时密钥验证通过后主机便可以在DF Read Only Timeout规定的时间内读取数据闪存的内容。每次成功的读取操作都会重置这个超时计时器从而延长只读访问的窗口期。这个机制在产线测试或现场诊断时非常有用。你可以在SEALED的产品上通过授权工具发送密钥临时读取电池的循环次数、健康状态SOH或历史错误日志而无需完全解封设备保持了系统的安全性。4. 生产制造与校准流程精要BQ41Z90提供了丰富的制造测试和校准功能旨在简化生产流程并确保每个出厂的电池包都具有一致的精度。4.1 制造测试模式通过ManufacturingStatus()寄存器中的一系列控制位可以在生产测试中单独启用或禁用特定功能避免功能间相互干扰。例如[CAL_EN]: 启用/禁用校准模式。[LT_TEST],[DSG_TEST],[CHG_TEST],[PCHG_TEST]: 分别用于测试 Lifetime Data、放电FET、充电FET和预充电FET。[LED_EN],[FUSE_EN],[BBR_EN],[PF_EN],[LF_EN],[FET_EN],[GAUGE_EN]: 控制LED、保险丝、黑盒记录器、永久失效、生命周期数据、FET和电量计功能的使能。这里有一个关键区别前一组[CAL_EN],[LT_TEST]等的配置仅存储在RAM中设备复位或密封后即被清除。而后一组[LED_EN],[FUSE_EN]等的配置会更新到数据闪存并与Mfg Status Init区域同步。这意味着如果你修改了Mfg Status Init中的值设备需要复位或执行密封命令后新的设置才会从数据闪存加载到ManufacturingStatus()寄存器中生效。4.2 电压、电流与温度校准详解校准是保证BQ41Z90测量精度的核心步骤。TI提供了详细的应用笔记如SLUA734这里我们深入其数据闪存中的校准参数。4.2.1 电压校准电压校准主要涉及增益Gain参数Cell Gain: 用于校准电芯电压VC[n] – VC[n-1]的测量。这是一个有符号整数I2默认值12101是出厂校准值。如果将其清零设备将使用内部工厂校准默认值。PACK Gain: 用于校准PACK电压PACK引脚对VSS的测量无符号整数U2。BAT Gain: 用于校准BAT电压BAT引脚对VSS的测量无符号整数U2。校准流程通常是在已知的精确电压源下读取ManufacturerData()中的原始ADC值然后通过计算和写入这些增益值使BQ41Z90报告的电压值与实际电压源一致。4.2.2 电流校准电流校准更为复杂涉及多个参数CC Gain(Coulomb Counter Gain): 仑计数器增益浮点数F4。它直接影响电流积分的准确性。Capacity Gain: 容量增益浮点数F4。用于将库仑计数转换为标准容量单位如mAh。CC Offset: 电流偏移量有符号整数I2。这是在库仑计数器输入端内部路时采集的样本总和用于修正Current()测量的零点。Board Offset: 板级偏移有符号整数I2。这是当检测电阻Sense Resistor上电流为零时库仑计数的总和。用于修正PCB布局引入的微小偏移。CC Auto Offset: 自动校准偏移有符号整数I2。这是通过CC Auto Config功能自动测量的偏移量专门用于电芯电流的测量与CC Offset用途不同。CC Auto Config寄存器AUTO_CAL_EN位允许固件在设备进入SLEEP模式时自动执行CC偏移校准并将结果保存到CC Auto Offset。这可以补偿随时间或温度变化的偏移漂移但最小校准间隔被设置为10小时以防止过度写入导致数据闪存磨损。4.2.3 温度校准与模型温度校准分为直接偏移校准和多项式模型校准。直接偏移校准对于内部温度传感器和外部热敏电阻TS1-TS4可以通过Internal/External X Temp Offset参数直接施加一个偏移量单位0.1°C。这是最简单的线性补偿。多项式模型校准对于使用NTC热敏电阻测量电芯或FET温度的场景BQ41Z90使用两套多项式a和b将ADC读取的电阻值转换为温度值。默认系数是针对25°C时阻值为10kΩ的热敏电阻优化的。Coefficient a1-a5, b1-b4: 这些是多项式计算的系数。Rc0: 热敏电阻在25°C时的标称电阻值用于多项式校准点。Adc0: 在25°C时对应的ADC读数用于平移多项式校准点。Rpad: 串联的垫片电阻Pad Resistance阻值。如果设为0则使用内部工厂校准默认值。Rint: 内部上拉电阻阻值。如果设为0则使用内部工厂校准默认值。校准这些参数需要你在多个已知温度点例如0°C, 25°C, 50°C下记录BQ41Z90读取到的原始ADC值或计算出的电阻值然后通过计算或TI提供的工具来拟合出最优的系数和偏移值。4.2.4 电流死区Deadband这是两个常被忽略但很重要的参数Deadband: 基于Pack的电流死区单位mA。当测量的Pack电流绝对值小于此值时Current()报告为0mA。这有助于消除零漂带来的微小波动。Coulomb Counter Deadband: 库仑计数器死区单位是116 nV。当库仑计数器输入端的电压差小于此值时报告电荷变化为0。TI特别注明此设置不应修改因为它与内部算法紧密相关。4.3 校准模式实操要进行校准你需要将ManufacturingStatus()[CAL_EN]位置1通过ManufacturerAccess() 0x002D命令。向ManufacturerAccess()写入0xF081或0xF082。0xF081: 在ManufacturerData()上输出电压、电流和温度的原始ADC数据。0xF082: 同上但同时会在库仑计数器输入端SRP, SRN内部短路这专门用于测量CC Offset。此时ManufacturerData()会以特定格式如ZZYYaaAAbbBB...每250ms刷新一次原始数据。你可以连接精密源表施加标准的电压、电流和温度记录下这些原始值。根据记录的值与标准值的差异计算并写入相应的校准参数到数据闪存。校准完成后务必通过ManufacturerAccess() 0x002D命令将[CAL_EN]位清零。否则设备会一直输出原始数据无法正常进行电量计算。避坑指南校准环境务必稳定。电压源和电流源的精度和稳定性直接决定校准效果。温度校准需要一个温箱并且要确保热敏电阻与温箱内的测温探头充分热耦合避免温差。在校准电流时特别是小电流要注意PCB布线带来的热电动势和噪声干扰使用0xF082模式内部短路来获取CC Offset是减少误差的关键一步。5. 生命周期数据收集电池的“黑匣子”Lifetime Data Collection是BQ41Z90一个极其强大的诊断和数据分析功能。它就像一个持续运行的飞行数据记录仪默默地记录着电池在整个生命周期的关键运行参数和事件。5.1 数据收集机制与条件生命周期数据收集功能默认是关闭的需要通过设置ManufacturingStatus()[LF_EN] 1来启用。数据首先被收集在RAM中为了减少对数据闪存有写入次数限制的磨损只在以下条件下才会将RAM中的数据写入Flush到数据闪存每10小时如果RAM内容与闪存不同。进入永久失效Permanent Fail状态前在数据闪存更新被禁用之前。计划性关机Scheduled Shutdown前。低电压关机前且电压高于有效更新电压Valid Update Voltage。数据收集在以下情况会停止进入永久失效状态后。通过设置ManufacturingStatus()[LF_EN] 0手动禁用。在设备未密封UNSEALED时可以使用LifetimeDataReset()重置数据用LifetimeDataFlush()手动将RAM数据写入闪存或用LifetimeDataSpeedupMode()加速数据递增速率用于测试。5.2 收集的数据类型收集的数据包罗万象是分析电池退化、故障原因和用户使用习惯的宝库运行时间总固件运行时间。电压每个电芯的最大/最小电压、任何时刻的最大电芯间压差不均衡度。电流最大充电/放电电流、最大平均放电电流、最大平均放电功率。安全事件触发SafetyStatus()的安全事件数量、最后一次安全事件发生时的循环计数。充电事件有效充电终止次数即[VCT]置位的次数、最后一次充电终止时的循环计数。计量事件QMax最大容量更新次数、最后一次QMax更新时的循环计数、RA阻抗跟踪更新和禁用次数及对应循环计数。电源事件复位、部分复位和看门狗复位的次数、关机次数。电芯平衡每个电芯的平衡时间以秒为单位可记录超过100年。温度在充电、放电和静置RELAX模式下记录最大/最小电芯温度。电芯间最大温差在所有用于报告电芯温度的热敏电阻中。最大/最小内部温度传感器温度。最大FET温度。所有热敏电阻TS1-TS4的最大/最小温度。所有TMP468传感器TMP468_1–TMP468_8的最大/最小温度。健康状态SOH最小的SOH FCC满充容量值。时间分布记录设备在不同相对电量RSOC-温度Temperature区间内所停留的时间。这通过8个可编程的RSOC范围和8个可编程的温度范围形成了64个8x8矩阵单元可以绘制出电池使用情况的“热力图”对于分析电池在何种工况下老化最快至关重要。这些数据可以通过LifetimeDataBlock1到LifetimeDataBlock18等命令块读取出来用于后续的上位机分析和可视化。6. SMBus通信与命令详解BQ41Z90通过SMBus系统管理总线与主机通信。SMBus是基于I2C的变种在电池管理领域是事实上的标准。6.1 设备地址配置BQ41Z90的默认SMBus地址是0x167位地址。这个地址是可以更改的但需要成对配置两个数据闪存参数Address: 你想要设置的目标地址。Address Check: 该地址的二进制补码。例如如果你想将地址改为0x0B那么你需要在Address中写入0x0B。计算0x0B的二进制补码即0xFF - 0x0B 0x01 0xF5在Address Check中写入0xF5。设备在上电复位POR时会检查这两个值。如果它们无效例如不满足互补关系或者编程的地址是0x00或0xFF设备将恢复使用默认地址0x16。6.2 ManufacturerAccess() 命令的两种使用方式BQ41Z90为了兼容其前产品bq30zxx系列和新的BQ40Zxy系列提供了两种发送ManufacturerAccess()命令的方式方式一通过ManufacturerAccess()(0x00) 和ManufacturerData()(0x23)这是传统方式用于向后兼容。发送命令向地址0x00(ManufacturerAccess()) 执行一个SMBus字写入Write Word操作。注意数据必须以大端序Big-Endian发送。例如发送命令Gauging()(0x0021)你需要发送数据0x00, 0x21。读取结果从地址0x23(ManufacturerData()) 执行一个SMBus块读取Block Read操作。返回的数据是小端序Little-Endian。例如读取Chemical ID()(0x0006) 的结果可能是0x00, 0x01这表示化学ID是0x0100即十进制的256。方式二通过ManufacturerBlockAccess()(0x44)这是更新的、更推荐的方式使用统一的块读写协议。发送命令向地址0x44(ManufacturerBlockAccess()) 执行一个SMBus块写入Block Write操作。数据必须以小端序发送。例如发送Gauging()(0x0021)你需要发送数据0x21, 0x00。读取结果从地址0x44(ManufacturerBlockAccess()) 执行一个SMBus块读取Block Read操作。返回的数据包含了命令本身和结果都是小端序。例如读取Chemical ID()返回可能是0x06, 0x00, 0x00, 0x01。前两个字节0x06, 0x00是命令后两个字节0x00, 0x01是结果化学ID0x0100。关键点这两种方式是互通的。你可以用方式一发送命令然后用方式二读取结果反之亦然。这为不同平台的驱动开发提供了灵活性。在开发调试工具或编写通信库时我强烈建议统一使用方式二ManufacturerBlockAccess()因为它更现代且数据格式统一为小端序不易出错。6.3 关键命令速查与解读ManufacturerAccess()命令表非常庞大这里挑出几个在集成、调试和安全中至关重要的命令进行解读0x0006 Chemical ID: 读取电池的化学标识符。这是阻抗跟踪算法匹配电池模型的关键务必与电芯供应商提供的ChemID匹配。0x0021 Gauging: 使能或禁用动态阻抗跟踪DZT等计量功能。通常在生产最后一步使能。0x002D CalibrationMode: 控制校准模式的开关。切记用完后关闭。0x0030 SealDevice: 密封设备命令。这是产品出厂前的“最后一步”执行后设备进入SEALED模式。0x0035 SecurityKeys: 读写安全密钥Unseal/Full Access Key的命令。仅在FULL ACCESS模式下可用。0x0041 DeviceReset: 复位设备。在更新大量数据闪存参数后有时需要复位以使新配置生效。0x0050-0x0057(SafetyAlert, SafetyStatus, PFAlert, PFStatus, OperationStatus, ChargingStatus, GaugingStatus, ManufacturingStatus): 这些是状态寄存器组。在调试时首先读取这些寄存器可以快速了解设备当前的安全状态、运行状态和故障标志是诊断问题的第一步。0x0081-0x008B(TMPRead1-7, TMPLoadConfig, TMPWriteReg): 如前所述用于TMP468传感器的透传访问。理解并熟练运用这些命令是高效开发、调试和生产BQ41Z90电池管理系统的基石。建议在开发初期就建立一套稳定的通信测试脚本覆盖从基本状态读取、参数配置到安全认证和传感器访问的全流程。