1、IIC(Inter-Integrated Circuit),是IICBus简称,是一种串行通信总线。
2、IIC协议:遵循主机master和从机slave的主从关系机制,区别于SPI通信协议,IIC协议存在应答机制,即当主机发送控制、地址、或数据时,需要从机回复ACK确认消息(在sda总线上回复)。
3、IIC协议:控制两根信号线SCL时钟信号线(一种理解方式)和sda数据总线,即可完成对从机的控制、输入、输出。
4、IIC协议访问eeprom为例(执行byte写命令):访问时存在“开始位”,“控制byte”,“应答位”, “高位地址位”, “应答位”,“低位地址位”, “应答位”,“数据位”, “应答位”,“停止位”。(byte写:eeprom的一种写入方式,一次写入一个字节的数据)
“开始位”, “应答位”,“停止位”单拍。
“控制byte”,“高位地址位”,“低位地址位”,“数据位”为8bit。
“控制byte”:的组成是由control code操作码4位+cs片选3位+write/read命令位1位=8位
control code: eeprom 为1010
cs片选信号: 可以片选eeprom内的8个存储单元(片选即激活某个存储单元,可进行读写等)
write/read命令:0表示写命令;1表示读命令。
高+低地址位:共计16位,取低13位为有效位,高三位 don't care
ACK: 从机的应答信号,当scl为高电平时,sda被从机拉低位0,表示从机确认,反之不确认NACK。(注意当发完8bit的数据后,三态门的控制,下面6说明三态门)
5、SCL时钟信号线的产生,是利用晶振时钟的上升沿或下降沿翻转产生,注意IIC使用的时钟的频率不要超过400khzHZ。(IIC高速模式下可达3.4Mbit/s,查看器件芯片手册是否支持),如果利用上升沿产生scl信号,那么电路驱动时钟采用下降沿有效,always @ (negedge clk)。
6、sda信号是主机和从机共用的一根数据总线,命令,数据、地址、等都在这根总线上传输,需要采用三态门,切换主机和从机对sda总线的控制权。无控制权的一方输出高阻态(即控制方发什么,总线sda就发什么,不会产生干扰)
7、开始位:当scl为高电平时,将sda拉低(sda初始是高电平,非工作时间保持高电平状态),表示开始,随即将在scl为低时,将控制位8bit信息发送出去。(注意主机数据的发送只能在scl为低电平时发送,实际就是并转串的过程),当发送完成后,在scl低电平时,将三态门使能拉低,将sda的控制(赋值主动权)给到从机。
8、ACK位:在scl为高电平时,对sda的状态做判断,为0时,表示从机ACK,为1时表示从机未确认。当ACK时,三态门的使能拉高,开始发送高位地址。
9、后续同理依次发送低位地址和数据,需要注意三态门的及时拉高和拉低切换sda的从机或主机的控制权。
10、当数据发送完成,并且收到从机反馈的ACK确认信息后,需要立即获得主机主动权,在scl为低时,拉低sda。
11、在scl为高时,拉高sda,这是stop停止位,结束操作的结束时序命令(在scl为低时,拉低sda,在scl为高时,拉高sda)。
附写仿真图,包含写的开始、控制byte、ack、高位地址位:
结束语:以上就是IIC协议的基本概念和在eeprom的应用实例。eeprom还可以实现page写,current read、random read,sequential read等命令,有兴趣的小伙伴可以私信。下面附一张读完后的结束仿真图,random read读完后进入stop状态的信号逻辑(注意:读完数据后反馈的是NACK)。