0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

AT24C256 可读 偶尔可写······

我的程序,昨天奇怪的可以写入数据,然后读出来,后来我不知道动了哪了,今天重新编译了程序,烧写下,发现数据无法写入,但是可以读出来··读出来的数据时昨天写进去的······坑爹啊···
可读,说明时序说明的应该没什么问题吧,应该是写的时候可能那里没有注意到,球指点···一下是我的读写程序:

extern unsigned char enumer;
bit ISendStr(unsigned char  sla,unsigned int suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;
   Start_I2c();               /*启动总线*/
   SendByte(sla);             /*发送器件地址*/
  if(ack==0)return(0);         //

   if(AT24C256 == AT24C256)
        {
        SendByte((unsigned char)(suba >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址
    if(ack==0) return(0);
        senddd('X');          
        }
   SendByte((unsigned char)suba);            /*发送器件子地址*/
   if(ack==0)return(0);

   Start_I2c();                 /*重新启动总线*/


   if(ack==0)return(0);

   for(i=0;i    {   
     SendByte(*s);            /*发送数据*/
//########################################################################
//我发现程序可以执行到这里 但是后面就return 0 了·····不知道为什么#############################
//####问题出现在这里啊 这里·····
     if(ack==1)return(0);
     s++;
   }
   Stop_I2c();                /*结束总线*/
   return(1);
}


bit IRcvStr(unsigned char  sla,unsigned int suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;

   Start_I2c();                  /*启动总线*/
   SendByte(sla);                /*发送器件地址*/
   if(ack==0)return(0);

   if(AT24C256 == AT24C256)
   {
          
    SendByte((unsigned char)(suba >> 8));//把整型数据转换为字符型数据:弃高取低,只取低8位.如果容量大于32K位,使用16位地址寻址,写入高八位地址
    if(ack==0) return(0);
   }

   SendByte((unsigned char)suba);               /*发送器件子地址*/
   if(ack==0)return(0);

   Start_I2c();                 /*重新启动总线*/
   SendByte(sla+1);
   if(ack==0)return(0);
   for(i=0;i    {   
     *s=RcvByte();               /*发送数据*/
      Ack_I2c(0);                /*发送就答位*/  
     s++;
   }
   *s=RcvByte();
   Ack_I2c(1);                   /*发送非应位*/
   Stop_I2c();                   /*结束总线*/
   return(1);
}
复制代码我主函数是这样调用的:

unsigned char temp[10]="xyzxyzxyz";//我上次是abcdefg,写入成功了···今天不行了··
ISendStr(AT24C256,addr,&temp[0],8) ;//写EEPROM
memset(&temp[0],0,8);
IRcvStr(AT24C256,addr,&temp[0],8);         //读EEPROM

printu("read :");
printu(&temp[0]);//这是串口输出数据
printu("\r\n");
复制代码求高人指点啊~~~~~~~~~~~~~奇怪的是 我昨天还可以写入,读出,正常;今天又弄了下就不可以了····写不进去,但是可以读出来,读出来的是昨天写进去的内容········
提问者:尼克wo 地点:- 浏览次数:1171 提问时间:07-01 15:24
我有更好的答案
提 交
7条回答
vyywywew 07-05 09:01


估计时间没掐准,对于异步通讯,读,写触发时刻要置于数据段的中间部位,才不会失步.你检查一下.
其次,写入延时足够了吗,调大一点试.
60user106 07-06 19:22
到网上复制一个
qi12345 07-10 06:59
我用的是STC12LE5A60S2 单片机,33M晶振·机器周期应该是0.36us·我将那些nop啊什么的,都换成延时了,差不多都是7um左右·····我也试过短短的延时,但是结果都一样的额······
fulai671 07-10 08:38
加示波器看看波形呗
阿兵888824 07-02 11:24
多谢各位的相助啊,问题解决了。O(∩_∩)O
上面的代码是 如1 才是正确的,我代码照 如1 的时候进行测试,我读写之间加入一段延时,就可以正常的读写了、原先是因为我先写入数据,然后直接读出数据,这样有点错,然后我在写入数据后,加一段延时,再读出数据,就可以正常显示了····
O(∩_∩)O 谢谢了~~~
60user8 07-10 13:54
还没吃完就想拉,当然拉不出,哈哈,恭喜凯丽小借获得成功
qwer30 07-07 09:53
晕,肖~姐也禁了
撰写答案
提 交
1 / 3
1 / 3