eeprom的读写操作测试程序24C64,课设题目
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。
单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
4
图17-1 24C02读写项目的电路原理图 17- 24C02读写项目的电路原理图
5
17.3 系统板上硬件连线
PMY单片机开发板上24C02读写控制项目的连接插线设置如图 17-2所示。
24C02读写项目的连接插线设置 图17-2 开发板上24C02读写项目的连接插线设置 17- 开发板上24C02
3
17.2 项目任务
24C02读写控制项目的电路原理图如图17-1所示。在第17章已 经介绍过,STC89C52RC单片机本身不包含I2C总线通信控制器的 功能,为了与具有I2C总线通信和存储功能的EEPROM器件24C02 芯片进行数据交换,STC89C52RC单片机必须利用自身的两根 I/O线(这里是P14和P15引脚),作为I2C的SDA和SCL信号线,利 用 软 件 模 拟 产 生 I2C 通 信 协 议 规 定 的 传 输 数 据 信 号 , 以 完 成 与 24C02芯片之间的数据交换。 本次项目应完成以下程序设计:通过C51嵌入式软件对24C02指 定的多个连续地址写入指定数值,再读出已写入24C02器件地址的 数值,并在七段LED数码管上进行显示。
14
如何在项目中实现24C02 24C02的读写 17.6.3 如何在项目中实现24C02的读写
程序中的_24C02_WriteByte函数是向指定从地址器件的特定寄 存器地址写入一个字节数据,虽然与数字钟设计项目程序中的 PCF8563_WRINIT函数功能类似,但只是完成了向从器件传送一 个字节数据的功能。而PCF8563_WRINIT函数则完成向从器件指 定地址写入多个指定字节数据,在本项目主程序main中的以下语 句同样可以实现主器件(STC89C52RC)向指定从器件(24C02) 的指定地址连续写入多个字节的功能: /*************以下语句为向24C02写入数据*****************/ _24C02_Fillbyte(20,0xff); //将前20字节用0xff填充 for(i=0;i<16;i++) _24C02_WriteByte(i,DispDat[i]); //将数组DispDat设定的 显示代码写入到24C02 /*************以上语句为向24C02写入数据*****************/
单片机模拟I2C总线读写EEPROM(24CXX)程序一
单片机模拟I2C总线读写EEPROM(24CXX)程序一下面是一个最简单的读写程序,可以用来检测线路状况。
先附上程序和电路,后面附有说明。
电路:说明:P2 口的LED 都是我用来检测电路执行到哪一步的,个人觉得一目了然。
程序:#include #define unit unsigned int#define uchar unsigned charint ok;sbit scl=P0;sbit sda=P0;sb it led0=P2;sbit led1=P2;sb it led2=P2 ;sbit led3=P2;sb it led4=P2;sb it led5=P2 ;sbit led6=P2;sb it led7=P2;delay(void) //delay{ int i; led1=1; for(i=0;istart(void) //start{ sda=1; scl=1; delay(); sda=0; delay(); scl=0; led0=0;}stop(void) //stop{ sda=0; scl=1; delay(); sda=1; delay(); scl=0;}checkanswer(void) //check answer{ sda=1; scl=1; if(sda==1) { F0=1; led7=0; } scl=0; led3=0;}sendabyte(int temps) //send a byte{ uchar n=8; while(n--) { led2=1; if((temps&0x80)==0x80){ sda=1; scl=1; delay(); scl=0;}else{ sda=0; scl=1; delay(); scl=0;}temps=tempsreciveabyte() //recive a byte{ uchar n=8,tempr; while(n--) {//uchar idata *abyte scl=1;tempr=temprmain(void) //MAIN{start();sendabyte(0xa0);checkanswer();if(F0==1) return;sendabyte(0x00);checkanswer();if(F0==1) return;sendabyte(0x11);checkanswer();if(F0==1) return;/*-----------------------*/start(); sendabyte(0xa0);checkanswer();if(F0==1) return;。
24C01-24C256共9种EEPROM的字节读写操作程序
24C01-24C256共9种EEPROM的字节读写操作程序一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。
此程序结构性良好,具有极好的容错性,程序机器码也不多:#pragma ot(6,SIZE)#include#include#define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M 24256};enum eepromtype EepromType;//DataBuff为读写数据输入/输出缓冲区的首址//ByteQuantity 为要读写数据的字节数量//Address 为EEPROM的片内地址//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;/************************************************************** *********************/bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,unsigned char ControlByte,enum eepromtype EepromType) {void Delay(unsigned char DelayCount);void IICStart(void);void IICStop(void);bit IICRecAck(void);void IICNoAck(void);void IICAck(void);unsigned char IICReceiveByte(void);void IICSendByte(unsigned char sendbyte);unsigned char data j,i=ERRORCOUNT;bit errorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((unsigned char)(Address>>8)); if(IICRecAck())continue;}IICSendByte((unsigned char)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0; //********clr errorflagwhile(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte(); //read last byte data IICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************以下是对IIC总线的操作子程序***//*****************启动总线**********************/ void IICStart(void){SCL=0; //SDA=1;SCL=1;_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();SCL=0;SDA=1; //}/*****************停止IIC总线****************/ void IICStop(void){SCL=0;SDA=0;SCL=1;_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();SCL=0;}/**************检查应答位*******************/bit IICRecAck(void){SCL=0;SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();CY=SDA; //因为返回值总是放在CY中的SCL=0;return(CY);}/***************对IIC总线产生应答*******************/ void IICACK(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();}/*****************不对IIC总线产生应答***************/void IICNoAck(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;}/*******************向IIC总线写数据*********************/void IICSendByte(unsigned char sendbyte){unsigned char data j=8;for(;j>0;j--){SCL=0;sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;SDA=CY;SCL=1;}SCL=0;}/**********************从IIC总线上读数据子程序**********/ unsigned char IICReceiveByte(void){register receivebyte,i=8;SCL=0;while(i--){SCL=1;receivebyte=(receivebyte<<1)|SDA;SCL=0;}return(receivebyte);}/***************一个简单延时程序************************/ void Delay(unsigned char DelayCount){while(DelayCount--);}。
24c64读写程序
24c64读写程序#include //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#define WriteDeviceAddress 0xa0 //定义器件在IIC总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P20=P2^0;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ;}}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8个bit到24c02Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--) {SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02中void Write24c64(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02中读出8个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)); SCL=0;}return(rbyte);}//从24c02中读出1个字节uchar Read24c64(uchar address){uchar ch;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//本课试验写入一个字节到24c02并读出来验证void main(void) // 主程序{uchar c1;uchar address = 0x01;for ( address = 0x01;address<0xff;address++){Write24c64(0x00,address);// 将0x88写入到24c02的第2个地址空间c1=Read24c64(address);}P20=0;while(1); //程序挂起}。
单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。
首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。
在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。
然后,可以使用相应的读写函数对AT24C02进行读写操作。
对于读操作,需要指定读取的地址和数据长度。
可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。
读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。
对于写操作,同样需要指定写入的地址和数据。
可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。
写入操作完成后,要记
得进行等待,等待数据写入完成。
需要注意的是,AT24C02有一定的写入周期,写入速度较慢。
因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。
本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。
总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。
EEPROM器件读写例程设计.
图3.4CD4052引脚图
3.5
3.5.1 AT24C02
AT24C02芯片可存储256个字节,重复擦写1000000次,数据保存100年以上。该芯片通过I2C总线接口进行操作,并且符合I2C总线的协议。其原理图如下图所示:
图3.5AT24C02 原理图
AT24C02各引脚的功能如下表所示:
5.2 EEPROM
该模块的设计主要是实现对AT24C02芯片的读写操作,代码如下所示。
从AT24C02读数据的函数代码如下所示:
char AT24C02Read(unsigned char * _data,unsigned char addr,unsigned char leng)
{//参数_data表示数据存放的缓冲区地址,addr表示偏移地址,leng表示数据长度
EEPROM器件读写例程设计
1
本次课设是EEPROM器件读写例程的设计,即在电可擦除存储器件上实现数据的读和写。硬件方面,使用AT24C02芯片作为EEPROM器件,并为了达到实验结果的可见性,以便测试软件代码的正确性,实验中使用了LED数码显示芯片CH451来控制显示AT24C02芯片中写/读数据。
起始信号:时钟线保持高电平期间数据线电平从高到低的跳变为I2C总线的起始信号。
停止信号:时钟线保持高电平期间数据线电平从低到高的跳变为I2C总线的停止信号。
时序图
根据总线的协议规则,设计如下图所示的总线时序图。
图3.6 总线时序图
根据总线的时序要求设计总线的读写周期时序如下图所示。
图3.7总线写时序
图3.2 AT89S52引脚图 DIP封装
3.3
CH451是一个整合了数码管显示驱动和键盘扫描控制以及μP监控的多功能外围芯片。CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
24C64资料说明
写保护功能说明
写保护引脚状态 WP=VBCCB WP=GND
存储器中被写保护的部分
S
S
FM24C32A
FM 24C64A
全地址(32K)
全地址(64K)
正常读写
存储器结构
FM24C32A,32K 串行电可擦除存储器:内部分为 128 FM24C64A,64K 串行电可擦除存储器:内部分为 256
页,每页 32 字节,以 12 位地址寻址。
B
ISB1 B
B
ISB2 B
B
ILIB
B
ILO B
B
V1
ILB
PB
V1
BIH
VOL2 B
B
VOL1 B
B
电源电压 电源电流 电源电流 等待态电流 等待态电流 输入漏电流 输出漏电流 输入低电平
PP
输入高电平 输出低电平 2 输出低电平 1
VBCC
=
B
5.0V,
在 400KHz工作频率下读
VBCC
=
B
注:1. 该参数由特性测试确定,产品未经 100%测试。
最大值 8 6
单位 pF pF
条件
VBI/O
=
B
0V
VBIN
=
B
0V
直流参数
推荐参数的适用工作条件:TAB B
=
B
-40°C
~
+85°C,VCB CB
=
B
+1.7V
~
+5.5V,(除非另有说明)。
符号
参数
测试条件
VCC B
B
ICC1 B
B
ICC2 B
芯片24C64中文资料
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系列。
单片机EEPROM读写数据流程解析
单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
第二步,发送数据的存储地址。
24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。
在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。
EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。
这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。
第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。
第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。
EEPROM读写程序的设计及说明(v1.1改进版)
EEPROM读写程序的设计及说明一、I2C 总线概述I2C 总线是PHILIPS 公司推出的芯片间串行数据传输总线。
I2C 总线通过两根线(串行数据线SDA 和串行时钟线SCL)使挂接到总线上的器件相互进行信息传递,能够十分方便地地构成多机系统和外围器件扩展系统。
I2C 器件是把I2C 的协议植入器件的I/O 接口,使用时器件直接挂到I2C 总线上即可。
总线使用软件寻址来识别每个器件--微控制器、存储器、LCD、驱动器时钟芯片及其它I2C 总线器件,而无须使用片选信号,是否选中是由主器件发出的I2C 从地址决定的而I2C 器件的从地址是由I2C 总线委员会实行统一发配的。
总线上的每一次数据传送活动都是主控器先发送起始信号,然后主控器发送被控器的地址及读写位1个字节,这之后是主控器等待被控器的应答信号(接着的第九位),再接着就是主控器发送数据给被控器(写被控器)或接收被控器发出来的数据(读被控器),最后由主控器发出停止信号通知被控器结束整个数据传送过程。
I2C 总线的数据传送过程如下图所示。
I2C 总线协议规定传送的数据长度为8位,而每次传送的数据字节数由被控器所限制如24C01(128 字节EEPROM)规定一次最多可以传送8个字节,24C02(256字节EEPROM)规定一次最多可传送16个字节。
按照I2C总线协议,总线上非单片机类型的外围器件地址由器件编号地址(高4位D7~D4由器件类型决定)和器件引脚地址(D3~D1)组成,如24C01/02/03/04的器件编号地址为1010。
器件的引脚地址由A2A1A0三根硬件地址线决定,最后一位为读写控制位,1表示读,0表示写,如下图示。
二、程序框图三、EEPROM应用程序1、整体功能说明本程序利用NEC公司的9177芯片,用软件的模拟方法实现对EEPROM器件(如24C04)的读写操作。
2、变量说明EEDATA 所需读或写的EEPROM参数个数PARAADD EEPROM读写的地址变量EEWRDELAY 写EEPROM的延时时间计时变量3、标志说明_EEPRW 读写标志(0=EEPROM写,1=EEPROM读)_ACKERR EEPROM有无应答标志(1=无应答,0=有应答)_ERRORFG EEPROM出错标志(1=EEPROM出错,0=EEPROM无错)_PARAERR EEPROM参数错误(1=EEPROM参数出错,0=EEPROM参数无错)4、常量说明SLAW EQU 0A0H 表示EEPROM器件地址及EEPROM写SLAR EQU 0A1H 表示EEPROM器件地址及EEPROM读P_EESDA EQU P1.1 连接EEPROM数据线(SDA)的芯片管脚P_EESCL EQU P1.0 连接EEPROM 时钟线(SCL)的芯片管脚5、模块使用说明(1)本EEPROM读写模块可直接调用,在NEC9177调用方法为:CALL !EEPROMRW;(2)调用前需给以下几个参数进行赋值所需读写的EEPROM参数个数:EEDATA 例如:MOV EEDATA,#32所需读写的EEPROM参数初始地址:PARAADD 例如:MOV PARAADD,#0读写EEPROM数据所存放的地址:HL 例如:MOVW HL,#PARABUF程序要求为读或写EEPROM标志:_EEPRW 例如:SET1 _EEPRW6、应用范围此程序段可应用于NEC9177作为主芯片的电控中,其中外围的EEPROM器件应具有I2C总线的特性(如24C04),其他具有I2C特性的器件也可做参考。
15.11、 EEPROM读写测试实验
EEPROM读写测试实验z意义与作用EEPROM是一种电可擦可编程只读存储器,掉电后数据不丢失。
是单片机应用系统中经常会用到的存储器。
EEPROM掉电后数据不会丢失,而且可以用电信号直接清除存储数据和再编程,正是由于它的这一特性,EEPROM在嵌入式设备中应用广泛,用于产品出厂数据的保存,产品运行过程中一些数据量不大的重要数据保存等。
在本章节,我们以最常见的I2C接口的24CXX芯片为例进行学习研究。
它采用PHILIPS 公司开发的两线式串行总线(I2C总线),读写访问简单。
通过本章节实验,我们将对I2C总线有一个深入的了解,进而掌握如何读写访问24CXX这一系列的I2C接口EEPROM。
z实验原理24CXX系列EEPROM采用的访问接口是I2C接口。
I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般可达400kbps以上。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
I2C总线时序图如下:神舟IV号开发板板载的EEPROM芯片型号为24C02,该芯片的总容量是256个字节。
本节实验的基本原理:神舟IV号通过STM32F107VCT6处理器本身自带的硬件I2C接口与24C02相连,我们首先往EEPROM中写入一连串的有规律的数据,然后顺序读出,通过串口打印读出的数据,判断读出的数据是否正确,从而得知EERPOM是否可以正常访问。
24C64中文资料
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系列。
eeprom读写项目课程设计
eeprom读写项目课程设计一、教学目标本课程的教学目标是使学生掌握Eeprom的基本读写操作,培养学生动手实践能力和团队协作精神。
具体目标如下:知识目标:使学生了解Eeprom的定义、特点和应用场景;掌握Eeprom的基本读写方法和程序设计。
技能目标:培养学生能够独立完成Eeprom的读写项目,提高学生的动手实践能力;培养学生能够运用Eeprom技术解决实际问题的能力。
情感态度价值观目标:培养学生对新技术的敏感度和好奇心,激发学生对电子技术的热爱;培养学生团队协作、沟通交流的能力,提高学生综合素质。
二、教学内容根据课程目标,教学内容主要包括Eeprom的基本概念、读写方法和项目实践。
具体安排如下:第一课时:Eeprom概述,介绍Eeprom的定义、特点和应用场景。
第二课时:Eeprom的读写方法,讲解Eeprom的读写原理和编程方法。
第三课时:Eeprom项目实践,学生分组完成Eeprom的读写项目,培养学生的动手实践能力和团队协作精神。
三、教学方法本课程采用讲授法、讨论法和实验法相结合的教学方法,以激发学生的学习兴趣和主动性。
讲授法:用于讲解Eeprom的基本概念和读写方法,使学生掌握理论知识。
讨论法:引导学生针对实际案例进行讨论,培养学生运用Eeprom技术解决实际问题的能力。
实验法:学生进行Eeprom项目实践,培养学生动手实践能力和团队协作精神。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
教材:选用权威、实用的教材,为学生提供理论知识的学习依据。
参考书:推荐学生阅读相关参考书籍,丰富学生的知识体系。
多媒体资料:制作精美的PPT、视频等多媒体资料,提高学生的学习兴趣。
实验设备:准备充足的实验设备,确保每个学生都能动手实践。
五、教学评估为了全面、公正地评估学生的学习成果,本课程采用以下评估方式:平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。
EEPROM读写访问
EEPROM写使能。当EEPROM的 地址和数据准备好后,用户必须 设置EEWE为“1”,才能将数据 写入EEPROM中。在置EEWE为 “1”前,EEMWE必须置“1”, 否则写入操作无效。
位 位名 读/写 初始值 7 6 5
EEPROM读使能。此位用于对 EEPROM的数据读取,当EEAR中 设置了EEPROM的读取地址后, EERE的置“1”操作将使单元的数 据送至EEDR寄存器中,此时EERE 位自动清“0”。
1
1
(1)休眠状态 为进入休眠状态,MCUCR中的SE位被设为1,且须执 行一条SLEEP指令。系统发生的任何一种中断和复位将使 MCU恢复到正常模式。
(2)空闲模式 SM位必须清零,SLEEP指令使MCU进入空闲状态, 当系统发生外部中断、定时器/计数器溢出中断和看门狗复 位单片机时返回正常模式。 (3)掉电模式 此模式下,只有复位和外部中断可以使单片机恢复正 常模式。 (4)节电方式库函数 void sleep_enable(void) //允许低功耗模式 void sleep_disable(void) //禁止低功耗模式 void idle(void) //闲置模式 void powerdown(void) //掉电模式 void powersave(void) //休眠模式 在调用这些库函数之前必须将头文件#include <sleep.h> 加入到源程序文件中。
24c64C储存单元使用说明及程序控制
scl_24c64 = 1;
Delay_xus(1);
sda_24c64 = 1; //SDA 上升沿
Delay_xus(1);
scl_24c64 = 0;
}
void ask_24c64() //写数据应答,第九个脉冲 sda_24c64 为低,则 24c64 成功接受数据
{ uchar k=30;
scl_24c64 = 1;
scl_24c64 = 0;
sda_24c64 = 1;
return data_from_24c64;
}
void write_o_data_24c64(uchar addH,uchar addL,uchar data_24c64)//写入单个数据
{ start_24c64();
writebyte_24c64(0xa1);//写 读指令(A0A1A2=000)
for(i=0;i<n;i++) //读 n 个字节数据 { m_data_from_24c64[i] = readbyte_24c64(0); }
stop_24c64(); }*/ void main() { uchar i;
始连续多字节写入
{ uchar i;
start_24c64();
writebyte_24c64(0xa0);//写指令(A0A1A2=000)
writebyte_24c64(addH);//写高位地址
writebyte_24c64(addL);//写低位地址
if(n>32) //每页最多 32 字节
Delay_xus(1);
scl_24c64 = 0;
data_to_24c64<<=1;
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. 撰写计算机硬件综合设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月日EEPROM器件读写例程设计1实验目的(1)掌握IO 口操作(2)掌握显示及键盘芯片的运用(3)掌握I2C 总线操作2 实验设备(1)PC 机一台;ZG-211 单片机系统实验板一块(2)实验连接线若干(3)并口编程线一根(4)串口通讯线一根(5)配套电源1 个(6)芯片:CH451,89S52,CD40523 实验要求(1)能正常操作LED 数码显示(2)能通过中断方式接收按键信息(3)能正确读写EEPROM 芯片4 实验原理单片机系统常用EEPROM芯片在掉电情况下保存一些重要数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define SDL P2_7
/**************************************
定义I2C总线时钟线
***************************************/
TransmitData=PRDATA;
for(i=0;i<8;i++)
{
SDL=TransmitData_7;
Delay10us();
SCL=1;
Delay10us();
************************************/
void ENch451(void)
{
DIN=1;
DIN=0;
DCLK=1;
LOAD=1;
}
///////////////////////////////////////////////////////////////////////////////
功能: 读8个比特数据
原理: SCL为高时可以从总线读数据
***************************************/
uchar READ_8BIT_DATA(void)
{
uchar i;
//SDL=1;
for(i=0;i<8;i++)
//uint FALL[4] = {0x71,0x77,0x38,0x38};
sbit ReceiveData_0=ReceiveData^0;
sbit TransmitData_7=TransmitData^7;
////////////////////////////////////////////////////////////////////////////////
SCL=0;
Delay10us();
SDL=0;
Delay10us();
SCL=1;
Delay10us();
SCL=0;
Delay10us();
SDL=1;
}
/***********************************************************************
延时函数
************************************/
void Delay(void)
{
unsigned int i;
for(i=0;i<35000;i++);
}
/************************************
#include "regx51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
/**************************************
定义I2C总线数据线
void Delay10us(void)
{
uchar m=3;
while(--m);
}
void DELAY10MS(void)
{
unsigned int k,j;
for(k=0;k<800;k++);
for(j=0;j<800;j++);
}
/**************************************
函数: ACK(void)
功能: ACK判断
原理: 每传输一个字节后,FLASH会向MCU返回
一个标志位,如果该位为0表明内部数
据处理完毕,如果为1说明器件内部还
在处理或者器件根本没有响应
***************************************/
被认为是重新启动总线或者停止传
输,传输顺序高位在前低位在后
***************************************/
void WRITE_8BIT_DATA(uchar PRDATA)
{
uchar i;
************************************/
uchar bdata WS_8bit,WS_4bit;
sbit WS_8bit_0=WS_8bit^0;
sbit WS_4bit_0=WS_4bit^0;
/************************************
函数:FLASH_WRITE_DATA(void)
功能:向FLASH里面写数据
原理及步骤:I2C总线写数据时首先需要I2C总线启动条件SCL为H时,SDA由H变为L,
然后写入器件的地址,配套实验箱已经将器件地址A2A1A0接地,即设
置为0,高4位为1010,写器件的命令R/W为0,因此器件地址为101000
void ACK(void)
{
Delay10us();
SCL=1;
while(SDL==1);
Delay10us();
SCL=0;
Delay10us();
}
void ACK1(void)
{
Delay10us();
}
return ReceiveData;
//Delay10us();
//SCL=1;
//Delay10us();
//SCL=0;
}
/**************************************
数码管写12BIT数据函数
************************************/
void Write_12bit_data(uchar WX_8bit,uchar WX_4bit)
{
uchar Time8s,Time4s;
WS_8bit=WX_8bit;
uchar ReadTo[8] = {0x10,0x11,0x12,0x13,0x14,0x05,0x06,0x07};
//uint Contrl[4] = {0x0800,0x0900,0xa00,0xb00};
//uint PASS[4] = {0x73,0x77,0x6d,0x6d};
SCL=1;
Delay10us();
SDL=0;
Delay10us();
SCL=0;
}
/**************************************
函数: STOP_BUS(void)
功能: I2C总线启动
原理: SCL为高时,SDL由低变高启动总线
{
ReceiveData<<=1;
SCL=1;
Delay10us();
ReceiveData_0=SDL;
Delay10us();
SCL=0;
Delay10us();
void FLASH_WRITE_DATA(uchar num)
{
START_BUS();//启动总线
WRITE_8BIT_DATA(0XA0);//写器件地址
ACK();
WRITE_8BIT_DATA(0X00);//写存储区地址高位
ACK();
#define SCL P2_6
#define ch451_dsp 0x0500
uchar tag = 1, i=0;;
bdata uchar ReceiveData;
bdata uchar TransmitData;
uchar BufData[10];
WS_4bit=WX_4bit;
LOAD=0;
for(Time8s=0;Time8s<8;Time8s++)
{
DCLK=0;
DIN=WS_8bit_0;
DCLK=1;
WS_8bit>>=1;
}
for(Time4s=0;Time4s<4;Time4s++)
WRITE_8BIT_DATA(num);//写存储区地址低位
ACK();
WRITE_8BIT_DATA(num);//写数据
***************************************/
void STOP_BUS(void)
{
Delay10us();
SDL=0;
Delay10us();
SCL=1;
Delay10us();
SDL=1;
Delay10us();
{
DCLK=0;
DIN=WS_4bit_0;
DCLK=1;
WS_4bit>>=1;
}
LOAD=1;
}
/************************************
数码管驱动使能
SDL=0;
}
/**************************************
函数: WRITE_8BIT_DATA(uchar PRDATA)
功能: 写8个比特数据
原理: SCL为低时,总线数据SDL可以改变,