当前位置:文档之家› IIC总线的使用EEPROM芯片的读写程序

IIC总线的使用EEPROM芯片的读写程序

IIC总线的使用EEPROM芯片的读写程序
IIC总线的使用EEPROM芯片的读写程序

51单片机第二十二课IIC总线的使用EEPROM芯片的读写

所属类别:课程代码发布日期:2011-03-05 点击量:341 #include

#include

#define uchar unsigned char

#define uint unsigned int

sbit sda=P2^1;

sbit scl=P2^0;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00};

unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

void start(void);

void stop(void);

void ack(void);

void noack(void);

void iicwr_byte(uchar dat);

uchar iicre_byte(void);

void delay (void);

void init(void);

void delay1(void);

void write_byte(uchar add,uchar dat);

uchar read_byte(uchar add);

///////////////////////////////////

void delay1(void)

{

uint a=30000;

while(a--);

}

void delay (void)

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

void start(void)

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

void stop(void)

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

void ack(void)

{

uchar i;

scl=1;

delay();

while((sda==1)&&(i<200))i++; scl=0;

delay();

}

void noack(void)

{

sda=1;

delay();

scl=1;

delay();

scl=0;

delay();

}

void init(void)

{

sda=1;

scl=1;

}

void iicwr_byte(uchar dat) {

uchar i;

scl=0;

for(i=0;i<8;i++)

{

if(dat&0x80)

{

sda=1;

}

else

{

sda=0;

}

dat=dat<<1;

delay();

scl=1;

delay();

scl=0;

delay();

}

sda=1;

delay();

}

uchar iicre_byte(void) {

uchar i;

uchar dat;

scl=0;

delay();

sda=1;

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

dat=dat<<1;

if(sda)

{

dat++;//

}

scl=0;

delay();

}

return dat;

}

void main()

{

/* init();

start();

iicwr_byte(0xa0); ack();

iicwr_byte(10); ack();

iicwr_byte(0x55); ack();

stop();

delay1();

////////////////////

////////////////////

init();

start();

iicwr_byte(0xa0); ack();

iicwr_byte(10); ack();

start();

iicwr_byte(0xa1); ack();

P0=iicre_byte(); noack();

stop(); */

uchar k;

k=read_byte(7); k=k%10;

P1=smg_du[k]; k++;

write_byte(7,k);

while(1);

}

void write_byte(uchar add,uchar dat) {

init();

start();

iicwr_byte(0xa0);

ack();

iicwr_byte(add);

ack();

iicwr_byte(dat);

ack();

stop();

}

uchar read_byte(uchar add)

{

uchar a;

init();

start();

iicwr_byte(0xa0);

ack();

iicwr_byte(add);

ack();

start();

iicwr_byte(0xa1);

ack();

a=iicre_byte();

noack();

stop();

return a;

}

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

Eeprom的读写

所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。 关于IIC总线 I2C总线:i2c总线是Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根时钟线(SDL)组成。i2c总线的数据传输过程如图3所示,基本过程为: 1、主机发出开始信号。 2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。 3、从机发出认可信号。 4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。 5、主机发出停止信号。 I2C总线上各信号的具体说明: 开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。 停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。 应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。 注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。 作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。下面总结一下其应用的一些要点。从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。 一、工作条件 1.工作电压(VCC) 24CXX:4.5V-5.5V 24CXX-W:2.5V-5.5V 24CXX-R:1.8V-5.5V 2.输入电平定义(VIH,VIL) VIH:0.7VCC-VCC+1 VIL:-0.45V-0.3VCC 二、硬件连接 1.上拉电阻RP的取值 由于I2C总线电容要满足小于400pf的条件。从以下波形可以看出,上拉电阻越大,总线的电容越小,可以实现的数据传输率就越大,可达400khz。 [点击图片可在新窗口打开] 2.写保护脚 芯片写保护脚是高电平有效,即WP接高电平时禁止写入

STC单片机EEPROM读写程序

/* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ // #define BaseAddr 0x1000 /* 51rc */ // #define EndSectoraddr 0x3d00 /* 51rc */ // #define EndAddr 0x3fff /* 51rc 12K eeprom */ #define BaseAddr 0x4000 #define EndSectoraddr 0xf200 #define EndAddr 0xf3ff #define UseAddr 0x1000 /* ------------- 定义扇区大小------------- */ #define PerSector 512 /* 用户程序需要记忆的数组, 用户实际使用了n-1个数据,数组长度规整到 2 4 8 16 32 64 上*/ uchar Ttotal[16] = { 0x55, /* 作为判别引导头使用,用户程序请不要修改它*/ /* 用户保存记忆的数据*/ 0x01, /* 用途说明....*/ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, }; uint timerForDelay, /* 专供延时用的变量*/ i, /* 循环变量*/ EepromPtr; /* eeprom读写指针*/ /* --------------- 命令定义--------------- */ #define RdCommand 0x01 /* 字节读*/ #define PrgCommand 0x02 /* 字节写*/

IIC总线的使用EEPROM芯片的读写程序

51单片机第二十二课IIC总线的使用EEPROM芯片的读写 所属类别:课程代码发布日期:2011-03-05 点击量:341 #include #include #define uchar unsigned char #define uint unsigned int sbit sda=P2^1; sbit scl=P2^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00}; unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; void start(void); void stop(void); void ack(void); void noack(void); void iicwr_byte(uchar dat); uchar iicre_byte(void); void delay (void); void init(void); void delay1(void); void write_byte(uchar add,uchar dat); uchar read_byte(uchar add); /////////////////////////////////// void delay1(void) { uint a=30000; while(a--); } void delay (void) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }

51内部eeprom读写,实现掉电存储

主函数: #include #include"EEPROM.h" #include"smg.h" void main() { num=byte_read(DEBUG_Data_Memory_Begin_Sector_addr);//字节读(程序开始时读取EEPROM中数据) if(num>=60)num=0;//防止首次上电时读取出错?? while(1) { if(num<60) { display(num); num++;delay(5); delay1(DELAY_CONST); sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);//擦出扇区 byte_program (DEBUG_Data_Memory_Begin_Sector_addr,num);//字节编程} if(num==60)num=0; } } EEPROM.h: /*STC89C51RC,STC89LE51RC 0x2000 共八个扇区 STC89C52RC,STC89LE52RC 0x2000 共八个扇区 STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区 STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区 STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区*/ #include #include //sfr定义特殊功能寄存器 sfr ISP_DA TA =0xe2;//ISP/IAP 操作时的数据寄存器,从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处 sfr ISP_ADDRH =0xe3;//ISP/IAP 操作时的地址寄存器高八位 sfr ISP_ADDRL =0xe4;//ISP/IAP 操作时的地址寄存器低八位 sfr ISP_CMD =0xe5;//ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效 sfr ISP_TRIG =0xe6;//ISP/IAP 操作时的命令触发寄存器 sfr ISP_CONTR =0xe7;//ISP/IAP 控制寄存器 /* 定义命令*/

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过) ;本程序在4MHZ、12MHZ和24MHZ分别测试通过 ;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写 ;本程序仅作学习交流之用。 ;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟 SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址 READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址 ;------------------------------------------------ ORG 00H LJMP MAIN ;------------------------------------------------ ORG 50H MAIN: MOV SP,#20H;防止堆栈影响已用内存数据 ;以下为写EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。 LCALL WRITEEEPROMR ;以下为读EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 LCALL READEEPROMR ;以下为EEPROM读写操作验证 MOV A,WRITEdata MOV B,A MOV A,READDATA CJNE A,B,MAIN1 MOV P1,READDATA;写入数和读出数相等时,读出的数据在P1口输出并按位分别控制LED灯直观显示 sJMP $ MAIN1: MOV P1,#00H;写入数和读出数相等时,LED灯全亮 ;以下可接其它主程序,此处暂为死循环 SJMP $ ;--------------------------------------------------------------------------------------------------------------------- ;WRITEEEPROMR是随机写EEPROM(AT24C02)子程序 ;入口1:EEPROMADRESS(拟读写EEPROM存贮单元地址,00~FFH) ;入口2:WRITEDATA(拟写入EEPROM的字节数据在主机的存放地址)

