C51读写AT24512问题求教

2019-07-15 15:15发布

单片机连续写数据组,然后再读出来后发现有一些数据不对,都是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();  
}

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