OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3746|回复: 4

求教原子大哥,我EEPROM高地址数据读写的问题

[复制链接]

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-7-11
在线时间
9 小时
发表于 2016-3-19 17:05:10 | 显示全部楼层 |阅读模式
20金钱
原子大哥,我将开发板上的AT24C02改成了AT24C04的4K大小的EEPROM,然后将例程代码重新修改了下,发现当读写高地址大于等于256地址空间数据的时候,单次读写,读出的数据都是正常的,但是我连续从256地址开始写入4Byte数据,然后再从256地址开始读数据,就不正常了,这是怎么回事呢?我的代码如下:[mw_shl_code=c,true]这是我写函数:
uint8_t EEPROM_WriteByte(uint16_t Write_Addr, uint8_t Write_Data)
{       
     I2C2_Start();
       
     if(Write_Addr<256)
     {
        I2C2_SendByte(0XA0+((Write_Addr/256)<<1));
     }
     else
     {
         I2C2_SendByte(0XA0);
         if(!I2C2_WaitAck())
         {       
              I2C2_Stop();
              return 0;
         }
               
         I2C2_SendByte(Write_Addr>>8);

    }
       
    if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
     I2C2_SendByte(Write_Addr%256);
     if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
    I2C2_SendByte(Write_Data);
    if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
    I2C2_Stop();
       
    delay_ms(10);

    return TRUE;

}

这是我读函数:
uint8_t EEPROM_ReadByte(uint16_t Read_Addr,uint8_t *read_Data)
{
    uint8_t chipaddr, offsetaddr;
    uint8_t Read_Data;
       
    I2C2_Start();
    if(Read_Addr<256)
    {
        I2C2_SendByte(0XA0+((Read_Addr/256)<<1));
    }
    else
    {
        I2C2_SendByte(0XA0);
        if(!I2C2_WaitAck())
        {       
            I2C2_Stop();
            return 0;
        }

        I2C2_SendByte(Read_Addr>>8);
    }
       
    if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
    I2C2_SendByte(Read_Addr%256);
    if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
    I2C2_Start();
    I2C2_SendByte(0xA1);
    if(!I2C2_WaitAck())
    {       
        I2C2_Stop();
        return 0;
    }
       
    *read_Data = I2C2_ReceiveByte();
    I2C2_Stop();
       
    return 1;

}

这是我的测试程序:(一下方式读出的temp数据试写入的数据)
                        rlt1 = EEPROM_WriteByte(257,0x40);//255
                                if(rlt1 != 1)
    return 0;

                        rlt2 = EEPROM_ReadByte(257,&temp);
if(rlt2 != 1)
    return 0;       
一下代码操作读出的数据就不正常了:
                for(i = 0; i < 4; i++)
                {
    rlt1 = EEPROM_WriteByte(256+i,wr_buf);//255
    if(rlt1 != 1)
        return 0;
                }
               
                for(i = 0; i < 4; i++)
                {
    rlt1 = EEPROM_ReadByte(256+i,&rev_buf);//255
    if(rlt1 != 1)
    return 0;
                }
请教下论坛中各位大神及原子大哥帮忙看看这是怎么回事呢[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

试试看,应该没问题,你的04好像页大小是16字节吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-19 17:05:11 | 显示全部楼层
丝带机 发表于 2016-3-19 23:30
额,这个怎么分呢,我第一次接触eeprom

试试看,应该没问题,你的04好像页大小是16字节吧。

IIC.zip

3.31 KB, 下载次数: 1013

回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2014-6-27
在线时间
981 小时
发表于 2016-3-19 17:35:16 | 显示全部楼层
要考虑分页问题了吧。
回复

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-7-11
在线时间
9 小时
 楼主| 发表于 2016-3-19 23:30:19 来自手机 | 显示全部楼层
TinyBoy 发表于 2016-3-19 17:35
要考虑分页问题了吧。

额,这个怎么分呢,我第一次接触eeprom
回复

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-7-11
在线时间
9 小时
 楼主| 发表于 2016-3-20 15:22:05 来自手机 | 显示全部楼层
TinyBoy 发表于 2016-3-20 12:00
试试看,应该没问题,你的04好像页大小是16字节吧。

非常感谢,我在外面,晚上回去试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 17:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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