I2C主模式的系统结构如图11-9所示。
I2C与SPI共用MSSP模块。当单片机内部的SSPEN信号为1时,MSSP模块处于工作状态。当主机要用硬件实现I2C协议通信时,SSPM3:SSPM0应为'1000'。此时,串行时钟频率(通过SCL引脚输出,用于决定传输速度)由SSPADD寄存器决定,其计算方法为:F12C=FOSC/(4(SSPADD+1))
图11-9 I2C主模式的系统结构示意图
例如,当主频为4MHz,SSPADD为0x09时,FI2C=100kHz,即此时I2C模块波特率为100kbit/s。
在I2C协议中,SDA引脚上的数据来源于SSPBUF寄存器,需要按I2C协议的规定发送起始位、停止位、应答位等信号。为了便于读者理解I2C主模式的系统结构与I2C协议的关系,这里以一幅I2C协议的典型写数据帧格式图(见图11-10)来说明相关信号的作用和用法。图11-11是I2C协议的典型写数据帧格式在PIC单片机硬件I2C上的实现过程时序图。
图11-10 I2C协议的典型写数据帧格式
根据I2C协议,电路先发送起始信号S,由SEN信号置1来实现。当起始信号S发送完毕后,SEN信号被硬件自动清零,并且SSPIF位被硬件自动置位(必须用软件清零)。只有起始信号S发送完毕后,主机才能发送下一信号。
起始信号S后紧跟地址数据和读/写信号,这通过向SSPBUF写入一个字节来实现。此字节的高7位为从机地址(对于7位地址模式而言),最低位是读/写信号,当为0时表示向从机写数据。SSPBUF写入数据后I2C硬件自动启动一次数据写操作。
(www.daowen.com)
图11-11 I2C主模式发送数据时序图(7位地址)
SSPSTAT的R/W(跟信号无关)位自动置1,并把SSPBUF内容写入串行移位寄存器SSPSR。SSPSR在SCL的移位时钟驱动下发送完一个字节并接收应答信号。一次数据发送操作完成后SSPSTAT中的R/W位被硬件自动清零,并且SSPIF位被硬件自动置位(必须用软件清零)。
当一次信号(包括起始信号、停止信号、地址信号和数据信号)发送操作未完成时,用户向SSPBUF写入数据会使写冲突标志位WCOL置位,并且要写入的数据会丢失(不会启动一次写操作)。WCOL必须用软件清零。
I2C协议规定每收发一个字节,接收方必须给出一个应答信号A。当主机发送了一个字节(无论内容如何)后,主机会自动释放SDA线,然后主机发送一个应答时钟脉冲来读取从机的应答信号,读取结果保存在ACKSTAT中。一般情况下,从机若正常响应会把SDA信号拉低(ACKSTAT=0)用于通知主机数据正常。
注意:若主机发送完一个字节后收到的应答标志位ACKSTAT为1,则应及时停止传输(通过发送停止信号P来实现)。
主机在发送了地址数据和读/写信号并收到应答位后,接下来就可以根据读/写信号的约定向从机写数据或读数据了。
若是向从机发送(写入)多个字节的数据,则每个字节的处理过程与发送地址数据和读/写信号一样。不再赘述。
所有字节发送完毕后主机必须发送停止信号P来结束一次I2C通信。这在PIC的硬件I2C模块中通过把PEN信号置位来实现。当停止信号P发送完毕后,PEN信号被硬件自动清零,并且SSPIF位被硬件自动置位(必须用软件清零)。
若希望再次通过I2C硬件发送数据,则必须重新发送起始信号S并严格按照I2C协议的写数据帧格式依次发送相关数据或信号。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。