liquidproton/3M-TR-801N-Battery-Emulator
GitHub: liquidproton/3M-TR-801N-Battery-Emulator
逆向工程并模拟 3M TR-830 电池组的 SMBus/I2C 协议,使用 Arduino Nano 和通用电池替代昂贵的专有电池来驱动 PAPR 设备。
Stars: 1 | Forks: 1
# 3M TR-800 PAPR 电池模拟器
逆向工程并模拟 3M TR-830 电池组的 Smart Battery System (SBS) SMBus/I2C 协议。目标是使用自定义电源方案(例如通过降压转换器使用 DeWalt 20V 电池)来安全地运行 TR-800 PAPR 鼓风机组,以替代昂贵的专有电池组。该电池使用了 TI BQ20Z655 芯片。
## 硬件配置
该设置使用标准的 5V Arduino Nano 来模拟电池的逻辑层,并结合了一个大功率降压级。Printables 链接:
### 组件构成
* **电源:** DeWalt 20V Max 电池
* **适配器:** goBILDA 20V DeWalt 电池接收器
* **稳压器:** 20A DC-DC 降压转换器(降至 **14.5V**)
* **微控制器:** Arduino Nano(5V 逻辑电平)
* **上拉电阻:** $2 \times 2.2\text{ k}\Omega$ 电阻,上拉至 Nano 的 5V 供电轨
### 连接器引脚定义
| 鼓风机引脚 | 信号 | Arduino 连接 | 备注 |
| :--- | :--- | :--- | :--- |
| **Pin 1** | VCC | 降压转换器输出 (+) | 提供主工作电源(**14.5V DC**) |
| **Pin 2** | SCL | 模拟引脚 **A5** | 硬件 I2C 时钟线;需要强上拉至 5V |
| **Pin 3** | SDA | 模拟引脚 **A4** | 硬件 I2C 数据线;需要强上拉至 5V |
| **Pin 4** | GND | 开发板 **GND** | 主参考地(星型接地点) |
## 当前状态:10 秒后发出蜂鸣声
该模拟器目前无法正常工作。我已经能够通过一些验证检查。似乎位于 `0x60` 的辅助芯片也参与了其中,并阻止了旁路的正常工作。
## 协议解析与待解决问题
### 1. 缺失的地址 `0x60`
来自原装 TR-830 电池组的逻辑跟踪记录显示,鼓风机会主动监控*两个* I2C 地址[cite: 1]:
* **`0x0B`**:主电量计管理器(处理标准电池指标)[cite: 1]。
* **`0x60`**:包含安全映射或制造跟踪密钥的辅助芯片[cite: 1]。
恰好在 17 秒标记处,鼓风机会向地址 `0x60` 发送一串多字节配置突发数据(`C2 B4 00 5C C2 2D`)[cite: 1]。由于我们目前的代码仅在 `0x0B` 处初始化为 slave,Nano 会忽略该请求,从而导致硬件 `NACK`[cite: 1, 2]。鼓风机意识到缺少了一个核心组件,随后触发警报。
### 2. 寄存器值校准
原装跟踪捕获记录显示,标准的 Smart Battery 变量应采用小端字节顺序。如果数值没有严格对齐到原装的工作极限,当前的布局就会失效。
## 待办事项列表 / 固件路线图
* [ ] **启用多地址 Slave 模式:** 在 `setup()` 中使用 Two-Wire Address Mask Register (`TWAMR`) 修改 ATmega328P 的硬件寄存器。这会强制单个 Nano 在相同的物理线路上同时侦听 `0x0B` 和 `0x60` 并发出硬件 `ACK` 响应。
* [ ] **处理地址 `0x60` 遥测数据:** 更新中断处理程序(`receiveEvent` / `requestEvent`),通过解析 `TWSR` 状态标志来动态路由数据。当地址 `0x60` 被查询寄存器 `0x01` 时,代码必须返回预期的 5 字节数组:`[0x61, 0x0B, 0x70, 0x16, 0xF0]`[cite: 1]。
* [ ] **验证 `0x2F` 握手逻辑:** 清理验证路由。确保如果鼓风机向寄存器 `0x2F` 执行多字节写入质询[cite: 1],代码会在提供 `authSignature` 签名响应之前[cite: 1],将其按顺序存储在易失性数组缓冲区中。
## 交流
SimpleX:
标签:3D打印, Arduino, UML, 云资产清单, 协议分析, 嵌入式开发, 权限提升, 物联网, 硬件, 逆向工程