IIC总线时序图

我们来一场轻松有趣的 I²C 总线“时空之旅”!想象一下,有两根神奇的电话线(SDA 和 SCL),连接着好几个“小设备”(芯片)。它们之间需要悄悄话传递信息,但又不能互相干扰。I²C 协议就是它们约定的“悄悄话规则”,而时序图就是记录它们对话过程的“监控录像”。

核心角色:

  1. SDA (Serial Data Line - 串行数据线): 这是传递实际信息的“悄悄话通道”。数据(0 或 1)就在这根线上跑。

  2. SCL (Serial Clock Line - 串行时钟线): 这是“指挥棒”或“节拍器”。它由主设备(通常是单片机/CPU)控制,用来指挥所有设备(包括主设备和从设备)什么时候该听(采样数据),什么时候能说(改变数据)。想象它像交通灯,告诉数据什么时候可以安全过马路。

  3. 主设备 (Master): 对话的发起者和节奏控制者。它掌握着 SCL 的开关。

  4. 从设备 (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 高电平时保持稳定。

  • 动作:

    1. 主设备 要指定和哪个“小弟”(从设备)说话。它把这个小弟的“门牌号”(7位或10位地址,常用7位)一位一位地放到 SDA 线上。

    2. 每个位(bit)的传输周期:

      • SCL 低电平 (0) 时: 主设备可以安全地设置 SDA 为下一个要发送的位 (0 或 1)。

      • SCL 高电平 (1) 时: SDA 必须保持稳定!此时,所有设备(包括目标从设备) 都在这个时刻读取 SDA 上的值 (0 或 1)。

    3. 地址的 第 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。

  • 动作:

    1. 主设备 在发送完第8位(R/W#)后的那个 SCL 低电平期间,释放 SDA 线(不再主动拉低或拉高它,相当于让它“悬空”,通常会被上拉电阻拉到高 1)。

    2. 主设备 拉高 SCL (1)。

    3. 被点名的从设备 必须在 SCL 高电平期间,主动把 SDA 线拉低 (0)

  • 意义: 被点到名的小弟必须在这个时刻拉低 SDA,大声喊一声:“到!老大,我在这儿呢!地址收到了,明白你要我干啥(读/写)了!” 这就是 ACK (应答) 信号。如果没有任何小弟拉低 SDA(SDA 保持高 1),那就是 NACK (非应答),表示“老大,你叫的人不在/没听懂/忙死了!”。老大看到 NACK 就知道出问题了(地址错/设备不存在/设备忙)。

场景 4: 传递悄悄话内容 - 传输数据字节 (Data Byte)

  • 画面: 和发送地址位的过程一模一样

  • 动作:

    1. 无论是主设备给从设备写数据 (R/W#=0),还是从设备给主设备读数据 (R/W#=1),一个字节(8位) 的数据都是这样一位一位传输的。

    2. 规则不变:

      • SCL 低电平时:发送方 (写数据时是主设备,读数据时是从设备) 设置 SDA。

      • SCL 高电平时:接收方 (写数据时是从设备,读数据时是主设备) 读取 SDA。此时 SDA 必须稳定!

  • 关键点: 数据方向由之前的 R/W# 位决定。写数据时,主设备是“说”的人(控制 SDA 发数据),从设备是“听”的人(读取 SDA 数据)。读数据时,正好相反,从设备“说”(控制 SDA 发数据),主设备“听”(读取 SDA 数据)。但 SCL 永远 由主设备控制!

场景 5: 每句话后确认 - 数据字节后的应答 (ACK/NACK after Data Byte)

  • 画面: 每传输完一个字节(8位数据),紧跟着就是一个 ACK 或 NACK 位!

  • 动作:

    • 写数据 (R/W#=0):

      1. 主设备发完8位数据。

      2. 主设备释放 SDA(拉高)。

      3. 主设备拉高 SCL。

      4. 从设备 必须在 SCL 高时拉低 SDA (ACK) 表示:“老大,这个字节我收到了,状态良好,请发下一个字节吧!” 或者保持 SDA 高 (NACK) 表示:“老大,我收满了/出错了,别再发了!”

    • 读数据 (R/W#=1):

      1. 从设备发完8位数据。

      2. 从设备释放 SDA(但主设备可能马上要控制)。

      3. 主设备拉高 SCL。

      4. 主设备 必须在 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 保持高电平期间!这是识别“停止”信号的唯一特征。


总结要点:

  1. SCL 是老大: 它是指挥棒,控制着整个对话的节奏。它高时 (1),是“定格拍照”时间,SDA 必须纹丝不动让大家看清数据。它低时 (0),是“准备动作”时间,SDA 才能安全切换状态。

  2. SDA 是消息通道: 上面跑的是地址、数据、ACK/NACK 这些实际内容。但它的变化必须严格遵守 SCL 的指挥。

  3. 开始信号 (S): SCL 高时,SDA 从高变低。老大拍桌子:“开会了!”

  4. 停止信号 (P): SCL 高时,SDA 从低变高。老大宣布:“散会!”

  5. 地址/数据传输: 都是 8 位(bit)。每位传输:SCL 低时设置 SDA -> SCL 高时稳定 SDA (读取)。像在指挥棒指挥下,一步一步传递小纸条。

  6. ACK/NACK: 接收方在 SCL 高时拉低 SDA (ACK) 表示“收到/继续”,不拉低 (NACK) 表示“没收到/停止/出错”。每次传完地址或数据都要有这个“点头/摇头”确认。

  7. 主从角色: 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总线时序图及小结:

① 起始信号
SCL 为高电平期间,SDA 由高到低的跳变。起始信号是一种电平跳变时序信号,而不是一个电平信号。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。
② 停止信号
SCL 为高电平期间,SDA 由低到高的跳变。停止信号也是一种电平跳变时序信号,而不 是一个电平信号。该信号由主机发出,在停止信号发出后,总线就处于空闲状态。
③ 应答信号
发送器每发送一个字节,就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了 该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
观察上图标号③就可以发现,有效应答的要求是从机在第 9 个时钟脉冲之前的低电平期间
SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它
收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA 线,以便主机接收器发送一个停止信号。
④ 数据有效性
IIC 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在 时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。数据在 SCL 的上 升沿到来之前就需准备好。并在下降沿到来之前必须稳定。
⑤ 数据传输
I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行 时钟的配合下,在 SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。
⑥ 空闲状态
IIC 总线的 SDA SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个 器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FightingFreedom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值