C51读写AT24512问题求教
时间:10-02
整理:3721RD
点击:
用单片机连续写数据组,然后再读出来后发现有一些数据不对,都是FF。好像是跨页读写出了问题。求指教!/********************************************************************
向iic设备写入N个字节
说明:write_data,写入字节的数组
Address,从address处开始写入
n,写入的字节数
***********************************************************************/
void AT24C512_W(uchar d[], uint address, uchar num)
{
uchar i;
iic_start();
iic_send_byte(0xa0); //器件地址
iic_wait_ack();
iic_send_byte(address/256); //传高8位地址
iic_wait_ack();
iic_send_byte(address%256); //传低8位地址
iic_wait_ack();
for(i=0; i<num; i++)
{
iic_send_byte(d[i]);
iic_wait_ack();
address++;
if(address%256==0)
{
iic_stop();
delay_24c(4);
iic_start();
iic_send_byte(0xa0); //器件地址
iic_wait_ack();
iic_send_byte(address/256); //传高8位地址
iic_wait_ack();
iic_send_byte(address%256); //传低8位地址
iic_wait_ack();
iic_delay();
}
// iicdizhi=address;
}
iic_stop();
delay_24c(4);
}
/********************************************************************
从iic设备读取N个字节
说明:read_data ,存放字节的数组 ;
address,指定从address处开始读取
num,读取的字节数
***********************************************************************/
void AT24C512_R(uchar r[] , uint address, uchar n)
{
uchar i;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (i=0; i<n; i++)
{
r[i] = iic_receive_byte();
if (i <(n - 1))
{
ack();
}
//iic_wait_ack();
// address++;
// if(address%256==0)
// {
// iic_stop();
// delay_24c(4);
//
// iic_start();
// iic_send_byte(0xa0); //器件地址
// iic_wait_ack();
// iic_send_byte(address/256); //传高8位地址
// iic_wait_ack();
// iic_send_byte(address%256); //传低8位地址
// iic_wait_ack();
// iic_delay();
// }
}
iic_noack();
iic_stop();
}
向iic设备写入N个字节
说明:write_data,写入字节的数组
Address,从address处开始写入
n,写入的字节数
***********************************************************************/
void AT24C512_W(uchar d[], uint address, uchar num)
{
uchar i;
iic_start();
iic_send_byte(0xa0); //器件地址
iic_wait_ack();
iic_send_byte(address/256); //传高8位地址
iic_wait_ack();
iic_send_byte(address%256); //传低8位地址
iic_wait_ack();
for(i=0; i<num; i++)
{
iic_send_byte(d[i]);
iic_wait_ack();
address++;
if(address%256==0)
{
iic_stop();
delay_24c(4);
iic_start();
iic_send_byte(0xa0); //器件地址
iic_wait_ack();
iic_send_byte(address/256); //传高8位地址
iic_wait_ack();
iic_send_byte(address%256); //传低8位地址
iic_wait_ack();
iic_delay();
}
// iicdizhi=address;
}
iic_stop();
delay_24c(4);
}
/********************************************************************
从iic设备读取N个字节
说明:read_data ,存放字节的数组 ;
address,指定从address处开始读取
num,读取的字节数
***********************************************************************/
void AT24C512_R(uchar r[] , uint address, uchar n)
{
uchar i;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address>>8);
iic_wait_ack();
iic_send_byte(address & 0xff);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (i=0; i<n; i++)
{
r[i] = iic_receive_byte();
if (i <(n - 1))
{
ack();
}
//iic_wait_ack();
// address++;
// if(address%256==0)
// {
// iic_stop();
// delay_24c(4);
//
// iic_start();
// iic_send_byte(0xa0); //器件地址
// iic_wait_ack();
// iic_send_byte(address/256); //传高8位地址
// iic_wait_ack();
// iic_send_byte(address%256); //传低8位地址
// iic_wait_ack();
// iic_delay();
// }
}
iic_noack();
iic_stop();
}
如果你认为是跨页出现问题,那么你可以写少于一页的数据再读出来看看,既然你自己有了想法,就要去验证
读写的时候地址是不是不对呢,以2为步进