I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备全部有自己一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话开始或结束(后面讲) 数据改变:SCL为低电平时, 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 Master每发送完8bit数据后等候SlaveACK。 即在第9个clock,若从IC发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引发Master发生RESTART或STOP步骤,以下所表示::1. Master提议START2. Master发送I2Caddr(7bit)和w操作0(1bit),等候ACK3. Slave发送ACK4. Master发送regaddr(8bit),等候ACK5. Slave发送ACK6. Master发送data(8bit),即要写入寄存器中数据,等候ACK7. Slave发送ACK8. 第6步和第7步能够反复数次,即次序写多个寄存器9. :1. Master发送I2Caddr(7bit)和w操作1(1bit),等候ACK2. Slave发送ACK3. Master发送regaddr(8bit),等候ACK4. Slave发送ACK5. Master提议START6. Master发送I2Caddr(7bit)和r操作1(1bit),等候ACK7. Slave发送ACK8. Slave发送data(8bit),即寄存器里值9. Master发送ACK10. 第8步和第9步能够反复数次, 对于大多数工程师而言,I2C永远是一个头疼问题。相比UART和SPI而言,I2C时序要复杂部分,I2C组合改变也丰富部分。在这里以AT24C04为例说明I2C使用过程中部分注意点。:示意图分叙述了4种不一样操作方法,比如写单个存放单元,写多个存放单元,读单个存放单元和写单个存放单元。对于单个操作而言,上部为MCU经过I2C输出相关指令,下部为I2C设备响应。比如写单个存放单元操作时,MCU发出I2C开启,设备地址,写标志位等,而I2C设备输出多个ACK。,写多个存放字节,读单个存放字节和读多个存放字节。相对于AT24C04而言,这些读写动作相对于内部存放单元而言,对于其它含有I2C接口AD或传感器而言,存放单元变成了寄存器单元。即使存在概念上差异,不过其操作原理确实一样。,无应答为MCU发出,无应答意为MCU不需要从机输出数据,MCU将会停止此次I2C操作。需要说明是,无应答并不是一个异常情况。,通常情况下认为在I2C开启信号以后字节为I2C从机地址(7位)。对于AT24C04而言,内部含有4Kb存放位,累计512字节。若需要访问512字节内容,总共需要9根地址线(8位宽度),那么上图中存放地址(8位长度)显然还差了一位,那么就需要从设备地址中“借”1位,这就使得AT24C04含有两个I2C地址,比如0x50和0x51。,存放地址占1个字节。若换成其它I2C设备,比如ADXL345,存放地址被寄存器地址替换即可,其它操作方法相同。不过像AT24C32或AT24C64这么大容量EEPROM,则存放地址需要2字节描述,也就意味着需要连续发送两个字节地址信息且高字节在前。其它像BH1750这么光照芯片,存放地址被具体操作命令替换,使用I2C设备时需要因地制宜,切不可照搬教条。,一页大小为8字节,若果在单页范围内,存放地址累加,若超出该页最大地址
EEPROMI2C操作说明样本 来自淘豆网m.daumloan.com转载请标明出处.