两轮BMS AFE SH367306 I2C 读写时序

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 ─┘
                        方向反转点 ↑
相关推荐
zlinear数据采集卡几秒前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
GeekZHR1 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
.道阻且长.2 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)2 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年2 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.2 小时前
整数等差数列超图中的三个非微扰现象
算法
wabs6662 小时前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串
土司大王2 小时前
LeetCode hot100——移动零
java·算法·leetcode
Tyler_TXZ4 小时前
C++C语言之——树
c语言·c++·算法·
hansang_IR4 小时前
【记录】「COCI 2024/2025」四道模拟赛/8.13
c++·算法