I2C主模式数据接收的系统结构与主模式数据发送系统结构相同,但数据接收流程与数据发送流程不同。为了便于读者理解I2C主模式系统结构与I2C协议的关系,现以一幅I2C协议的典型读数据帧格式图为例来说明相关信号的功能和用法,如图11-16所示。图11-17是此典型读数据帧格式在PIC单片机硬件I2C上的实现过程时序图。
图11-16 I2C协议的典型读数据帧格式
根据I2C协议,电路先发送起始信号S,由SEN信号置1来实现。当起始信号S发送完毕后,SEN信号被硬件自动清零,并且SSPIF位被硬件自动置位(必须用软件清零)。只有起始信号S发送完毕后,主机才能发送下一信号。
起始信号S后紧跟地址数据和读/写信号,这通过向SSPBUF写入一个字节来实现。此字节的高7位为从机地址(对于7位地址模式而言),最低位是读/写信号,当为1时表示从从机读数据。从机接收地址数据后若发现地址匹配则向主机发出应答信号A。
主机收到地址数据的应答信号后,通过把RCEN置位使I2C硬件自动启动一次数据读操作。
串行移位寄存器SSPSR在SCL的移位时钟驱动下获得SDA上由从机传来的数据,接收一个字节完毕后把SSPSR内容传送到SSPBUF。主机通过置位ACKEN来发送一个应答信号。应答信号的值由ACKDT决定。
●ACKDT=0:主机连读应答,说明还要继续读取。
●ACKDT=1:主机读停应答,说明主机读操作要结束。
一次数据读操作完成后RCEN被硬件自动清零,SSPIF和BF位被硬件自动置位。SSPIF必须用软件清零,当SSPBUF被读取后BF位被硬件自动清零。(www.daowen.com)
注意:当读操作完成时,若BF位还是1(说明SSPBUF上次读到的数据未被读取),会使SSP接收溢出信号SSPOV自动置位。SSPOV必须用软件清零。
若是主机由从机接收(读取)多个字节的数据,除最后字节外,其他字节的主机应答信号都应该是ACKDT=0,只有最后一个字节的主机应答信号是ACKDT=1。
当主机发送应答信号ACKDT=1后,必须发送停止信号P来结束一次I2C通信。这在PIC的硬件I2C模块中通过把PEN信号置位来实现。当停止信号P发送完毕后,PEN信号被硬件自动清零,并且SSPIF位被硬件自动置位(必须用软件清零)。
若希望再次通过I2C硬件发送数据,则必须重新发送起始信号S,并严格按照I2C协议的读数据帧格式依次发送相关数据或信号。
若希望在一次I2C数据操作帧中读/写方向发生改变,则需要在发生改变前先发送重启信号SR(通过把RSEN置位来实现),当重启信号SR发送完毕后RSEN信号被硬件自动清
图11-17 I2C主模式接收数据时序图(7位地址)
零,并且SSPIF位被硬件自动置位(必须用软件清零)。SR信号后的数据收发流程与S信号后的收发流程完全相同。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。