I2C的协议定义了通信的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
1.主设备向从设备发送数据
过程如下(图10-3):
(1)主设备在检测到总线为“空闲状态”(即SDA、SCL线均为高电平)时,发送一个启动信号S,开始一次通信。
(2)主设备接着发送一个命令字节。该字节由7位的从器件地址和1位读写控制位R/W组成(R/W的1代表读,0代表写),此时的R/W=0。
(3)相对应的从设备收到命令字节后向主设备反馈应答信号ACK(ACK=0)。
(4)主设备收到被控器的应答信号后开始发送第一个字节的数据。
(5)从设备收到数据后返回一个应答信号ACK。
(6)主设备收到应答信号后再发送下一个数据字节,可重复多次传送多个数据。
(7)当主设备发送最后一个数据字节并收到从设备的ACK后,通过向从设备发送一个停止信号P,结束本次通信并释放总线。从设备收到P信号后退出与主设备之间的通信。
图10-3 主设备发送数据流程
对应的主设备发送数据时序图如图10-4所示。
图10-4 主设备发送数据时序图
起始信号S是在时钟SCL高电平下SDA的下降沿产生的,标志着一次数据传输的开始。
接着数据传输时钟SCL与SDA相互配合,进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,如图10-5所示。在SCL时钟的配合下,在SDA上逐位地串行传送每一位数据,传送过程中,每一位数据都是边沿触发。
(www.xing528.com)
图10-5 数据传输过程的时序图
作为数据接收端时,设备(无论是主设备还是从设备)接收到I2C传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送应答信号ACK,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送非应答信号NAK,发送方接收到该信号后会产生一个停止信号,结束信号传输。
ACK与NAK都是在SCL数据帧的第9个脉冲(传送完一个字节后)。数据发送端会释放SDA的控制权,由数据接收端控制SDA。如果SDA是低电平,代表信号为ACK应答信号;如果SDA是高电平,则代表信号为NAK非应答信号。
结束信号P是在时钟SCL高电平下SDA的上升沿产生的,标志着一次数据传输的结束。
2.I2C的基本操作格式
对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况:
(1)主设备往从设备中写数据(图10-6)。
图10-6 主设备往从设备中写数据格式
(2)主设备从从设备中读数据(图10-7)。
图10-7 主设备从从设备中读数据格式
(3)主设备从或往从设备中读写数据(图10-8)。
主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者主设备从从设备中读取数据,然后重启起始条件,紧接着主设备往从设备中写数据。
图10-8 主设备与从设备的读写数据格式
以上是三种基本操作的数据格式,当然我们也可以通过单独写后再单独读来实现读写操作。很明显,第三种操作在单个主设备系统中不需要结束信号P,不用释放总线,效率较高。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。