这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » WHY?EEPROM存储器24c02只能写入偶地址,奇地址异常。

共6条 1/1 1 跳转至

WHY?EEPROM存储器24c02只能写入偶地址,奇地址异常。

工程师
2021-08-02 21:35:44     打赏

在向EEPROM 24c02 写数据时出现一个怪事,向一个地址写入偶数如:2、4、6...,可以写入,并且可以读出,但是写入奇数如:1、3、5...,则不能写入,读出的数还是以前的数据,不知为啥,请高手解答,谢谢!!!!

程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit scl=P2^1;
sbit sda=P2^0;

void delay()
{;;}

void delay_ms(uint j)
{
        uint i;
        for(j;j>0;j--)
                for(i=110;i>0;i--);
}



void IIC_init()          //IIC初始化
{
        scl=1;
        sda=1;
}

void IIC_start()  //IIC开始信号
{
        scl=1;
        sda=1;
        delay();
        sda=0;
        delay();
}

void IIC_stop()                //IIC终止
{
        scl=1;
        sda=0;
        delay();
        sda=1;
        delay();
}

void IIC_check()                   //查看IIC器件是否应答
{
        scl=1;
        delay();
        while(sda);
        delay();  
        scl=0;        
}

void IIC_w_bite(uchar bite)                 //向IIC器件写1比特数据
{
        uchar i;
        for(i=8;i>0;i--)
        {
                scl=0;
                delay();
                bite=bite<<1;
                sda=CY;               
                delay();
                scl=1;
                delay();
                scl=0;
        }
}

uchar IIC_r_bite()                 //读取IIC器件1比特数据
{
        uchar i,dd;
        for(i=8;i>0;i--)
        {
                scl=1;
                delay();
                dd=dd<<1|sda;
                delay();
                scl=0;
                delay();                        
        }
        return dd;        
}

void main()
{
        IIC_init();
        IIC_start();
        IIC_w_bite(0xa0);                //寻址并发送给IIC器件准备写数据
        IIC_check();                                //应答
        IIC_w_bite(0x1);                //发送存储器存储地址
        IIC_check();
        IIC_w_bite(0x2);                //发送要给IIC器写入的数据
        IIC_check();
        IIC_stop();

        delay_ms(5);

        IIC_start();
        IIC_w_bite(0xa0);          //寻址并发送给IIC器件准备写数据
        IIC_check();                          //应答
        IIC_w_bite(0x1);          //发送存储器存储地址
        IIC_check();
        IIC_start();
        IIC_w_bite(0xa1);          //发送信息给IIC准备读数据
        IIC_check();
        P1=IIC_r_bite();          //读数据到P1口
        IIC_stop();
        while(1);
}




关键词: EEPROM     24c02     存储器    

工程师
2021-08-02 21:50:57     打赏
2楼

换一片24c02试试....


工程师
2021-08-02 22:03:55     打赏
3楼

24C02应该是很简单的的,建议楼主不要自己写,网上找一大堆例子


工程师
2021-08-02 22:26:36     打赏
4楼

或许以下信息对楼主有帮助:


有关AT24Cxx页写缓冲的概念说明如下:由于E2PROM的半导体工艺特性,对E2PROM的写入时间需要5~10ms,但AT24Cxx系列串行E2PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E2PROM中。因此,CPU对AT24Cxx系列E2PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10ms重新启动一次写操作。


以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。




专家
2021-08-03 00:02:47     打赏
5楼

感谢楼主的分享,很实用了。


工程师
2021-08-09 23:47:43     打赏
6楼

十分感谢您的分享


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]