IC读写EEPROM问题总结

I C读写E E P R O M问题 总结 文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

2017年6月30日星期五 目的:利用TMS320F2801芯片上外设I2C(2线串口)读写EEPROM数据(24LC128) 关键点1:24LC时钟频率400KHz,寄存器设置如下: I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk I2caRegs.I2CCLKL = 10; // NOTE: must be non zero I2caRegs.I2CCLKH = 5; // NOTE: must be non zero 时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试?) 关键点2:波形分析 问题:I2C模块是不是只有I2CCNT 减到0才会发出停止信号 I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预 问题1:字节写操作正常,但是字节读函数出错 原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。 关键点:读EEPROM数据需要发送两次命令。第一次为写地址(此地址会被赋值给EEPROM内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标志。

问题2:主机接收时,SDA数据线上有数据传输,且I2CDRR接收数据寄存器有数据更新,但寄存器显示不可读,即CPU认为一直没接收到数据,一直停在下面语句 while 关键点:初始化设置时采用的是FIFO接收方式,因此无效,应查询FIFO 接收中断位while方式查询位。 此位只有在非FIFO中断接收方式时才有效。 问题3:断续单字节读写正常,但是采用连续的单字节读写出错。 原因:EEPROM写过程的结束并不是I2C总线写结束就结束,实际上I2C 总线的写入数据先被保存到了EEPROM内部的缓冲区,当遇到I2C结束条件后,EEPROM才启动内部写过程,这个过程才是保存数据的过程。非常悲哀的是这个过程比较长,官方文档标注为5ms。如果在这5ms以内对EEPROM芯片访问将被忽略。 关键点:读写EEPROM应延时至少5ms,软件延时10ms do{}while(EEPROM_Timer <= 10); //10ms 问题4:查询EEPROM写过程是否结束造成死机,只能查询EEPROM读过程。 官方文档说EEPROM内部写周期最长为5ms,在很多情况下是远远低于 5ms的,为了节约时间,官方给出一个解决办法。当写周期完毕后就开始进行应答查询,来确定EEPROM写周期何时结束。所谓应答查询官方解释为:就是向EEPROM发送一个I2C起始条件后发送器件地址和一个读写标

PIC单片机的EEPROM读写实例及说明

PIC单片机的EEPROM读写实例及说明 ; PIC 单片机的EEPROM 读写实例及说明; ******************************************************************** ********; This is a program to test the function of readingwritting for EEPROM.; You can observe the value of register(30H--?) buy changing “VALU” and “WRC_”.; Notice that:it must be { ADDR+WRC_=0ffh } !;******************************************************************* *********include “p16f877.inc”ADDR EQU 20H ;写入地址寄存器VALU EQU 21H ;写入值REC_ EQU 22H ;读计数WRC_ EQU 24H ;写计数org 0goto mainmainbcf STATUS,RP1bcf STATUS,RP0 ;bank0movlw 10hmovwf ADDR ;写入EEPROM 初始值movlw 90hmovwf VALU ;初始写入值movlw 30hmovwf FSR ;间址,读出值初始存放地址movlw 0Fhmovwf WRC_ ;写入次数movwf REC_;incf REC_ ;读出次数wri_ ;写子程序bsf STATUS,RP1bsf STATUS,RP0 ;bank3btfsc EECON1,WRgoto $-1bcf STATUS,RP0bcf STATUS,RP1 ;bank0movf ADDR,Wbsf STATUS,RP1 ;bank2movwf EEADRbcf STATUS,RP1 ;bank0movf VALU,Wbsf STATUS,RP1 ;bank2movwf EEDATAbsf STATUS,RP0 ;bank3bcf EECON1,EEPGD ;to data memorybsf EECON1,WRENbcf INTCON,GIEmovlw 55hmovwf EECON2movlw 0aahmovwf EECON2bsf EECON1,WRbcf STATUS,RP0bcf STATUS,RP1 ;bank0incf ADDR,1decf VALU,1decfsz WRC_ ;all write,to read_goto wri_read_ ;读子程序bcf STATUS,RP1bcf STATUS,RP0 ;bank0decf ADDR ;next valuebsf STATUS,RP1 ;bank2movwf EEADRbsf STATUS,RP0 ;bank3EEwr.asm 程序说明:1、本程序是对PIC16F877 单片机的EEPROM 数据区进行读写的演示程序;

