打印

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

[复制链接]
4035|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);
试一下,我估计是可以正常执行的。

使用特权

评论回复
5
deng_1976|  楼主 | 2007-12-3 09:49 | 只看该作者

执行过了

dld2:执行过了,一到SendByte(*s)的时候,返回ACK就为0了,在程序里我是直接调用的。

使用特权

评论回复
6
ayb_ice| | 2007-12-3 09:53 | 只看该作者

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

使用特权

评论回复
7
dld2| | 2007-12-3 10:00 | 只看该作者

怪!楼主用反汇编看看吧

跟踪一下uchar *s的访问。

使用特权

评论回复
8
deng_1976|  楼主 | 2007-12-3 10:07 | 只看该作者

以前

以前用过带I2C的MCU,用写多个字节的函数执行单个字节写没问题的。现在模拟I2C口写单个有问题,数据是发送到了24C32,要等它回应的SDA为0,ACK才为1。写2个字节也是一个一个发送,再一个一个的回应ACK的。

使用特权

评论回复
9
deng_1976|  楼主 | 2007-12-3 20:13 | 只看该作者

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

要写入的数据我定义的是pdata数据,如果删除PDATA,就OK了,怎么这个也有影响的,有谁遇到过么?不知道哪个地方我还没弄清楚

使用特权

评论回复
10
e21| | 2007-12-3 21:01 | 只看该作者

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

使用特权

评论回复
11
deng_1976|  楼主 | 2007-12-3 21:16 | 只看该作者

片内的XDATA已经使能了。

使用特权

评论回复
12
ayb_ice| | 2007-12-4 09:36 | 只看该作者

程序有问题

使用特权

评论回复
13
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);

这样来操作~~~

使用特权

评论回复
14
deng_1976|  楼主 | 2007-12-4 09:49 | 只看该作者

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

LS的兄弟,延时我是用过的。没办法,我只好把PDATA数据先转换成DATA数据再写入EE了。

使用特权

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

本版积分规则

7

主题

45

帖子

0

粉丝