I2C通讯中用写多个字节函数用来写一个字节居然不成功,

[复制链接]
5023|13
 楼主| deng_1976 发表于 2007-12-3 08:51 | 显示全部楼层 |阅读模式
I2C通讯中用写多个字节函数用来写一个字节居然不成功,语句如下:

   ISendStr(0xa0,0x00,0x00,&Tank_Height_new,2);
   ISendStr(0xa0,0x00,0x46,&Unit_Address,1);

   前面的语句单步执行到把实际数据发过去的时候能收到AT24C32返回的ACK,(发送前面器件地址和数据地址都能收到ACK),而后面语句到把实际数据发送过去却收不到ACK(发送的地址都能收到返回ACK)。把一个字节看成多字节发送有区别么?
hotpower 发表于 2007-12-3 08:54 | 显示全部楼层

给个函数定义让谁明白???

 楼主| deng_1976 发表于 2007-12-3 09:30 | 显示全部楼层

这个不是函数定义,是调用函数。

当写入一个字节时,执行到SendByte(*s);if(Ack==0) return(0); 返回的ACK就为0。如果写入的是2个字节,执行到SendByte(*s);if(Ack==0) return(0);返回的ACK就是1。时钟时间我想应该没问题,12M的晶振,SDA和SCL用的是P0口的2个IO脚。

void GetBus()
{
   I2C_SDA=1;          
   nop();
   I2C_SCL=1;          
   nop();              
   nop();
   nop();
   nop();
   nop();
   I2C_SDA=0;          
   nop();              
   nop();
   nop();
   nop();
   nop();
   I2C_SCL=0;          
   nop();
   nop();
}

void SendByte(uchar ch)
{
   uchar bitCnt;
   for(bitCnt=0;bitCnt<8;bitCnt++)
   {
      if((ch<<bitCnt)&0x80) I2C_SDA=1;   
      else I2C_SDA=0;
      nop();
      I2C_SCL=1;           
      nop();
      nop();              
      nop();
      nop();
      nop();

      I2C_SCL=0;
   }
   nop();
   nop();
   I2C_SDA=1;             
   nop();
   nop();
   I2C_SCL=1;
   nop();
   nop();
   nop();
   nop();
   nop();
   if(I2C_SDA==1)Ack=0;    
   else Ack=1;
   I2C_SCL=0;
   nop();
   nop();
}


bit ISendStr(uchar sla, uchar suba1,uchar suba2,uchar *s, uchar no)
{
   uchar i;
   GetBus();            
   SendByte(sla);          
   if(Ack==0) return(0);
   SendByte(suba1);         
   if(Ack==0) return(0);
   SendByte(suba2);
   if(Ack==0) return(0);
   for(i=0;i<no;i++)
   {
      SendByte(*s);             
      if(Ack==0) return(0);
      s++;
   }
   StopBus();                  
   return(1);
}
dld2 发表于 2007-12-3 09:44 | 显示全部楼层

从代码看没有道理会这样

楼主直接用
ISendStr(0xa0,0x00,0x00,&Tank_Height_new,1);
试一下,我估计是可以正常执行的。
 楼主| deng_1976 发表于 2007-12-3 09:49 | 显示全部楼层

执行过了

dld2:执行过了,一到SendByte(*s)的时候,返回ACK就为0了,在程序里我是直接调用的。
ayb_ice 发表于 2007-12-3 09:53 | 显示全部楼层

如果是这样,肯定是程序有问题了

dld2 发表于 2007-12-3 10:00 | 显示全部楼层

怪!楼主用反汇编看看吧

跟踪一下uchar *s的访问。
 楼主| deng_1976 发表于 2007-12-3 10:07 | 显示全部楼层

以前

以前用过带I2C的MCU,用写多个字节的函数执行单个字节写没问题的。现在模拟I2C口写单个有问题,数据是发送到了24C32,要等它回应的SDA为0,ACK才为1。写2个字节也是一个一个发送,再一个一个的回应ACK的。
 楼主| deng_1976 发表于 2007-12-3 20:13 | 显示全部楼层

要写入的数据我定义的是pdata数据,如果删除PDATA,就OK了,

要写入的数据我定义的是pdata数据,如果删除PDATA,就OK了,怎么这个也有影响的,有谁遇到过么?不知道哪个地方我还没弄清楚
e21 发表于 2007-12-3 21:01 | 显示全部楼层

不会是你的MCU片内xdata没使能吧。

 楼主| deng_1976 发表于 2007-12-3 21:16 | 显示全部楼层

片内的XDATA已经使能了。

ayb_ice 发表于 2007-12-4 09:36 | 显示全部楼层

程序有问题

zusen 发表于 2007-12-4 09:43 | 显示全部楼层

就这样看上去没什么问题

但要注意一点
如果
ISendStr(0xa0,0x00,0x00,&Tank_Height_new,2);
   ISendStr(0xa0,0x00,0x46,&Unit_Address,1);

这两个操作是连续的,请
ISendStr(0xa0,0x00,0x00,&Tank_Height_new,2);
延时();
ISendStr(0xa0,0x00,0x46,&Unit_Address,1);

这样来操作~~~
 楼主| deng_1976 发表于 2007-12-4 09:49 | 显示全部楼层

LS的兄弟,延时我是用过的。

LS的兄弟,延时我是用过的。没办法,我只好把PDATA数据先转换成DATA数据再写入EE了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

45

帖子

0

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