IIC读写EEPROM

u32 ulTimeOut_Time; /* ******************************************************************************* ************************** * I2C_EE_WriteStr() * * Description : 将一个数据块写入EEPROM 的指定的地址 * * Argument(s) : xChip - 从器件地址 * xAddr - EEPROM存储空间地址 * xpBuf - 数据缓冲区指针 * xLen - 数据长度 * * Return(s) : none. * * Caller(s) : Application. * * Note(s) : (1) *------------------------------------------------------------------------------------------------------- * Modified by : * Modified date : * Description : *------------------------------------------------------------------------------------------------------- ******************************************************************************* ************************** */ void I2C_EE_WriteStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen) { u8 *pbuf; u8 err; u8 retry; u16 addr; u16 len; // pbuf = xpBuf; addr = xAddr; len = xLen; I2C_EE_Drv_BusEn(); // 允许总线,写允许

PIC单片机片内EEPROM的读写程序

PIC单片机片内EEPROM的读写程序 因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下: PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下: // This header file should not be included directly // Inclusion of this file is provided indirectly by including htc.h /******************************************************************** ***/ /****** EEPROM memory read/write macros and function definitions *******/ /******************************************************************** ***/ /* NOTE WELL: The macro EEPROM_READ() is NOT safe to use immediately after any write to EEPROM, as it does NOT wait for WR to clear. This is by design, to allow minimal code size if a sequence of reads is desired. To guarantee uncorrupted writes, use the function eeprom_read() or insert while(WR)continue; before calling EEPROM_READ(). */ #if EEPROM_SIZE > 0 #ifdef __FLASHTYPE // macro versions of EEPROM write and read #define EEPROM_WRITE(addr, value) \ do{ \ while(WR)continue;EEADRL=(addr);EEDATA=(value); \ EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \ WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \ if(CARRY)GIE=1; \ }while(0) #define EEPROM_READ(addr) ((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)

51单片机EEPROM的读写

STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作 下面是一些注意点: 1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的) 2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地址中数据都变成0xFF 3.将欲写入的N个字节数据,用字节写函数写入EEPROM 4.将暂存到RAM的其它有用的EEPROM值再用字节写函数写回EEPROM 5.STC用FLASH模拟出来的EEPROM的字节写功能只能将1变成0,而不能将0变成1,只有扇区擦除后数据才是全1, 例如:在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010 所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先执行扇区擦除,变为0xff, 对于单个字节的写入,我们可以先检查该地址处的数据是否为0xff,是的话就不用擦除扇区了 ---------------------------------------------------------------------- STC89C52单片机内部EEPROM 的读写过程 1 配置ISP_CONTR寄存器,使能第7位ISPEN,让ISP_IAP功能生效,并配置低3位的等待时间 2 写指令: 读/写/擦除扇区这3个命令 3 赋值: ISP_ADDRH和ISP_ADDRL的地址值 4 关闭总中断EA,因为下面要写的2个触发指令必须是连续操作的,不能被中断 5 执行公用的ISP_IAP 触发指令,触发后读写操作才能进行 6 打开中断EA, 关闭ISP_IAP功能:清相关寄存器

EEPROM要点

