一、iic协议介绍
iic(i2c,inter-integrated Circuit),即集成电路总线,是一种两线式串行总线。多用于主机(fpga)和从机(外围设备)在数据量不大且传输距离短的场合下使用(支持一主多从,根据器件地址进行从机的区分)
iic由数据线SDA和时钟线SCL构成通信线路,既可以发送数据,也可以接受数据
iic为半双工同步通信方式,在不同模式下通信速率不同
标准模式:100Kbit/s
快速模式:400Kbit/s
高速模式:3.4Mbit/s
二、协议时序
数据线只允许在时钟的低电平时改变,在高电平时保持不变
开始:时钟高电平时,数据线由高变为低;结束:时钟高电平时,数据线由低变为高
应答过程:开始时数据线由高变低,紧接着连续八个时钟fpga输出8bit数据(一开始的数据可能是器件地址),从设备检测到器件地址是自己的后,则拉低自己的相应信号,fpga会检测这个拉低的信号,即EEPROM是否响应了数据
如果没有响应(即SDA信号一直为高),则可能是因为器件地址发送错误,也可能是时钟频率过高
器件地址:由8位数据构成,前四位为固定值,后三位为A2、A1、A0(器件中已全部接地,因此都为0),最后一位为控制位,表示对器件是读操作还是写操作(读操作为1,写操作位0)
字节写:首先数据线由高到低表示开始(在时钟高电平时),紧接着发出8位的器件地址(最后一位为0,表示写),接下来的ACK是一个应答位,即EEPROM接收到正确地址后会相应,将拉低这个SDA数据线,(即前面的器件地址是fpga在控制这根线,后面的这个应答位是EEPROM在控制这根线);
接下来是第一个字节地址位(×号表示不用关心的bit位,为什么不用关心呢?因为EEPROM一共有8192个字节,即2的13次方,因此第一个字节位地址前三位是不关心的,后五位和第二个字节地址8位构成了我们的13位字节地址),发送完后EEPROM同样做出一个应答ACK;
接下来发送第二个字节位地址(低八位),发送完后EEPROM同样做出一个应答ACK;
传送完字节地址后,fpga会将数据DATA发送给EEPROM,同样做出一个应答ACK;
最后fpga会发送一个结束操作,即SCL为高电平期间SDA由低变高
结束之后EEPROM会处于一个写的周期,将数据写入字节地址中,在此期间无法对其进行操作,这一过程大概5ms
页写:前面的操作和字节写相同,区别在于在发送了数据后,不发送终止操作,而是接着发送其他数据,后面的数据依次往后面的地址中写入,直到31(地址是递增的,每一页有32个字节),如果到31还不给结束操作的话,那么他又会返回到0去写数据(注意:这里是在当前页的循环!!要到下一页的话需要重新发起操作改变前面的字节地址)
标签:字节,数据线,器件,11.2,地址,iic,串口,EEPROM From: https://www.cnblogs.com/liwilling/p/18227922