eeprom AT24C512 i2c总线的特点 来自eeleader的博客
今天花费了一天时间,研究i2c总线的特点。因为我要用FPGA设计操作i2c总线的时序.i2c总线是常用的串行总线。我要操作的串行eeprom AT24C512。该EEPROM 容量是512KBIT,内部按照每页128字节组织,总共是512页。根据我的设计构思,准备使用PAGE WIRET 和随机连续读 两种命令方式。读写准备按照页方式进行。根据我上面的要求,我仔细研读eeprom 手册。下面我分享我读书心得。
第一点:芯片工作速度选择: 根据AT24C512手册可以知道,该款芯片的电压工作可以为1.8V-5.0V ; 不同电压等级I2C总线的最大工作速度不同。1.8V--最大工作速度fscl=100K; 2.7V----最大工作速度fscl=400K;5.0V----最大工作速度fscl=1000K. 在本案中,我要操作的AT24C512 电压等级是3.3V. 因此,我定义fscl=200K(取最大速度的一半),保证时序。
第二点:写周期耗时间(Write Cycle Time)-Twr。 该参数也是编写FPGA程序需要特别考虑一个时间。根据DATASHEET,该参数定义了从I2C总线停止位开始到数据真正写到存储区,EEPROM内部耗时。该参数与AT24C512的工作电压有关。从DATASHEET可以看到,1.8V的芯片,该参数最大为20毫秒;2.7V和5V的芯片,该参数的最大时间为10毫秒。
第三点:AT24C512支持读写操作方式:从DATASHEET可以看到,两种写方式和4种读操作方式。
1. 当前地址写操作方式:
EEPROM内部具有保持当前地址的寄存器。对当前地址进行写操作时,不需要指定地址。只要单纯给出写指令和该地址数据即可。写操作完成后,内部所保持的当前地址将自动进位。其时序图如下:
这是指定任意的地址(8位)写人数据的方式。 起始字节的DEVSEL按照前面描述的起始数据的格式,位7~4是“1010”的固定模式,位操作(“1”)还是写操作(“0”)。如果存储器处于写保护状态(WC引脚为高电平等),则在接收地址之前一直返回ACK信号,对于之后传输的数据,则返回No-ACK信号。
数据发送完毕后,如果检测出来自主机的结束条件,则EEP-ROM内部开始进行写入操作。根据数据手册可查出完成写入操作所需要的时间。+5V的产品需要5ms,其他的产品大约需要10ms左右的时间。
EEPROM内部的替换周期在进行过程中,即使发送下一个指令也将返回NoACK信号。因此,利用该NoACK信号就可判断内部的操作是否完成。
数据发送完毕后,如果检测出来自主机的结束条件,则EEP-ROM内部开始进行写入操作。根据数据手册可查出完成写入操作所需要的时间。+5V的产品需要5ms,其他的产品大约需要10ms左右的时间。
EEPROM内部的替换周期在进行过程中,即使发送下一个指令也将返回NoACK信号。因此,利用该NoACK信号就可判断内部的操作是否完成。
2. 页地址写操作方式
页面写操作本身与字节写是相同的。由于在存取后地址自动进位,因而可以按序发送1页(16字节)以内的数据。实际上向存储器单元的写人操作,与字节写相同,都是在检测出结束条件后进行的,所以需要等待,直到操作结束,然后再进行下一个操作。其时序图如下:
3. 当前地址读操作方式
EEPROM内部具有保持当前地址的寄存器。读取当前地址的数据时,不需要指定地址。只要单纯给出读指令就可读出数据。读取完毕后,内部所保持的当前地址将自动进位。其时序图如下:
4. 指定地址读操作方式(随机读)
随机读是由主机指定任意的地址读取的。利用写指令设定地址,如果赋予读指令则可以读出当前地址。所以,与字节写操作时相同,在第1字节的数据后面给出地址。在这里,一旦发送出数据就成为写操作,在此设置开始条件,取消向写操作的迁移而发出读指令,将从事先设定的地址中读出数据。此时,DEVSEL数据(前7位数据)必须设定与最初写指令所发送的相同的值。时序图如下:
5.指定地址顺序读操作方式(顺序读)
在当前地址读操作之后,如果主机返田ACK信号,则为顺序读模式,器件将准备下一个地址的数据,主机取回该数据。一旦到达要读出的最终地址,主机将返回NoACK信号,通知器件这已是最后的数据。
6.指定地址顺序随机读操作方式(顺序随机读)
当指定任意地址、希望由此连续读出数据时,可利用该模式。只要认为这是与对应于当前读的顺序读相同的模式即可。
顺序随机读模式与随机读同样进行读操作,接收到数据后如果是ACK应答,则器件将准各下一个地址的数据;如果是最终数据,则返回NoACK信号,结束数据的传输。时序图同上
顺序随机读模式与随机读同样进行读操作,接收到数据后如果是ACK应答,则器件将准各下一个地址的数据;如果是最终数据,则返回NoACK信号,结束数据的传输。时序图同上
第4点:数据传递时序。I2C总线,所有操作时序都遵循这个原则:高电平,取数据;低电平,不取数据。所有对于所有时序编程来说,要求在低电平准备好数据,然后高电平传递。时序图如下:
第5点:IO总线操作。对应FPGA IO总线操作技巧一定要处理好。
个人认为:掌握好以上5点,用CPU编程操作I2C总线一点是一点问题都没有!
特别要注意一点:接收到EEPROM响应(ACK后),不要下一个时钟周期就给数据总线给高电平,这样会造成总线冲突!