常用串行EEPROM的编程应用 EEPROM是"Electrically Erasable Programmable Read-only"(电可擦写可编程只读存储器)的缩写,EEPROM在正常情况下和EPROM一样,可以在掉电的情况下保存数据,所不同的是它可以在特定引脚上施加特定电压或使用特定的总线擦写命令就可以在在线的情况下方便完成数据的擦除和写入,这使EEPROM被用于广阔的的消费者范围,如:汽车、电信、医疗、工业和个人计算机相关的市场,主要用于存储个人数据和配置/调整数据。EEPROM又分并行EEPROM和串行EEPROM,并行EEPROM器件虽然有很快的读写的速度,但要使用很多的电路引脚。串行EEPROM器件功能上和并行EEPROM基本相同,提供更少的引脚数、更小的封装、更低的电压和更低的功耗,是现在使用的非易失性存储器中灵活性最高的类型。串行EEPROM按总线分,常用的有I2C,SPI,Microwire总线。本文将介绍这三种总线连接单片机的编程方法。 I2C总线 I2C总线(Inter Integrated Circuit内部集成电路总线)是两线式串行总线,仅需要时钟和数据两根线就可以进行数据传输,仅需要占用微处理器的2 个IO引脚,使用时十分方便。I2C总线还可以在同一总线上挂多个器件,每个器件可以有自己的器件地址,读写操作时需要先发送器件地址,该地址的器件得到确认后便执行相应的操作,而在同一总线上的其它器件不做响应,称之为器件寻址,这个原理就像我们打电话的原理相当。I2C总线产生80年代,由PHLIPS 公司开发,早期多用于音频和视频设备,如今I2C总线的器件和设备已多不胜数。最常见的采用I2C总线的EEPROM也已被广泛使用于各种家电、工业及通信设备中,主要用于保存设备所需要的配置数据、采集数据及程序等。生产I2C总线EEPROM的厂商很多,如ATMEL、Microchip公司,它们都是以24来开头命名芯片型号,最常用就是24C系列。24C系列从24C01到24C512,C后面的数字代表该型号的芯片有多少K的存储位。如ATMEL的24C64,存储位是64K位,也就是说可以存储8K(8192)字节,它支持1.8V到5V电源,可以擦写1百万次,数据可以保持100年,使用5V电源时时钟可以达到400KHz,并且有多种封装可供选择。我们可以很容易的在身边的电器设备中发现它们的身影,如电视中用于保存频道信息,电脑内存条中保存内存大小等相关信息,汽车里用于保存里程信息等等。图一就是ATMEL24C64芯片的PID封装和用于内存条SPD(Serial Presence Detect)上的24芯片。

EEPROM 读写逻辑

EEPROM 的读写逻辑 一:对EEPROM的读和写 1,Read EEPROM logic 读EEPROM的数据和一般读flash数据没什么区别,DZ128有两页EEPROM空间;都共用地址0x3C00~ 0x3FFF;通过设定寄存器来选择cpu操作第一页或者第二页。 读EEPROM函数: INT8UsEepromRead(INT16U wAddr,INT16U wLength,INT8U *pbBuffer) wAddr:读取EEPROM的首地址; wLength:读取数据长度 pbBuffer:保存数据的首地址 2,WriteEEPROM logic 写EEPROM函数: INT8U sEepromWrite(INT16U wAddr,INT16U wLength,INT8U *pbBuffer) wAddr:写进EEPROM首地址(只是作为一个判定的作用,代码里面都是从0开始写)wLength:数据长度 pbBuffer:数据源地址 向EEPROM写数据的流程如下: 二,ICM 对EEPROM的处理逻辑 EEPROM用来保存一些掉电不会消失的数据,如一些校正参数等;ICM对EEPROM进行操作的基本逻辑是:当机器启动时,将EEPROM的相关参数保存至MCU的内部RAM中,如果发生错误则将默认值作为参考值使用,当机器掉电后将RAM中的对应参数保存到EEPROM中去。 1,初始化时读EEPROM数据;

