Maplead MCU Development Board
24. AT24C04 芯片的 I2C 总线读写
4K(512×8)AT24C04 E2PEOM
AT24C04 是 ATMEL 公司生产的 4K bit(512Bytes)E2PROM 芯片,该芯片 采用 I2C 总线设计,主要性能指标与 AT24C02 类似,不同点为: 容量为 AT24C02 的两倍,分为两部分存储空间,每部分 256bytes。 有 2 个器件地址选择脚,一个 I2C 总线最多能够挂接 4 个 AT24C04 器件。 32 页,每页 16 字节,每次可连续写入 16 字节数据。 WP 引脚为高电平时,AT24C04 的 0~255 地址空间的数据被写保护。 需要 9 位的地址进行数据寻址。
AT24C04 的引脚定义
图 24-1 AT24C02 引脚定义 表 24-1 AT24C02 引脚定义
引脚定义 1. A0 2. A1,A2 3. GND 4. SDA 5. SCL 6. WP 7. VCC 空引脚。 器件地址设定引脚。 电源地。 数据口。 同步时钟口。 写保护口。 电源。 说明
A0 为空引脚,A1,A2 口为器件地址设定口,通过 A1,A2 口来设定 AT24C04 的器件地址 WP 口接低电平
时,可以对整个 AT24C04 器件的 512 个字节进行读写操作。 当 WP 口接高电平后,器件前 256 个地址的数据被保护,只能读,不可写入,后 256 个字节数据可进行读写操作。
172
shop63914145.taobao
Maplead MCU Development Board
AT24C04 的从器件寻址
图 24-2 AT24C04 的器件及数据空间地址 AT24C04 的器件地址由两个引脚决定,分别为 A1,A2 引脚。 AT24C04 的数据空间由 P0 位决定,如图 24-2 所示,当 P0 为“0”时,将对 AT24C04 的 0~255 空间的数据进行操作;当当 P0 为“1”时,将对 AT24C04 的 256~511 空间的数据进行操作。
AT24C04 的读写操作
对 AT24C04 的读写操作与 AT24C02 的读写操作完全相同。不同的是, AT24C04 分为 2 个数据区,用 P0 位加以区别,当 P0=0 时,操作的是 0~255 地 址单元的数据;当 P0=1 时,操作的是 256~511 地址单元的数据。
图 24-3
AT24C04 的拨码开关设置
AT24C04 的拨码开关设置只有 2 位(A1、A2) ,例程中应按图 24-3 设置。
AT24C04 读写演示程序
/****************************************************************************** * 说明: * (1)晶振 12Mhz 调试通过 * (2)AT24C04 驱动程序。 * (3)执行此程序前要将上一节的 I2C 总线函数包含进来。 * (4)AT24C04 的拨码开关 A1、A2 位要全部拨至左边。 * 作者:Shenney John ****************************************************************************** * Copyright (C) 2010 by Shenney John, All Rights Reserved. ******************************************************************************/
173
shop63914145.taobao
Maplead MCU Development Board
#include <reg52.h> #define Device_Add #define EEprom_R #define EEprom_W 0xA0//器件地址:1010(器件预设地址), 0(A2) 0(A1)(两位设定地址) 0(页选择位), 0(读写标志位) 0x01 //读 0x00 //写
/*********************************************** * 字写入 * Page 为 AT24C04 的页选择位,用来选择 EEPROM * 页 0 的 256byte 或者页 1 的 256byte。 *************************************************/ bit AT24C04_Byte_W(unsigned char Page, unsigned char Data_Add, unsigned char Data) { unsigned int i; bit Flag; I2C_Start(); //启动 I2C Byte_Send( Device_Add | Page | EEprom_W ); //送器件地址,页选择位,并置读写标志位为写 Device_ACK(); //器件应答 Byte_Send(Data_Add); //送欲存储数据的地址 Device_ACK(); //器件应答 Byte_Send(Data); //存数据 for(i=0;i<1000;i++); //延时,EEprom 保存数据 Flag=Device_ACK(); //器件应答 I2C_Stop(); //停止 I2C for(i=0;i<1000;i++); if(Flag) return 1; else return 0; } /*********************************************** * 页写入 * * (1)一次页写入 8 个字节的数据 (数据手册上说 * AT24C04 可以一次页写入 16 个数据,实测只能一次 * 写入 8 个,如果超过 8 个数据,EEPROM 地址指针将 * 翻转,前面的数据将被覆盖)。 * (2)如果连续写入数据的地址超过 256,地址将从 0 地址 * 重新开始,从 0 地址开始的数据将被新数据覆盖,原数 * 据丢失。 *************************************************/ bit AT24C04_Page_W(unsigned char Page, unsigned char Data_Add, unsigned char *Data) { unsigned char i; unsigned int j; bit Flag=1; I2C_Start(); Byte_Send( Device_Add | Page | EEprom_W );//送器件地址,页选择位,并置读写标志位为写 Device_ACK(); Byte_Send(Data_Add);
174include中文
shop63914145.taobao
Maplead MCU Development Board
Device_ACK(); for(i=0;i<8;i++) { Byte_Send( *Data ); for(j=0;j<1000;j++); Flag &= Device_ACK(); Data++; } I2C_Stop(); for(j=0;j<1000;j++); if(Flag) return 1; else return 0; } /********************************************** * 读当前地址数据 ***********************************************/ unsigned char AT24C04_CurrentAdd_R(unsigned char Page) { unsigned char Data; I2C_Start(); Byte_Send( Device_Add | Page | EEprom_R );//写入器件地址,页选择位,并置读写位为读 Device_ACK(); Data=Byte_Recv(); Master_NA(); I2C_Stop(); return Data; } /************************************************* * 随机读 **************************************************/ unsigned char AT24C04_Random_R(unsigned char Page, unsigned char Data_Add ) { unsigned char Data; /****************************************** * 先执行一次伪写入,将数据地址写入 EEPROM *******************************************/ I2C_Start(); Byte_Send( Device_Add | Page | EEprom_W ); //写入器件地址,页选择位,并置读写位为读 Device_ACK(); Byte_Send(Data_Add); Device_ACK(); /***************************************** * 读当前地址数据(前面过程中写入的地址) ******************************************/ Data=AT24C04_CurrentAdd_R(Page); return Data; }
175
//EEprom 保存数据 //器件应答 //数值地址增 1
shop63914145.taobao