- Published on
I2C - SDA <> SCL
I2C 是什么
Inter-Integrated Circuit (I2C) 是一种 短距离、低速、两线式 的通信协议,用于让同一个电路板上的多个芯片之间交换数据。
干的事:让一个主设备(如 Jetson)和多个从设备(如传感器、显示屏、IO 扩展芯片)通过 两根线 连接并通信。
SDA 和 SCL 各负责什么
| 引脚 | 全称 | 作用 | 比喻 |
|---|---|---|---|
| SDA | Serial Data Line | 传输数据(0 和 1 的序列) | 快递员(运送货物) |
| SCL | Serial Clock Line | 同步时钟(决定什么时候读数据) | 发令员(规定节奏) |
工作过程(简短版)
- 主设备(Jetson)通过 SCL 发出时钟信号
- 在每一个时钟脉冲内,SDA 线上传输 1 位数据(0 或 1)
- 接收方根据 SCL 的节奏来读取 SDA 上的数据
一句话:SCL 决定“什么时候读”,SDA 决定“读到的内容是 0 还是 1”。
类比理解
假设两个人用 手电筒 + 节拍器 通信:
| 元素 | 类比 |
|---|---|
| SDA | 手电筒(亮 = 1,灭 = 0) |
| SCL | 节拍器(每拍读取一次手电筒状态) |
| 通信过程 | 节拍器响一下,读一下手电筒是亮还是灭 |
没有 SCL(节拍器),接收方不知道什么时候该去读 SDA(手电筒)。
在你之前的项目中
你在 Jetson 上用 Python 操作 GPIO 模拟 I2C 通信时:
# SDA 和 SCL 需要按照时序要求拉高/拉低
GPIO.output(SDA_PIN, GPIO.HIGH) # 发送 1 位数据
GPIO.output(SCL_PIN, GPIO.HIGH) # 产生时钟脉冲
time.sleep(0.0001) # 保持一段时间
GPIO.output(SCL_PIN, GPIO.LOW) # 时钟脉冲结束
这就是在手动模拟 I2C 协议。实际开发中通常用硬件 I2C 控制器(如 Jetson 的 /dev/i2c-1),不需要手动翻转引脚。
THE END