当机器刚开机时,MCU会将EEPROM 的信息保存到MCU的内部RAM 中去; 当以下条件有一个发生错误则MCU 将会认为EEPROM发生错误,会将默认值作为EEPROM的参数值来被MCU引用,并且在断电前将对应参数写进EEPROM中; A,读取的数据长度参数错误 B,Checksum 错误 注:问题 这样的逻辑是有问题存在的,例如,如果发生了EEPROM的读写错误,机器将会默认值写到EEPROM中去,但是这参数不是校正后的数值,因此需要再次校正才能保证机器的工作精度;所以应该将校正后的参数值作为机器的默认值较为合理。 2,掉电后向EEPROM写数据 a), 断电触发信号会触发MCU将RAM中的对应数据写到EEPROM中,最后两个字节为checksum数据。 如上图,当+12V 电压掉至10V 一下后,PWR-GD会发生翻转,触发MCU中断后,MCU会将电源掉电标识位置起来;50ms 任务sOutputLoadJob 会将RAM中的相关信息保存到EEPROM中去;为此+12V电源掉电后,为了保证能够有足够的时间来将信息写到EEPROM中去,MCU至少还需持续工作一段时间T;T=T1+T2;T1=50ms,T2为将信息写到EEPROM的时间为148ms;为此从有保存EEPROM的触发信号到MCU断电持续的时间必须大于200ms; 现在的做法是在MCU的VDD端加一个3300UF的电容来支持MCU工作;如下图

24C64EEPROM的读写的C语言程序.

