打印

关于eeprom AT24C64数据写入问题

[复制链接]
9313|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kin0001|  楼主 | 2013-9-20 22:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首次使用AT24C64的TWI总线读取数据,遇到一个问题,想请大家帮忙解答一下;
mcu:ATmega324pa;
eeprom:at24c64;
举个例子:
向eep24C64连续写入20个数据;然后读取这20个数据;比如写入数据为A1A2A3A4A5B1B2B3B4B5
如果首地址为0x0080的话,读去出来的数据是对的;
如果首地址为0x0090的话,读出来的数据只有16个数据是对的(16-0=16,0x00A0地址后的数据不正确

如果首地址为0x0084的话,读出来的数据也是对的;
如果首地址为0x0094的话,读出来的术只有12个数据是对的(16-4=12;

后发现是数据写入出现了问题
总结就是:
如果低八位地址的高4位为偶数,20个数据写入都正常;
如果低八位地址的高4位为奇数,20个数据部分写入不正常;

另外,我的程序是没有对TWI状态进行检查的,不知道这样做会不会有影响
以下是源程序:

void TWIStartFun(void)                                               //启动
{
   TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
   while(!(TWCR&(1<<TWINT)))
      continue;
}

void TWIWriteByteFun(unsigned char TWIData)            //写操作
{
    TWDR=TWIData;
    TWCR=(1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT)))
        continue;
}

unsigned char TWIReadByteFun(unsigned char N_ACK)  //读操作
{
    TWCR=N_ACK;
    while(!(TWCR&(1<<TWINT)))
        continue;
    return(TWDR);
}


//写入N字节数据
void WriteNByteFun(unsigned char SLA_W,unsigned int Address,unsigned char DataNum,unsigned char *TWIDataPoi)
{
    TWIStartFun();
    TWIWriteByteFun(SLA_W);                                           //器件写地址
    if(SLA_W!=PCFSLA_W)
        TWIWriteByteFun(Address>>8);                               //器件地址高8位(eep24c64)
    TWIWriteByteFun(Address);                                         //器件地址
    for(;DataNum!=0x00;DataNum--)
        TWIWriteByteFun(*TWIDataPoi++);
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);           //结束
    if(SLA_W!=PCFSLA_W)
}


//读N字节数据
void ReadNByteFun(unsigned char SLA_R,unsigned int Address,unsigned char DataNum,unsigned char *TWIDataPoi)
{
    TWIStartFun();
    TWIWriteByteFun(SLA_R-1);                                      //器件写地址
    if(SLA_R!=PCFSLA_R)
        TWIWriteByteFun(Address>>8);                            //地址高8位
    TWIWriteByteFun(Address);                                      //地址低8位
    TWIStartFun();
    TWIWriteByteFun(SLA_R);                                        //器件读地址
    if(DataNum>0x01)
    {
        do
        {
             *TWIDataPoi++=TWIReadByteFun((1<<TWINT)|(1<<TWEN)|(1<<TWEA));
         }while(--DataNum>0x01);
    }
    *TWIDataPoi=TWIReadByteFun((1<<TWINT)|(1<<TWEN)); //接收最后一个数据
     TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}




相关帖子

沙发
lyjian| | 2013-9-20 22:29 | 只看该作者
你没搞懂页写的要求。
自己认真看看规格书。

使用特权

评论回复
板凳
linqing171| | 2013-9-21 07:59 | 只看该作者
看手册,EEPROM里面是按页存储的。
EEPROM的写入时间很长,所以有个缓存,可以保存最多一页的数据。
你是跨页了,就回环了。
从0x94写16个,会写入0x94 0x95 ... 0x9F , 0x80 ,0x81 ,0x82, 0x83 地址。业内回环。
仔细看一下datasheet

使用特权

评论回复
地板
NE5532| | 2013-9-21 08:35 | 只看该作者
亲,E2要分页的,搞硬件要先看数据手册,别瞎整。

使用特权

评论回复
5
lzqxs89| | 2013-9-21 08:55 | 只看该作者
数据手册虽然很麻烦但是确实很重要哦!

使用特权

评论回复
6
lirunze| | 2013-9-21 09:11 | 只看该作者
同意楼上

使用特权

评论回复
7
kin0001|  楼主 | 2013-9-21 09:29 | 只看该作者
,原来是这样子的,英文不太好,所以下载了个中文的,但没有提到页写这项,感谢各位的回答

使用特权

评论回复
8
NE5532| | 2013-9-21 10:03 | 只看该作者
kin0001 发表于 2013-9-21 09:29
,原来是这样子的,英文不太好,所以下载了个中文的,但没有提到页写这项,感谢各位的回答 ...

搞电子,英文不好就别搞了(过四级不叫英语好,我也没过四级)。电子世界只有2种语言:英语和日语,中文的没有!

使用特权

评论回复
9
kin0001|  楼主 | 2013-10-2 20:27 | 只看该作者
这几天太忙了,忘结贴了,分就给第一位吧

使用特权

评论回复
10
zxm19820916| | 2016-8-22 22:42 | 只看该作者
我用stm32访问at24c64,也碰到一个问题,看来是和地址有关,datasheet没有仔细看。晕。

使用特权

评论回复
11
3htech| | 2016-8-23 10:08 | 只看该作者
本帖最后由 3htech 于 2016-8-23 10:15 编辑

可以参考一下。这套代码是比较老的了。
https://bbs.21ic.com/icview-370014-1-1.html
=====================================

下面是最新的代码,不依赖单片机类型,移植方便。
最新EEPROM驱动集.rar (11.55 KB)



使用特权

评论回复
12
datouyuan| | 2016-8-24 17:56 | 只看该作者
3htech 发表于 2016-8-23 10:08
可以参考一下。这套代码是比较老的了。
https://bbs.21ic.com/icview-370014-1-1.html
==================== ...

看了下你的帖子,不错.

使用特权

评论回复
13
18555213691| | 2022-5-6 16:45 | 只看该作者
3htech 发表于 2016-8-23 10:08
可以参考一下。这套代码是比较老的了。
https://bbs.21ic.com/icview-370014-1-1.html
==================== ...

讲解的很细致

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

63

帖子

0

粉丝