打印

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

[复制链接]
2379|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaly_liu|  楼主 | 2013-5-9 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序,昨天奇怪的可以写入数据,然后读出来,后来我不知道动了哪了,今天重新编译了程序,烧写下,发现数据无法写入,但是可以读出来··读出来的数据时昨天写进去的······坑爹啊···
可读,说明时序说明的应该没什么问题吧,应该是写的时候可能那里没有注意到,球指点···一下是我的读写程序:

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<no;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<no-1;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");
求高人指点啊~~~~~~~~~~~~~奇怪的是 我昨天还可以写入,读出,正常;今天又弄了下就不可以了····写不进去,但是可以读出来,读出来的是昨天写进去的内容········

相关帖子

沙发
tyw| | 2013-5-9 15:04 | 只看该作者
本帖最后由 tyw 于 2013-5-9 15:05 编辑

估计时间没掐准,对于异步通讯,读,写触发时刻要置于数据段的中间部位,才不会失步.你检查一下.
其次,写入延时足够了吗,调大一点试.

使用特权

评论回复
板凳
kaly_liu|  楼主 | 2013-5-9 19:35 | 只看该作者
tyw 发表于 2013-5-9 15:04
估计时间没掐准,对于异步通讯,读,写触发时刻要置于数据段的中间部位,才不会失步.你检查一下.
其次,写入延时 ...

恩 我再试试啊····

使用特权

评论回复
地板
mmuuss586| | 2013-5-9 21:57 | 只看该作者
到网上复制一个

使用特权

评论回复
5
kaly_liu|  楼主 | 2013-5-10 08:30 | 只看该作者
mmuuss586 发表于 2013-5-9 21:57
到网上复制一个

我就是参考网上的,和我的这个一样情况·····:dizzy:

使用特权

评论回复
6
kaly_liu|  楼主 | 2013-5-10 08:33 | 只看该作者
我用的是STC12LE5A60S2 单片机,33M晶振·机器周期应该是0.36us·我将那些nop啊什么的,都换成延时了,差不多都是7um左右·····我也试过短短的延时,但是结果都一样的额······

使用特权

评论回复
7
mmuuss586| | 2013-5-10 08:50 | 只看该作者
kaly_liu 发表于 2013-5-10 08:33
我用的是STC12LE5A60S2 单片机,33M晶振·机器周期应该是0.36us·我将那些nop啊什么的,都换成延时了,差不 ...

1、再换1片或重新焊块板子,先判断程序有没有问题;
2、还不行,再仔细分析程序。还要看IIC协议,甚至用示波器

使用特权

评论回复
8
kaly_liu|  楼主 | 2013-5-10 11:13 | 只看该作者
tyw 发表于 2013-5-9 15:04
估计时间没掐准,对于异步通讯,读,写触发时刻要置于数据段的中间部位,才不会失步.你检查一下.
其次,写入延时 ...

望高手再看看啊,我找到一点原因了,非常的奇怪。我在发送函数bit ISendStr(...)里面,把发送数据里的那个for循环改成如1的时候可以写进去,但是读取是空的;然后再把它改回来如2的时候,就可以读到第一次写的内容,但是如2的时候却写不了数据···这个什么情况,两个读 写 函数好像没什么关系啊,这么会有这种情况出现....
如1:
for(i=0;i<no;i++)
   {   
     SendByte(*s++);
     if(ack==1) continue;
   }


如2:
for(i=0;i<no;i++)
   {   
     SendByte(*s++);
     if(ack==1) return(0);
   }

我参考一些代码发现:
如1的代码,网上有流传;
如2的代码,我买的单片机开发板上配给24c02的代码有···
好像这两种情况相互矛盾啊·····什么情况·····

使用特权

评论回复
9
kaly_liu|  楼主 | 2013-5-10 11:14 | 只看该作者
bmbm546 发表于 2013-5-10 09:57
加示波器看看波形呗

求高人,看看我9#的问题啊:)

使用特权

评论回复
10
kaly_liu|  楼主 | 2013-5-10 11:15 | 只看该作者
mmuuss586 发表于 2013-5-10 08:50
1、再换1片或重新焊块板子,先判断程序有没有问题;
2、还不行,再仔细分析程序。还要看IIC协议,甚至用 ...

我找到一些问题了,但是好像很奇怪····看看我9#的问题啊、

使用特权

评论回复
11
kaly_liu|  楼主 | 2013-5-10 11:26 | 只看该作者
多谢各位的相助啊,问题解决了。O(∩_∩)O
上面的代码是 如1 才是正确的,我代码照 如1 的时候进行测试,我读写之间加入一段延时,就可以正常的读写了、原先是因为我先写入数据,然后直接读出数据,这样有点错,然后我在写入数据后,加一段延时,再读出数据,就可以正常显示了····
O(∩_∩)O 谢谢了~~~

使用特权

评论回复
12
ghkt2000| | 2013-5-10 12:35 | 只看该作者

使用特权

评论回复
13
tyw| | 2013-5-10 12:40 | 只看该作者
还没吃完就想拉,当然拉不出,哈哈,恭喜凯丽小借获得成功

使用特权

评论回复
14
tyw| | 2013-5-10 12:41 | 只看该作者
晕,肖~姐也禁了

使用特权

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

本版积分规则

23

主题

344

帖子

3

粉丝