I2C 协议分析和学习

通讯需要两根信号线

  • SDA:串行数据线
  • SCL:串行时钟线

开始信号:

在SCL为高电平期间,SDL 由高电平变化为低电平,即为开始信号

结束信号:

在SCL为高电平期间,SDL 由低电平变化为高电平,即为开始信号

ACK信号

在SCL为高电平期间,SDL 是 低电平,即为ACK信后

NACK信号

在SCL为高电平期间,SDL 是高电平,即为NACK信号

SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),

SDA上的数据必须在SCL高电平周期时保持稳定,SDL数据的高低电平翻转变化发生在SCL低电平时期。

每个字节传输必须带响应位,相关的响应时钟也由主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线

SCL第9位时钟高电平信号期间,SDA拉低其代表了有ACK响应位。

当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK非响应位。
 

7-bit 地址格式和读写位
一个7-bit的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟1-bit(R/W)的操作符,1表示读操作,0表示写操作。 接下来的一个bit是NACK/ACK,当这个帧中前面8 bit发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低(收到了NACK),则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(停止stop或重新开始repeated start condition)。

单次写(字节写)时序

连续写(页写)时序

当前地址读时序

随机地址读时序

随机地址读是没有发送数据的单次写操作和当前地址读操作的结合体

随机地址读发送完器件地址和字地址后,竟然又发送起始信号和器件地址,而且第一次发送器件地址时
后面的读写控制位为“ 0”,也就是命令,第二次发送器件地址时后面的读写控制位为“ 1”,也就是


为什么会有这样奇怪的操作呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储
单元地址处,所以首先发送了一次 Dummy Write 也就是虚写操作,只所以称为虚写,是因为我们并不是真
的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以
当前地址读的方式读数据了,

顺序读时序

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/114300238