解读 152 · I2C 入门
解读对象:概念课 · 以
microduck-replica/docs/imu_to_dxl-设计包/原理图连接表.md为教材(SCL/SDA、上拉、地址)
需要的前置:解读 150(上拉电阻)、解读 44(IMU 是哪颗)、解读 105(读回来的数据怎么解)
主控要跟 IMU 说两句话,再专门铺一条 UART 总线就太奢侈了。I2C 就是那根"便宜的两芯电话线":两根线挂一串设备,靠门牌号喊人。
1. 两根线,一个节拍一个数据
I2C 只有两根线:SCL 是节拍线(谁打拍子谁主导,像音乐指挥),SDA 是数据线(数据跟着节拍一位一位走)。所有设备并联在这两根线上:设计包连接表里,SCL 一行写着 U1.PB6、U2.SCL、R1.2,SDA 一行写着 U1.PB7、U2.SDA、R2.2——主控 STM32 的两个脚,IMU 的两个脚,共用两条线。本项目跑 400kHz(设计规格 §四:PB6/PB7,I2C1 400kHz),即指挥每秒打 40 万拍,一拍送一位。
与 UART 一对一专线不同(见解读 151),I2C 是"公共广播"——好处是省线、好扩展,代价是要有办法点名,这就轮到地址。
2. 地址 0x6A:IMU 的门牌号
每台 I2C 设备有一个 7 位地址,主机发起通话时先喊门牌,只有对号的从机应答。本板的 IMU 是 LSM6DSV16X,地址 0x6A——这个号不是随机的:连接表 U2 引脚表写明 SA0 → GND(I2C 地址 = 0x6A)。SA0 是地址选择脚,接地取一个号、接高取另一个(另一号是多少,以 ST 数据手册为准,待验证)——厂家就是这样让同款芯片在同一条总线上共存的。
主控想读姿态时,流程是:喊 0x6A → 说要读哪个寄存器 → IMU 回数据。固件骨架阶段先用轮询(连接表 IMU_INT1 一行"数据就绪中断(固件骨架先用轮询,预留)"),等以后让 IMU 用 INT1 脚主动举手"有新数据了"。
3. 两颗电阻和一根不能悬空的脚
I2C 有个新手必踩的坑,恰好把前两篇的概念串起来了:
- SCL/SDA 必须上拉:I2C 的线平时悬在半空,约定是"谁说话谁拉低,没人说话回弹到高"——回弹靠的就是连接表里那两颗 R1/R2,4.7kΩ,接到 +3V3(BOM 里对应"I2C 上拉 4.7kΩ ×2")。没有它们,线永远读不出"高",总线根本起不来。"回弹到高"为什么要靠电阻、选多大,见解读 150。
- CS 脚必须拉 3V3,勿悬空:LSM6DSV16X 是 I2C/SPI 两用芯片,靠 CS 脚电平选模式。连接表自查清单第二条原话:"U2.CS 已拉 +3V3(悬空 = 进 SPI 模式,I2C 读不到,最常见翻车点)"。一颗芯片,一根线接错,现象不是冒烟,而是"怎么都读不到"——这是电气错误里最安静的一种。
4. 动手验证
板子上电后量 SCL/SDA:万用表直流档两根线都应读在 3.3V 附近(空闲态被上拉拉高),任何一颗掉到 0V 都说明总线被谁摁住没松手。把板子接到 Radxa 的 40-pin I²C 座(教程:"IMU 就接这里")扫总线,应看到 0x6A 应答;读不到时,第一件事是查 CS 是否真的拉到了 3V3,第二件事才是怀疑芯片。
你带走的收获
- I2C=两根线的公共电话网:SCL 打拍子、SDA 走数据,本项目 400kHz。
- 设备靠 7 位地址点名:SA0 接地,LSM6DSV16X 就是 0x6A。
- 总线空闲靠 4.7kΩ 上拉托高,谁说话谁拉低——上拉是 I2C 的地基。
- 两用芯片的模式脚(CS)悬空=安静地失联:读不到先查电平,再怀疑器件。