/*24C64子程序 */ bit I2C_Start(void; void I2C_Stop(void; void I2C_Ack(void; void I2C_Nack(void; bit I2C_Send_Byte( uchar; uchar I2C_Receive_Byte(void; void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count; void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count; void Delay_10_uS(void { char i=10; while(i--; } void Delay_N_mS( uint n_milisecond /* n mS delay */ { uchar i; while(n_milisecond-- {

i=37; while(i--; } } bit I2C_Start(void { Delay_10_uS(; I2C_SDA =1; Delay_10_uS(; I2C_SCK =1; Delay_10_uS(; if ( I2C_SDA == 0 return 0; if ( I2C_SCK == 0 return 0; I2C_SDA = 0; Delay_10_uS(; I2C_SCK = 0; Delay_10_uS(; return 1; }

void I2C_Stop(void { Delay_10_uS(; I2C_SDA = 0; Delay_10_uS(; I2C_SCK = 1; Delay_10_uS(; I2C_SDA = 1; Delay_10_uS(; } void I2C_Ack(void { Delay_10_uS(; I2C_SDA=0; Delay_10_uS(; I2C_SCK=1; Delay_10_uS(; I2C_SCK=0; Delay_10_uS(;

各种EEPROM读写驱动程序

//24c01-24c16读写驱动程序, sbit a0=ACC^0; //定义ACC的位,利用ACC操作速度最快sbit a1=ACC^1; sbit a2=ACC^2; sbit a3=ACC^3; sbit a4=ACC^4; sbit a5=ACC^5; sbit a6=ACC^6; sbit a7=ACC^7; void s24(void) { _nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0; } void s240(void) { _nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0; } void p24(void) { sda=0;scl=1;_nop_();sda=1; } void p240(void) { sda0=0;scl0=1;_nop_();sda0=1; } unsigned char rd24(void) { sda=1; scl=1;a7=sda;scl=0; scl=1;a6=sda;scl=0; scl=1;a5=sda;scl=0; scl=1;a4=sda;scl=0; scl=1;a3=sda;scl=0; scl=1;a2=sda;scl=0; scl=1;a1=sda;scl=0; scl=1;a0=sda;scl=0; sda=1;scl=1;scl=0; return(ACC); } void wd24(unsigned char dd) { ACC=dd; sda=a7;scl=1;scl=0; sda=a6;scl=1;scl=0; sda=a5;scl=1;scl=0; sda=a4;scl=1;scl=0; sda=a3;scl=1;scl=0; sda=a2;scl=1;scl=0; sda=a1;scl=1;scl=0; sda=a0;scl=1;scl=0; sda=1;scl=1; }

51单片机读写内部EEPROM详解

此文档共包含三个程序。 第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了。 第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。 第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内部EEPROM过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。 验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机内部EEPROM。 程序1: /*************************************************************** 作品:EEPROM实验,开机还原关电前LED的亮灭状况 单片机:STC89C52RC 晶振:12M 编译环境:Keil uVision4 V9.00 ***************************************************************/ //#include #include #include #define uchar unsigned char #define uint unsigned int /****************特殊功能寄存器声明****************/ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0xe7; sbit LED1 = P2^0; sbit LED2 = P2^1; sbit K1 = P3^2; //按钮1 sbit K2 = P3^3; //按钮2

EEPROM器件读写例程设计

课程设计 课程名称计算机硬件综合设计 设计题目EEPROM器件读写例程设计班级 姓名 指导教师 2013 年7 月 2 日

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目: EEPROM器件读写例程设计 初始条件: 1. 课程设计使用ZG211硬件综合实验平台(8051单片机),使用AT24C01接口芯片和辅助芯片以及器件; 2. ZG211有程序设计集成开发环境,程序设计语言为C语言; 3. ZG211硬件综合实验平台使用说明书; 要求完成的主要任务:(包括课程设计工作量及其技术要求,撰写说明书具体要求) 1. 学习使用ZG211硬件综合实验平台,程序设计集成开发环境; 2. 根据课程设计题目,进行需求分析,搞清楚课程设计需要设计需求和需要解决的设计内容。 3. 查阅和学习课程设计题目需要的接口芯片资料,掌握I2C接口芯片的使用方法和编程要领。查阅和学习课程设计题目需要的辅助芯片以及器件资料。 4. 设计接口芯片和辅助芯片以及器件与8051单片机连接硬件电路原理图。 5. 设计与硬件电路原理图对应的C语言程序(或8051汇编语言)。给出程序流程图。在集成开发环境中调试程序。给出程序的详细注释。能够解释使用程序模拟电路时序信号和数据。 6. 撰写课程设计报告,1)详细陈述以上的设计过程;2)详细陈述电路的调试过程。 时间安排: 第18周: 1. 熟悉ZG211硬件综合实验平台,KEILC UVISION2集成开发环境;查阅接口芯片资料,熟悉接口芯片和它的使用方法。 2. 设计硬件电路原理图,。 第19周: 1. 使用C语言或汇编语言设计和调试接口程序。 2. 撰写计算机硬件综合设计报告。 指导教师签名:年月日 系主任(或责任教师)签名:年月日

stc单片机EEPROM读写

stc单片机EEPROM读写(二) sfr isp_data=0xe2; sfr isp_addrh=0xe3; sfr isp_addrl=0xe4; sfr isp_cmd=0xe5; sfr isp_trig=0xe6; sfr isp_contr=0xe7; unsigned char eeprom_read(unsigned int addres); void eeprom_write(unsigned int address,unsigned char wdata); void eeprom_eares(unsigned int addres);//扇区擦除。 void eeprom_eares(unsigned int addres)//扇区擦除。 {unsigned i; isp_addrl=addres; //低位地址 isp_addrh=addres>>8; //高位地址 isp_contr=0x01; isp_contr=isp_contr|0x80; //设时间与充ISP操作。 isp_cmd=0x03; //扇区命命令 isp_trig=0x46; //触发 isp_trig=0xb9; //触发启动。 for(i=0;i<3;i++); isp_addrl=0xff; isp_addrh=0xff; isp_contr=0x00; isp_cmd=0x00; isp_trig=0x00; } void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。 {unsigned char i; isp_data=write_data; //要写入的数据。 isp_addrl=addres; //低位地址 isp_addrh=addres>>8; //高位地址 isp_contr=0x01; isp_contr=isp_contr|0x80; //设时间与充ISP操作。 isp_cmd=0x02; //写命令 isp_trig=0x46; //触发 isp_trig=0xb9; //触发启动。 for(i=0;i<3;i++); isp_addrl=0xff; isp_addrh=0xff; isp_contr=0x00; isp_cmd=0x00; isp_trig=0x00; } unsigned char eeprom_read(unsigned int addres) {unsigned char i,z; isp_addrl=addres; //低位地址 isp_addrh=addres>>8; //高位地址 isp_contr=0x01; isp_contr=isp_contr|0x80; //设时间与充ISP操作。 isp_cmd=0x01; //写命令 isp_trig=0x46; //触发 isp_trig=0xb9; //触发启动。 for(i=0;i<3;i++); isp_addrl=0xff; isp_addrh=0xff; isp_contr=0x00; isp_cmd=0x00; isp_trig=0x00; z="isp"_data; return(z); }

相关主题
文本预览
相关文档 最新文档