SH367306 I2C 读写时序
SH367306 是两轮车 BMS 常用的 AFE 芯片,通过 I2C 与 MCU 通信。它的读写时序有一个反直觉的地方------读比写多了一步。
写操作
START → SlaveAddr(W) → RegAddr → Data → STOP
全程 Master 说、Slave 听,方向一致。
读操作
START → SlaveAddr(W) → RegAddr → RESTART → SlaveAddr(R) → Data → STOP
比写多了一个 RESTART + SlaveAddr®。
为什么读不能像写一样直接 START + SlaveAddr(W) + RegAddr + Data ?
I2C 总线上谁控制 SDA(数据线)由地址字节的 R/W 位决定:
| 地址 | R/W | 方向 |
|---|---|---|
| SlaveAddr(W) | 0 | Master→Slave |
| SlaveAddr® | 1 | Slave→Master |
读操作的前半段是"告诉从机读哪个寄存器"------这是 Master 说,所以用 SlaveAddr(W)。但后半段是"从机把数据返回来"------方向反了,Slave 必须知道现在轮到它控制 SDA。
如果不发 RESTART + SlaveAddr®,Slave 全程认为自己在"听",永远不会往外发数据。RESTART 的作用就是在不释放总线(不发 STOP)的前提下反转通信方向------告诉 Slave:"刚才那个地址是我要读的,现在轮到你说了。"
一图对比
写: START ── W ── RegAddr ── Data ── STOP
└──── Master→Slave ────┘
读: START ── W ── RegAddr ── RESTART ── R ── Data ── STOP
└─ Master→Slave ─┘ └─ Slave→Master ─┘
方向反转点 ↑