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;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。