打印

请教24C256读写问题

[复制链接]
1863|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjleejl|  楼主 | 2007-7-5 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近几天在改写24C256的读写程序,原先的读写函数是每次16字节,改为每次20字节,调了好几天了还有问题,有的时候读写正常有的时候不对,想请教一下大家是不是会跟24C256存储结构有关系,比如不能跨页读写等等。还有这个函数应该是页读写方式吧?
下面的写函数大家帮忙看看有什么问题,先谢谢大家了
uchar RecToEeprom_xdbd(uint rec_num, uchar *write_data)
//rec_num是记录号,每条记录20字节,*write_data是要写入的数据
 {
  uchar i;
  uchar j;

  union {
         uchar addr[2];             //first_addr[0]=higher byte
         uint val1;
        } xdata first;
  uchar xdata cmp_data[20];
  uchar xdata writ_cmd;
  uchar xdata read_cmd;

  EWP=0;                                       //turn off 
  _nop_();
  _nop_();
  _nop_();

  //first.val1=(rec_num<<4);
  first.val1=(rec_num * 20);    //原来是16字节,改为20字节                    
  
  i=paddr;
  i=i*2;           // programmable address to bits 3:1
  i|=faddr;         // add fixed address
  i&=0xfe;         // specify write operation
  writ_cmd=i;
  i|=0x01;
  read_cmd=i;

  for(j=0;j<9;j++)
     {
      iic_start();               //writing section
      iic_shout(writ_cmd);
      iic_shout(first.addr[0]);  //send high byte of address
      iic_shout(first.addr[1]);  //send lower byte of addr

      //for(i=0;i<16;i++)
       for(i=0;i<20;i++)    //原来是16字节,改为20字节
      iic_shout(write_data);
      iic_stop();
      delay_50us(120);

      iic_start();                //reading section
      iic_shout(writ_cmd);
      iic_shout(first.addr[0]);   //send high byte of address
      iic_shout(first.addr[1]);
      iic_stop();                 //???? add temp
      _nop_();_nop_();

      iic_start();                //second start for read
      iic_shout(read_cmd);      //send device address and write command
      /*for(i=0;i<16;i++)
         {
          cmp_data=iic_shin();
          if(i<15)
             iic_ack();
         }*/
      for(i=0;i<20;i++)    //原来是16字节,改为20字节
         {
          cmp_data=iic_shin();//读出校验
          if(i<19)
             iic_ack();
         }
      iic_nak();
      iic_stop();
      //for(i=0;i<16;i++)
    for(i=0;i<20;i++)  //原来是16字节,先改为20字节
         {
          if(write_data!=cmp_data)
             break;
         }
      //if(i==16)         //verifying success
        if(i == 20)      //原来是16字节,改为20字节
         break;
     }
  EWP=1;
  //EX0=1;
  if(j<9)
    return(0);
  else
    return(1);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

13

帖子

0

粉丝