我们来一场轻松有趣的 I²C 总线“时空之旅”!想象一下,有两根神奇的电话线(SDA 和 SCL),连接着好几个“小设备”(芯片)。它们之间需要悄悄话传递信息,但又不能互相干扰。I²C 协议就是它们约定的“悄悄话规则”,而时序图就是记录它们对话过程的“监控录像”。
核心角色:
-
SDA (Serial Data Line - 串行数据线): 这是传递实际信息的“悄悄话通道”。数据(0 或 1)就在这根线上跑。
-
SCL (Serial Clock Line - 串行时钟线): 这是“指挥棒”或“节拍器”。它由主设备(通常是单片机/CPU)控制,用来指挥所有设备(包括主设备和从设备)什么时候该听(采样数据),什么时候能说(改变数据)。想象它像交通灯,告诉数据什么时候可以安全过马路。
-
主设备 (Master): 对话的发起者和节奏控制者。它掌握着 SCL 的开关。
-
从设备 (Slave): 对话的参与者,只能响应主设备的呼叫。每个从设备有一个独一无二的“门牌号”(设备地址)。
核心规则(时序图的灵魂):
-
最重要的铁律:当 SCL 是高电平 (
1) 时,SDA 上的数据必须保持稳定不变! 这是大家读取数据的时候,谁乱动谁就制造混乱。想象指挥棒(SCL)举到最高点时,大家必须保持安静看清当前数据状态。 -
当 SCL 是低电平 (
0) 时,SDA 才允许发生变化。 指挥棒放下时,才是大家准备下一个动作(改变数据)的安全时间。就像交通灯变红,车辆才能开始启动或停止。
现在,让我们“播放”这段监控录像(时序图),一幕一幕拆解:
场景 1: 开启悄悄话通道 - “开始”信号 (Start Condition / S)
-
画面: SCL 本来是高的 (
1),SDA 也本来是高的 (1)(这是空闲状态,大家都没说话)。 -
动作: 主设备(老大)想说话了!它 先把 SDA 线从高 (
1) 拉低 (0)!等 SDA 稳定在低电平后,再把 SCL 从高 (1) 拉低 (0)! -
意义: 这个特殊的动作 (
SDA在SCL高时 从高变低) 就像老大用力地拍了一下桌子,大声说:“喂!注意了!我要开始讲话了!都安静听着!” 这个信号告诉总线上所有从设备:“有事情要发生了,准备好听指令!” -
关键点:
SDA的下跳变必须发生在SCL保持高电平期间!这是识别“开始”信号的唯一特征。
场景 2: 点名找谁 - 发送从设备地址 (Slave Address)
-
画面: SCL 开始有规律地“跳动”(高->低->高->低...),SDA 在 SCL 低电平时变化,在 SCL 高电平时保持稳定。
-
动作:
-
主设备 要指定和哪个“小弟”(从设备)说话。它把这个小弟的“门牌号”(7位或10位地址,常用7位)一位一位地放到 SDA 线上。
-
每个位(bit)的传输周期:
-
SCL 低电平 (
0) 时: 主设备可以安全地设置 SDA 为下一个要发送的位 (0或1)。 -
SCL 高电平 (
1) 时: SDA 必须保持稳定!此时,所有设备(包括目标从设备) 都在这个时刻读取 SDA 上的值 (0或1)。
-
-
地址的 第 8 位 是一个特殊位,叫 读写位 (
R/W#):-
0= 老大要对小弟写数据(老大说,小弟听)。 -
1= 老大想让小弟读数据给老大(老大听,小弟说)。
-
-
-
意义: 老大挨个念出7位地址 + 1位读写方向。总线上所有小弟都在听,核对这个地址是不是自己的。只有地址匹配的那个小弟知道老大是在叫它,并且知道接下来是要听老大说 (
R/W#=0) 还是它自己说 (R/W#=1) 给老大听。就像老师点名:“张三同学!请你回答个问题!” (R/W#=1) 或者 “张三同学!你听好了!” (R/W#=0)。
场景 3: 小弟回应 - 应答信号 (Acknowledge / ACK)
-
画面: 发送完地址(7位)+读写位(1位)后,主设备释放 SDA 线(让它变高
1),然后拉高 SCL。 -
动作:
-
主设备 在发送完第8位(R/W#)后的那个 SCL 低电平期间,释放 SDA 线(不再主动拉低或拉高它,相当于让它“悬空”,通常会被上拉电阻拉到高
1)。 -
主设备 拉高 SCL (
1)。 -
被点名的从设备 必须在 SCL 高电平期间,主动把 SDA 线拉低 (
0)!
-
-
意义: 被点到名的小弟必须在这个时刻拉低 SDA,大声喊一声:“到!老大,我在这儿呢!地址收到了,明白你要我干啥(读/写)了!” 这就是
ACK(应答) 信号。如果没有任何小弟拉低 SDA(SDA 保持高1),那就是NACK(非应答),表示“老大,你叫的人不在/没听懂/忙死了!”。老大看到NACK就知道出问题了(地址错/设备不存在/设备忙)。
场景 4: 传递悄悄话内容 - 传输数据字节 (Data Byte)
-
画面: 和发送地址位的过程一模一样!
-
动作:
-
无论是主设备给从设备写数据 (
R/W#=0),还是从设备给主设备读数据 (R/W#=1),一个字节(8位) 的数据都是这样一位一位传输的。 -
规则不变:
-
SCL 低电平时:发送方 (写数据时是主设备,读数据时是从设备) 设置 SDA。
-
SCL 高电平时:接收方 (写数据时是从设备,读数据时是主设备) 读取 SDA。此时 SDA 必须稳定!
-
-
-
关键点: 数据方向由之前的
R/W#位决定。写数据时,主设备是“说”的人(控制 SDA 发数据),从设备是“听”的人(读取 SDA 数据)。读数据时,正好相反,从设备“说”(控制 SDA 发数据),主设备“听”(读取 SDA 数据)。但 SCL 永远 由主设备控制!
场景 5: 每句话后确认 - 数据字节后的应答 (ACK/NACK after Data Byte)
-
画面: 每传输完一个字节(8位数据),紧跟着就是一个
ACK或NACK位! -
动作:
-
写数据 (
R/W#=0):-
主设备发完8位数据。
-
主设备释放 SDA(拉高)。
-
主设备拉高 SCL。
-
从设备 必须在 SCL 高时拉低 SDA (
ACK) 表示:“老大,这个字节我收到了,状态良好,请发下一个字节吧!” 或者保持 SDA 高 (NACK) 表示:“老大,我收满了/出错了,别再发了!”
-
-
读数据 (
R/W#=1):-
从设备发完8位数据。
-
从设备释放 SDA(但主设备可能马上要控制)。
-
主设备拉高 SCL。
-
主设备 必须在 SCL 高时做出反应:
-
如果想继续读下一个字节:主设备 拉低 SDA (
ACK) 表示:“小弟,这个字节我收到了,干得不错,再给我读一个!” -
如果这是最后一个字节不想读了:主设备 保持/拉高 SDA (
NACK) 表示:“小弟,这个字节我收到了,好了,不用再读了!”
-
-
-
-
意义: 这是数据传输过程中的“握手”确认机制。每成功传递一个字节,接收方都要给发送方一个明确的“收到” (
ACK) 或“停止发送/出错” (NACK) 的反馈。保证数据可靠传递。
场景 6: 悄悄话结束 - “停止”信号 (Stop Condition / P)
-
画面: SCL 本来是低的 (
0),SDA 也是低的 (0)(假设在传输数据)。 -
动作: 老大说完了!它 先把 SCL 从低 (
0) 拉高 (1)!等 SCL 稳定在高电平后,再把 SDA 从低 (0) 拉高 (1)! -
意义: 这个特殊的动作 (
SDA在SCL高时 从低变高) 就像老大站起来说:“好了,今天的会就开到这儿,散会!” 它告诉所有设备:“本次对话结束,总线恢复空闲状态 (SDA=1, SCL=1),大家可以休息或者等待下一次开始了。” -
关键点:
SDA的上跳变必须发生在SCL保持高电平期间!这是识别“停止”信号的唯一特征。
总结要点:
-
SCL 是老大: 它是指挥棒,控制着整个对话的节奏。它高时 (
1),是“定格拍照”时间,SDA 必须纹丝不动让大家看清数据。它低时 (0),是“准备动作”时间,SDA 才能安全切换状态。 -
SDA 是消息通道: 上面跑的是地址、数据、ACK/NACK 这些实际内容。但它的变化必须严格遵守 SCL 的指挥。
-
开始信号 (
S): SCL 高时,SDA 从高变低。老大拍桌子:“开会了!” -
停止信号 (
P): SCL 高时,SDA 从低变高。老大宣布:“散会!” -
地址/数据传输: 都是 8 位(bit)。每位传输:SCL 低时设置 SDA -> SCL 高时稳定 SDA (读取)。像在指挥棒指挥下,一步一步传递小纸条。
-
ACK/NACK: 接收方在 SCL 高时拉低 SDA (
ACK) 表示“收到/继续”,不拉低 (NACK) 表示“没收到/停止/出错”。每次传完地址或数据都要有这个“点头/摇头”确认。 -
主从角色: SCL 永远 是主设备控制。谁控制 SDA 发数据,由
R/W#位决定:写数据时主控 SDA,读数据时从控 SDA。ACK/NACK 的发送方是数据接收方。
常见问题:
-
为什么需要上拉电阻? SDA 和 SCL 线在空闲或被释放时,需要上拉电阻把它们拉到高电平 (
1)。没有这个“弹簧”,线就悬空了,状态不确定。就像电话线没挂好会有杂音一样。 -
多个主设备怎么办? 标准 I²C 支持多主,但需要更复杂的“仲裁”机制(检测谁先拉低 SDA),初学者可以先专注于单主模式。
-
怎么知道设备地址? 看器件的数据手册 (Datasheet)!里面会明确写明它的 7 位 (或 10 位) I²C 地址。
形象比喻:
-
想象 SCL 和 SDA 是两条并行的轨道。
-
SCL 轨道上跑着一辆匀速的“时钟火车”,每节车厢代表一个时钟周期。
-
SDA 轨道上跑着“数据小车”。但规则是:只有在时钟火车车厢完全处于隧道(低电平)里时,数据小车才能换轨道(改变状态)!当火车车厢开到山顶(高电平)时,数据小车必须停在当前轨道上不动,让所有人看清楚它代表的是 0 还是 1!
-
开始信号 (
S) 和停止信号 (P) 就是特殊的“发车”和“到站”旗语。 -
ACK 就是下一站站长在火车到山顶时,挥动小绿旗 (
0) 表示“一切正常,发下一车”,或者挥动小红旗 (1) 表示“有问题,停车检查”。
以下为从正点原子文档中截的一张IIC总线时序图及小结:

3968

被折叠的 条评论
为什么被折叠?



