I2C接口EEPROM的控制
AT24Cxx是Atmel公司生产的串行电可擦的可编程存储器EEPROM,它采用8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在I2C总线上并接4片该芯片,特别适用于具有大容量数据存储要求的数据采集系统。本设计以AT24C512为例,介绍该芯片的工作原理和与单片机的软硬件接口。 一.AT24C512简要介绍
AT24C512是Atmel公司生产的64KByte串行电可擦的可编程存储器,内部有512页,每一页为128Byte,任一单元的地址为16位,地址范围为0000~0FFFFH。它采用8引脚封装,具有结构紧凑、存储容量大等特点,可以在I2C总线上并接4片芯片,特别适用于具有大容量数据存储要求的数据采集系统。因此在测控系统中被大量采用。 1、AT24C512的主要特性
具有如下3种工作电压:
5.0 (VCC = 4.5V to 5.5V)。
2.7 (VCC = 2.7V to 5.5V)。
1.8 (VCC = 1.8V to 3.6V)。
存储容量为65,536Byte即512Kbit( 64Kx 8bit)。
与100kHz、400kHz、1MHz I2C总线兼容。
ESD保护电压>4kV。
数据可保存40年。
CMOS低功耗技术,最大写入电流为3mA。
采用施密特触发,可抑制输入噪声。
符合双向数据传送协议。
具有硬件写保护和软件数据保护功能。
具有128Byte页写入缓存器。
自动定时的写周期。
具有8引脚DIP及20引脚SOIC封装等多种。
2、管脚说明新闻自由与言论自由
AT24C512的管脚如图 所示
各引脚的功能如下:
A0、A1:地址选择输入端。在串行总线结构中,如需连接4个AT24C512弗吉尼亚伍尔夫芯片,则可用A0、A1来区分各芯片。A0、A1悬空时为0。
SDA:双向串行数据输入输出口。用于存储器与单片机之间的数据交换。
SCL:串行时钟输入。通常在其上升沿将SDA上的数据写入存储器,而在下降沿从存储器读出数据并送往SDA。
WP:写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,该脚将在芯片内部下拉到地。
VCC:电源。
GND:接地。
NC:悬空。
二.硬件接口电路的设计
24C512的接口电路如图 所示,由于采用IC串行总线接口,连线非常简单。如果单片机没有集成硬件I2C总线接口,可以采用P1.0、P1.1口线来模拟I2C总线,AT24C512的SDA和SCL为开漏输出,故接入10k的上拉电阻。
三.软件程序设计
时钟线保持高电平期间,数据线电平从高到低的跳变代为I2C总线的起始信号。时钟线保持高电平期间,数据线电平从低到高的跳变代为I2C总线的停止信号。
2、设备选址
主器件通过发送1个起始信号启动发送过程,然后发送它所需要寻址的从器件地址,8位从器件地址的高5位固定为10100,接下来的2位(A0,A1)为器件的地址位,因此最多可以将4个AT24C512连接到同一总线上使存储容量扩展至256Kbyte。注意,这两位必须与A0和A1两引脚的输入状态相对应,从器件地址的最低位为读写控制位,“1”表示对从器件进行读操作,“0”表示对从器件进行写操作,在主器件发送起始信号和从器件发送地址字节后,AT24C512监测总线并当其地址与发送的从地址相符时发出1个应答信号(通过SDA线),AT24C512再根据读写控制位(R/W)的状态进行读写操作,从器件地址字节内容如表 所示。 表 | AT24C512地址控制字 | |
1蒋毅君 清华大学 | 0 | 1 | 0 | 0 | A0 | A1 | R/W六元子 | 忆韦素园君
| | | | | | | | | |
3、应答信号
I2C总线传送数据时,每成功传送1个字节,接收器都必须产生1个应答信号,应答的器件在第9个时钟周期将SDA线拉低表示其已收到1个8位数据。AT24C512在接收到起始信号和从器件地址之后产生应答信号,如果器件已选择了写操作,则在每接收1个8位字节之后产生1个应答信号。
当该器件工作于读模式时,在发送1个8位数据后释放SDA线并监测1个应答信号,一旦接收到应答信号,则继续发送数据,若主器件没有发送应答信号,器件停止传送数据并等待1个停止信号。
4、写操作
写操作可分为字节写和页写两种写入方式。通常E2PROM的写入占用一定的写入时间,但AT24C512内部设有128字节的页写缓存,使得操作该器件如同操作SRAM一样方便,页面缓存使得两种写入方式的操作过程相同,区别仅在于写入数据字节的多少。下面以字节写入为例介绍写操作过程。
在字节写操作模式下,主器件首先给从器件发送起始信号和从器件地址信息,在从器件送回应答信号后,主器件在发送两字节的16位地址信息写入到AT24C512地址指针,主器件在收到从器件的应答信号后,再发送1个字节的数据到被寻址的存储单元,从器件在此应答,并在主器件产生停止信号后开始内部数据擦写,在内部擦写过程中,从器件不再应答主器件的任何请求。
在写页方式时,AT24C512可以一次性写入一页128Byte。其初始化过程与字节的方法基本相同。不同的是:当写入一个数据字节后,单片机不发停止状态,而是在应答信号后接着输入127Byte;每1Byte接收完毕后,AT24C512则这样输出一个应答信号。
5、读操作
读操作分为立即读、随机读和连续读。其初始化过程基本与写操作相同,只是在设备选择字中的最低位要改成读而已。在当前地址读操作方式时,内部数据的地址将保持在最后的读写操作地址加1上,直到读到最后字节后又回到最开始的位置。而随机读操作之前先要向AT24C512写入1Byte地址,然后才能读。读串操作既可以是当前地址读,也可以是随机地址读。当单片机接收到一个数据字后,会回应一个应答信号。AT24C512在接收到应答信
号后会将地址加1,接着输出下1Byte.当单片机接收到数据但不送应答信号时,读过程结束。
读写程序
1、I2C总线基本读写程序
//-----------------------函数声明,变量定义--------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>
sbit SDA=P1^0; // 将p1.0口模拟数据口
sbit SCL=P1^1; // 将p1.1口模拟时钟口
#define NUM 10 // 接收和发送缓存区的深度
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
unsigned char idata sendbuf[NUM]; // 数据发送缓冲区
unsigned char idata receivebuf[NUM]; // 数据接收缓冲区
bit bdata SystemError; // 从机错误标志位
//------------------------------------------------总线基本函数声明
iic_start(); // 启动I2C总线子程序
iic_stop()假死状态; // 停止I2C总线数据传送子程序
slave_ACK(); // 从机发送应答位子程序
slave_NOACK(); // 从机发送非应答位子程序,迫使数据传输过程结束
IICSendByte(unsigned char ch); // 发送一个字节
IICreceiveByte(); // 接收一字节子程序
writeNbyte(unsigned char slave_add, unsigned char n);
//发送n位数据子程序
// slave_add从机地址,n要发送的数据个数
receiveNbyte(unsigned char idata slave_add, unsigned char n);