I2C(Inter-Integrated Circuit)数据传输的开始和结束标志是通过特定的信号序列来定义的。以下是关于这两个标志的详细解释:
开始标志(Start Condition)
定义:当SCL(串行时钟线)为高电平时,SDA(串行数据线)由高电平向低电平转换,这一动作被称为开始信号或开始标志,标志着一次数据传输的开始。
作用:开始信号用于通知I2C总线上的所有设备,主机即将开始一次数据传输过程。在接收到开始信号后,从设备会准备接收或发送数据。
特点:开始信号是一种电平跳变时序信号,而不是一个持续的电平状态。它要求在SCL为高电平期间,SDA发生负跳变。
结束标志(Stop Condition)
定义:当SCL为高电平时,SDA由低电平向高电平转换,这一动作被称为停止信号或结束标志,标志着一次数据传输的结束。
作用:停止信号用于通知I2C总线上的所有设备,当前的数据传输过程已经结束。接收到停止信号后,从设备会释放总线,以便其他设备可以使用。
特点:与开始信号类似,停止信号也是一种电平跳变时序信号。它要求在SCL为高电平期间,SDA发生正跳变。
总结
开始标志:SCL高电平时,SDA由高到低跳变,表示数据传输开始。因此,先把SCL拉高,再把SDA由高到低跳变。
结束标志:SCL高电平时,SDA由低到高跳变,表示数据传输结束。因此,先把SCL拉高,再把SDA由低到高跳变。
这两个标志是I2C总线通信中非常重要的信号,它们确保了数据传输的同步和有序进行。在实际应用中,主机通过控制SCL和SDA的电平变化来发送开始和结束信号,从而实现对从设备的读写操作。
重复开始条件(repeated start condition):
有时 master 需要在一次通信中进行多次消息交换(例如与不同的 slave 传输消息,或切换读写操作),并且期间不希望被其他 master 干扰,这时可以使用“重复开始条件” —— 在一次通信中,master 可以产生多次 start condition,来完成多次消息交换,最后再产生一个 stop condition 结束整个通信过程。由于期间没有 stop condition,因此 master一直占用总线,其他 master 无法切入。 为了产生一个重复的开始条件,**SDA 在 SCL 低电平时拉高,然后 SCL 拉高。**接着 master 就可以产生一个开始条件继续新的消息传输(按照正常的 7-bit/10-bit 地址传输时序)。
时钟拉伸(clock stretching): 有时候,低速 slave可能由于上一个请求还没处理完,尚无法继续接收 master的后续请求,即 master的数据传输速率超过了 slave的处理能力。这种情况下,slave可以进行时钟拉伸来要求 master暂停传输数据 —— 通常时钟都是由 master提供的,slave只是在 SDA上放数据或读数据。而时钟拉伸则是 slave在 master释放 SCL后,将 SCL主动拉低并保持,此时要求 master停止在 SCL上产生脉冲以及在 SDA上发送数据,直到 slave释放 SCL(SCL为高电平)。之后,master便可以继续正常的数据传输了。可见时钟拉伸实际上是利用了时钟同步的机制(见下文),只是时钟由 slave产生。 如果系统中存在这种低速 slave并且 slave实现了 clock stretching,则 master必须实现为能够处理这种情况,实际上大部分 slave设备中不包含 SCL驱动器的,因此无法拉伸时钟。 所以更完整的 I2C数据传输时序图为: