搜索
bottom↓
回复: 6

EEPROM PageWrite 求教!!

[复制链接]

出0入0汤圆

发表于 2010-11-5 23:01:36 | 显示全部楼层 |阅读模式
写入一页16byte 只能读取15字节数据 如果写入18字节 那么前面两字节回滚覆盖  但是第16字节还是FF?
谁遇到过此问题 24C08芯片 i2C接口

出0入0汤圆

发表于 2010-11-6 11:01:39 | 显示全部楼层
地址设置有问题??

出0入0汤圆

 楼主| 发表于 2010-11-7 16:11:27 | 显示全部楼层
用逻辑分析仪看过协议 数据都没有错误 写入的时序也正常 就是读取数据不对。但字节读取居然设置地址也是错的 奇怪得很啊!

出0入0汤圆

发表于 2010-11-7 19:33:08 | 显示全部楼层
上程序说话。
地址是从0x00开始的,第0页的范围是0x00到0x0f,你说的第16字节是0x10还是0x0f啊。

出0入0汤圆

发表于 2010-11-7 19:37:56 | 显示全部楼层
这个是我操作AT24C512的程序,楼主可以参考一下,操作的参数都是页地址,然后在函数内部换成对应的字节地址,这样就能完整的读写一个页。

void  PageWrite(unsigned int Page_add, unsigned char *buf,unsigned char eep_add)
{
        unsigned char i;
        unsigned int Byte_add;
        unsigned char Byte_add_H,Byte_add_L;
        bit EA_Save = EA;
        EA = 0;EA = 0;
        Byte_add = Page_add * 32;
        Byte_add_H = (Byte_add>>8)&0x00ff ;
        Byte_add_L = Byte_add&0x00ff;
        I2C_start();
        WriteByte(eep_add);            //发送器件地址
        WriteByte(Byte_add_H);         //发送地址高字节
        WriteByte(Byte_add_L);         //发送地址低字节
        for(i = 0; i < 32; i++)               //每个数据块32字节
        {
                WriteByte(buf);         //发送计数值
        }
        I2C_stop();                    //停止信号
        delay_ms(5);                               //确保写入时间
        EA = EA_Save;EA = EA_Save;
}


/**********************************************************
  按页读子函数 数据写入eep_buf缓存区
**********************************************************/
void PageRead(unsigned int Page_add,unsigned char eep_add)
{
           unsigned char i;
        unsigned char eep_addr;
        unsigned int Byte_add;
        unsigned char Byte_add_H,Byte_add_L;
        bit EA_Save = EA;
        EA = 0;EA = 0;

        Byte_add = Page_add * 32;
        Byte_add_H = (Byte_add>>8)&0x00ff ;
        Byte_add_L = Byte_add&0x00ff;
        eep_addr = eep_add + 1;

        I2C_start();
        WriteByte(eep_add);                                //发送器件地址
        WriteByte(Byte_add_H);                        //发送地址高字节
        WriteByte(Byte_add_L);                        //发送地址低字节

        I2C_start();
        WriteByte(eep_addr);                        //发送器件地址(读)
        for(i = 0; i < 31; i++)         
        {
                eep_buf = ReadByte();        //接收数据
                I2C_Ack();
        }
        eep_buf[31] = ReadByte();
        I2C_NAck();
        I2C_stop();                                                //停止信号
        EA = EA_Save;EA = EA_Save;
}

出0入0汤圆

 楼主| 发表于 2010-11-8 07:36:17 | 显示全部楼层
是地址错误 原来是10bit 地址 两位放到器件地址上去了 郁闷!!datasheet一直写得不明白!

出0入0汤圆

发表于 2010-11-8 21:48:31 | 显示全部楼层
datasheet写的还算清楚,本来8bit的地址只能做到256字节,24C08是8kbit的,当然要10位地址,只好用器件地址分块了,类似于24C02用4片扩展的操作方式。



(原文件名:未命名.png)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 18:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表