EEPROM用的是24C128,写用的跨页写的函数(之前的论坛版主分享的
),读数据到数组的时候出现很奇怪的问题,比如我读10个字节数据到数组,读完之后数组第10个之后的元素会出现个别不为0的值,ReadBuf[13]=0x02;ReadBuf[15]=0x28;这两个元素不为0
下面是代码:
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;
}
#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;
}
一周热门 更多>