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

[复制链接]
 楼主| kaly_liu 发表于 2013-5-9 14:44 | 显示全部楼层 |阅读模式
我的程序,昨天奇怪的可以写入数据,然后读出来,后来我不知道动了哪了,今天重新编译了程序,烧写下,发现数据无法写入,但是可以读出来··读出来的数据时昨天写进去的······坑爹啊···
可读,说明时序说明的应该没什么问题吧,应该是写的时候可能那里没有注意到,球指点···一下是我的读写程序:

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

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

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


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

  18.    for(i=0;i<no;i++)
  19.    {   
  20.      SendByte(*s);            /*发送数据*/
  21. //########################################################################
  22. //我发现程序可以执行到这里 但是后面就return 0 了·····不知道为什么#############################
  23. //####问题出现在这里啊 这里·····
  24.      if(ack==1)return(0);
  25.      s++;
  26.    }
  27.    Stop_I2c();                /*结束总线*/
  28.    return(1);
  29. }


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

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

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

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

  44.    Start_I2c();                 /*重新启动总线*/
  45.    SendByte(sla+1);
  46.    if(ack==0)return(0);
  47.    for(i=0;i<no-1;i++)
  48.    {   
  49.      *s=RcvByte();               /*发送数据*/
  50.       Ack_I2c(0);                /*发送就答位*/  
  51.      s++;
  52.    }
  53.    *s=RcvByte();
  54.    Ack_I2c(1);                   /*发送非应位*/
  55.    Stop_I2c();                   /*结束总线*/
  56.    return(1);
  57. }
我主函数是这样调用的:

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

  5. printu("read :");
  6. printu(&temp[0]);//这是串口输出数据
  7. 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 来自手机 | 显示全部楼层
到网上复制一个
 楼主| kaly_liu 发表于 2013-5-10 08:30 | 显示全部楼层
mmuuss586 发表于 2013-5-9 21:57
到网上复制一个

我就是参考网上的,和我的这个一样情况·····:dizzy:
 楼主| kaly_liu 发表于 2013-5-10 08:33 | 显示全部楼层
我用的是STC12LE5A60S2 单片机,33M晶振·机器周期应该是0.36us·我将那些nop啊什么的,都换成延时了,差不多都是7um左右·····我也试过短短的延时,但是结果都一样的额······
mmuuss586 发表于 2013-5-10 08:50 | 显示全部楼层
kaly_liu 发表于 2013-5-10 08:33
我用的是STC12LE5A60S2 单片机,33M晶振·机器周期应该是0.36us·我将那些nop啊什么的,都换成延时了,差不 ...

1、再换1片或重新焊块板子,先判断程序有没有问题;
2、还不行,再仔细分析程序。还要看IIC协议,甚至用示波器
 楼主| kaly_liu 发表于 2013-5-10 11:13 | 显示全部楼层
tyw 发表于 2013-5-9 15:04
估计时间没掐准,对于异步通讯,读,写触发时刻要置于数据段的中间部位,才不会失步.你检查一下.
其次,写入延时 ...

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


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

我参考一些代码发现:
如1的代码,网上有流传;
如2的代码,我买的单片机开发板上配给24c02的代码有···
好像这两种情况相互矛盾啊·····什么情况·····
 楼主| kaly_liu 发表于 2013-5-10 11:14 | 显示全部楼层
bmbm546 发表于 2013-5-10 09:57
加示波器看看波形呗

求高人,看看我9#的问题啊:)
 楼主| kaly_liu 发表于 2013-5-10 11:15 | 显示全部楼层
mmuuss586 发表于 2013-5-10 08:50
1、再换1片或重新焊块板子,先判断程序有没有问题;
2、还不行,再仔细分析程序。还要看IIC协议,甚至用 ...

我找到一些问题了,但是好像很奇怪····看看我9#的问题啊、
 楼主| kaly_liu 发表于 2013-5-10 11:26 | 显示全部楼层
多谢各位的相助啊,问题解决了。O(∩_∩)O
上面的代码是 如1 才是正确的,我代码照 如1 的时候进行测试,我读写之间加入一段延时,就可以正常的读写了、原先是因为我先写入数据,然后直接读出数据,这样有点错,然后我在写入数据后,加一段延时,再读出数据,就可以正常显示了····
O(∩_∩)O 谢谢了~~~
ghkt2000 发表于 2013-5-10 12:35 | 显示全部楼层
tyw 发表于 2013-5-10 12:40 | 显示全部楼层
还没吃完就想拉,当然拉不出,哈哈,恭喜凯丽小借获得成功
tyw 发表于 2013-5-10 12:41 | 显示全部楼层
晕,肖~姐也禁了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

344

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

23

主题

344

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部