NT3H2211提供2048字节EEPROM存储空间,如何合理分区以同时满足新国标合规要求、实时数据更新和客户定制扩展需求,是软件设计的核心问题。本文基于实佳电子的量产实践,给出一套经过验证的四区分配方案和异常记录数据格式规范。
分区 | 地址范围 | 大小 | 功能 | 读写属性 |
基本信息区 | 0x0000-0x002F | 48字节 | 产品身份信息,出厂写入 | 只读(锁定后) |
实时数据区 | 0x0030-0x00EF | 192字节 | 当前电池状态,BMS定时更新 | I2C可写,NFC可读 |
异常记录区 | 0x00F0-0x01EF | 256字节 | 16条×16字节环形缓冲区 | I2C追加写,NFC可读 |
配置保留区 | 0x01F0-0x01FF | 16字节 | NFC密码、访问权限、配置寄存器 | 受密码保护 |
扩展数据区 | 0x0200-0x07FF | 1536字节 | 客户自定义扩展 | 按客户需求配置 |
该分区方案的设计原则:基本信息只读防篡改,实时数据高频更新,异常记录环形覆盖,配置区受密码保护,扩展区预留灵活。2048字节在满足新国标全部要求的同时,保留1536字节供客户自定义使用。
基本信息区在出厂时一次性写入,之后通过NT3H2211的AUTH0寄存器和NFC密码锁定为只读,防止篡改。确保每台设备的身份信息唯一可追溯。
偏移 | 长度 | 字段 | 格式 | 示例 |
0x00 | 8字节 | 产品序列号SN | ASCII | SJ2026090001 |
0x08 | 16字节 | 产品型号 | ASCII | POWERBANK-20000 |
0x18 | 4字节 | 电池容量 | uint32(mAh) | 20000 |
0x1C | 4字节 | 厂商代码 | ASCII | SJEA |
0x20 | 4字节 | 生产日期 | BCD(YYYYMMDD) | 20260915 |
0x24 | 2字节 | 固件版本 | uint16(主.次) | 0x0102(V1.2) |
0x26 | 2字节 | 硬件版本 | uint16 | 0x0100 |
0x28 | 8字节 | 预留 | - | 全0xFF |
实时数据区由BMS定时更新(建议1-5秒周期),手机NFC读取时获取最新电池状态。前20字节为核心数据,剩余172字节预留扩展。
偏移 | 长度 | 字段 | 格式 | 说明 |
0x30 | 2字节 | 当前电压 | uint16(mV) | 电芯电压,范围2500-4500 |
0x32 | 2字节 | 当前电流 | int16(mA) | 充电为正,放电为负 |
0x34 | 2字节 | 当前温度 | int16(0.1℃) | NTC极耳测温,范围-400~1250 |
0x36 | 1字节 | SOC剩余电量 | uint8(%) | 0-100 |
0x37 | 2字节 | 循环次数 | uint16 | 充放电完整循环计数 |
0x39 | 1字节 | 健康度SOH | uint8(%) | 基于循环和温度历史估算 |
0x3A | 1字节 | 充电状态 | uint8 | 0=空闲,1=充电,2=放电,3=充满 |
0x3B | 1字节 | 保护状态 | uint8位域 | bit0=过温,bit1=过充,bit2=过放,bit3=短路 |
0x3C | 8字节 | 最近异常时间 | uint64(Unix秒) | 最近一次异常发生的时间戳 |
0x44 | 1字节 | 最近异常类型 | uint8 | 0=无,1=过温,2=过充,3=过放,4=短路,5=鼓包 |
0x45 | 1字节 | FSR压力值 | uint8(0.01N) | 鼓包传感器读数,无FSR时为0xFF |
0x46 | 170字节 | 预留扩展 | - | 可增加更多实时参数 |
异常记录区是新国标第6.8b条的核心存储区域。采用16字节定长记录、16条环形缓冲区设计,最新记录自动覆盖最旧记录。
偏移 | 长度 | 字段 | 格式 | 说明 |
0 | 1字节 | 异常类型 | uint8 | 01=过温,02=过充,03=过放,04=短路,05=鼓包,06=低温 |
1 | 1字节 | 事件状态 | uint8 | 01=触发,02=恢复,03=保护锁死 |
2 | 2字节 | 触发数值 | uint16 | 温度×10或电压×100或压力×100,小端 |
4 | 8字节 | 时间戳 | uint64 | Unix时间戳(秒),小端模式 |
12 | 1字节 | SOC | uint8 | 异常触发时剩余电量百分比 |
13 | 2字节 | 循环次数 | uint16 | 异常触发时已循环次数,小端 |
15 | 1字节 | CRC8 | uint8 | 前15字节的CRC8校验(多项式0x07) |
256字节分为16个槽位(slot 0-15),每个槽位16字节。管理算法如下:
1. 维护一个写指针(write_ptr),初始值0,存储在BMS RAM中(不需存入EEPROM)。
2. 异常发生时,将16字节记录写入write_ptr指向的槽位。
3. 写入完成后write_ptr递增,达到16时归零(覆盖最旧记录)。
4. 手机读取时,从write_ptr的下一个槽位开始读取(即最旧记录),顺序读取16个槽位,跳过全0xFF的空槽位。
5. CRC8校验失败的记录视为无效,跳过不展示。
类型码 | 异常名称 | 触发条件示例 | 恢复条件 |
0x01 | 过温 | 电芯温度≥60℃ | 温度降至50℃以下 |
0x02 | 过充 | 电芯电压≥4.35V | 电压降至4.20V以下 |
0x03 | 过放 | 电芯电压≤2.50V | 充电至3.0V以上 |
0x04 | 短路 | 放电电流≥20A(持续10ms) | 移除短路,手动复位 |
0x05 | 鼓包 | FSR压力≥0.5N(膨胀约0.5mm) | 不可恢复,建议更换 |
0x06 | 低温 | 电芯温度≤-20℃ | 温度升至-10℃以上 |
配置保留区用于存储NFC访问密码和权限配置,受NT3H2211硬件密码保护,未授权的NFC读取将被拒绝。
• NFC密码(PWD):4字节,设置后NFC读取需先通过密码认证。
• 密码确认(PACK):2字节,密码认证的应答确认。
• 认证起始地址(AUTH0):1字节,从该地址开始的存储区需要密码认证才能访问。
• 访问权限(AUTHLIM):1字节,配置密码尝试次数限制。
• NDEF配置:NDEF消息长度、类型标识,确保手机触碰后正确解析。
建议:基本信息区和异常记录区设为公开可读(无需密码),配置区和扩展区的敏感数据设为密码保护。
扩展数据区供客户自定义使用,典型应用包括:
• FSR鼓包压力历史数据:记录压力变化趋势,用于鼓包预测算法。
• 更多异常记录:将异常记录从16条扩展到32条或更多。
• 厂商自定义参数:电芯型号、生产批次、测试数据、校准系数。
• 整机测试数据:出厂测试的电压、内阻、容量等测试记录。
• 用户配置数据:用户通过APP/NFC设置的参数(如快充模式、温度告警阈值)。
6. CRC8校验:每条异常记录含CRC8,读取时校验,损坏记录自动跳过。
7. 写保护:基本信息区出厂锁定,防止篡改。
8. 会话仲裁:I2C和RF访问通过SESSION_REQ寄存器仲裁,避免同时写入。
9. 写入验证:BMS写入后回读确认,确保数据正确写入。
10. 环形覆盖:异常记录采用环形缓冲区,不会因存储满而停止记录。
Q1:为什么异常记录用16字节定长而不是变长?
A:定长记录有三个优势:①环形缓冲区管理简单,写指针按固定步长递增,不需要解析变长字段;②手机端解析简单,按16字节边界直接读取,不需要分隔符;③存储效率高,无额外长度字段开销。16字节可容纳类型、状态、数值、时间戳、SOC、循环次数和CRC,信息完整。
Q2:时间戳用Unix格式,BMS没有RTC怎么办?
A:如果BMS没有RTC,可采用相对时间戳:从产品首次上电开始计时(秒计数),手机读取时结合首次使用时间(可通过NDEF配置或服务器获取)换算为绝对时间。另一种方案是每次手机NFC触碰时,由手机将当前时间写入标签的时间同步区,BMS以此为基准计时。实佳电子提供相对时间戳的参考实现。
Q3:16条异常记录够吗?
A:对大多数产品足够。正常使用的充电宝一年异常次数通常不超过5次,16条可覆盖3年以上的异常历史。如果产品应用环境恶劣(如共享充电宝),可利用扩展区将记录扩展到32条或更多。环形缓冲区设计确保始终保留最新的16条,不会丢失近期异常。
Q4:EEPROM擦写寿命10万次,实时数据1-5秒写一次会不会很快耗尽?
A:不会。两个原因:①实时数据区不需要每次都写EEPROM,可利用NT3H2211的64字节SRAM作为缓冲区,仅在数据变化超过阈值(如温度变化≥1℃)时才写入EEPROM;②即使每5秒写一次,10万次寿命可支持约138小时(5.8天)连续写入,而实际使用中充电宝大部分时间处于待机状态(不写EEPROM),实际寿命可达数年。建议采用变化触发写入策略,进一步延长寿命。