EEPROM读数据到数组出现的问题

2019-08-22 14:45发布

EEPROM用的是24C128,写用的跨页写的函数(之前的论坛版主分享的),读数据到数组的时候出现很奇怪的问题,比如我读10个字节数据到数组,读完之后数组第10个之后的元素会出现个别不为0的值,ReadBuf[13]=0x02;ReadBuf[15]=0x28;这两个元素不为0 watch1.png

下面是代码:
void EEPROM_Init(void)
{
        u8 WriteBuf[20]="root,12345678";
        u8 len;
        u8 ReadBuf[20];
        len=strlen((const char*)WriteBuf);       
        AT24CXX_PageWrite(0x0000,WriteBuf,len);//                默认写在第0页上
        AT24CXX_Read(0x0000,ReadBuf,len);//
}




/*********************************************************************
写数据,考虑跨页问题,只需要关心写入起始地址即可
返回:0,操作失败,1操作成功
*********************************************************************/
u8 AT24CXX_PageWrite(u16 WriteAddr, u8 *buf, u16 Len)
{
        u8 wr_page,wr_offset,x;
        wr_offset=I2C_PageSize-WriteAddr%I2C_PageSize;//起始地址所在的页还可以写入数据的个数
        if(Len>wr_offset)//需要跨页写,如果wr_offset为I2C_PageSize,刚好是一个页的开始
        {
                x=AT24CXX_Write(WriteAddr, buf, wr_offset);//x=0,操作IIC失败,下面操作没必要了
                if(x)
                {
                        Len-=wr_offset;buf+=wr_offset;WriteAddr+=wr_offset;//重新定位
                        wr_page=Len/I2C_PageSize;//重新计算要写入的页数量
                        wr_offset=Len%I2C_PageSize;//重新计算页偏移量?
                        while(wr_page)//写入整页数据
                        {
                                AT24CXX_Write(WriteAddr, buf, I2C_PageSize);
                                buf+=I2C_PageSize;
                                WriteAddr+=I2C_PageSize;
                                wr_page--;

                        }
                        if(wr_offset)//不够一页的数据
                        {
                                AT24CXX_Write(WriteAddr, buf, wr_offset);
                        }

                }

        }
        else//可以在当前起始地址所在的页写入
        {
                x=AT24CXX_Write(WriteAddr, buf, Len);
        }
        return x;   
}


//在AT24CXX里面的指定地址开始读出指定个数的数据
u8 AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
        while(NumToRead)
        {
                *(pBuffer++)=AT24CXX_ReadOneByte(ReadAddr++);       
                NumToRead--;
        }
        return 1;
}  

//在AT24CXX里面的指定地址开始写入指定个数的数据
u8 AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
        while(NumToWrite--)
        {
                AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
                WriteAddr++;
                pBuffer++;
        }
        return 1;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
马勇
1楼-- · 2019-08-22 14:52
补上程序运行到断点的图片
mygod
2楼-- · 2019-08-22 15:28
u8 ReadBuf[20]={0};
现在可以好了:
马勇
3楼-- · 2019-08-22 18:39
感觉不是写的问题,我用下面代码读的时候:
        ReadBuf[15]=AT24CXX_ReadOneByte(0x000c);  //这里测试写函数是否多写了
        ReadBuf[16]=AT24CXX_ReadOneByte(0x000d);       
        ReadBuf[17]=AT24CXX_ReadOneByte(0x000e);       
        ReadBuf[18]=AT24CXX_ReadOneByte(0x000f);       
马勇
4楼-- · 2019-08-22 21:53
本帖最后由 马勇 于 2017-4-9 10:29 编辑

#define EE_TYPE AT24C128  //   这里已经修改了
//在AT24CXX指定地址读出一个数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                 
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);//发送高地址         
             //IIC_Wait_Ack();
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据         

        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);           //进入接收模式                           
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//产生一个停止条件            
        return temp;
}
正点原子
5楼-- · 2019-08-22 22:07
 精彩回答 2  元偷偷看……

一周热门 更多>