时钟拉伸(Clock stretching)
clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.
从字节级来看,一个设备可能在快速模式下接受数据,但是需要更多的时间来存储接收到的字节或者准备将要传输的另一个字节.从机可以以一种握手的处理方式在接受和应答字节后将SCL线拉低来强制使得主机进入wait状态知道从机准备好下一个字节的传输.
从位级来看,I2C总线上的设备可以通过增长每一个时钟的低周期来降低总线时钟.所以每个主机可以适应这个设备的内部操作速率.
在Hs模式,握手处理只能用在字节级别.
从机地址和R/W bit
下图是数据传输的格式:
在开始条件(S)后,发送从机地址.地址是7bit,后面的第8bit是数据的读写bit,0表示写,1表示读.具体的看下图:
数据传输被主机产生的终止条件(P)终止.然而,主机也可以无需先产生终止条件,产生一个重复的开始条件(Sr)和寻址另一个从机,
可能的数据传输格式如下:
主-发送器传到从-接收器.传输方向不变.从-接收器应答每一个字节.如下:
在第一个字节后主机从从机读数据.第一个应答后,主-发送器变为主-接收器而从-接收器变为从-发送器.第一个应答仍然是由从机产生的.主机产生余下的应答.主机在产生终止条件之前要发送一个NA.如下:
复合模式.在传输过程中改变方向,开始条件和从机地址都要重复,而读写bit要取反.如果主-接收器发送一个重复的开始条件,那么它在这之前要发送一个NA.
注意:
1.复合模式可以在比如控制串行内存器时用到.在第一个数据字节时一定要写内存器内部的地址.开开始条件和从地址重复后,数据就开始传输了.
2.自动增加或减少之前访问的内存位置都由设备的设计者决定.
3.每一个字节后面都跟着一个应答位,在图中用A或非A来表示.
4.兼容I2C总线的设备在接收到开始条件或重复开始条件时都一定要重启它们的总线逻辑,即使开始条件都不是正确的格式,它们都期望发送从机地址.
5.开始条件后立马跟着一个终止条件是不合法的格式.很多设备在设计时考虑了这一点,可以处理.
6.连接到总线上的每个设备都由唯一的地址来确定.通常是简单的主从关系,但可能存在多个一样的从机可以同时接收和响应,比如说组播.这里是以NXP的PCA9546A作为例子说明.(PCA9546A是NXP半导体生产的一款基于I2C总线控制的4通道双向多路复用器和开关。使用PCA9546A可以将一路SCL/SDA输入扩展为4路SCL/SDA输出,在对内部控制寄存器进行相应配置后,可同时选择一路或多路下行I2C总线与上行I2C总线通信。)