打印

下面两种查询24C02应答信号的方式为什么效果不一样呢??

[复制链接]
3029|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mailsuxq|  楼主 | 2008-4-24 15:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我写的两个查询24C02应答信号的程序:
/***************查询应答信号方案1*************/
uchar chk_ask(void)  
{
  SDA=1;   //释放数据线  
  SCL=1;   //使SDA上数据有效,并读取
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  if (SDA==0)   
     return 1;
  else   
    return 0;  
  SCL=0;  
}
上面的这段程序我看了一下keil生成的汇编代码,没有发现什么异常,但是我调用这个程序
后无法实现正常功能,读出的数据是乱码。
/***************查询应答信号方案2*************/
bit chk_ask(void)  
{
  bit ask_date; 
  SDA=1;   //释放数据线  
  SCL=1;   //使SDA上数据有效,并读取
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  ask_date=SDA;
  SCL=0;
  return ask_date;  
}
用这个程序就能实现正常功能,哪位大虾帮我分析一下第一个程序为什么不行啊?


相关帖子

沙发
jimoom| | 2008-4-24 15:56 | 只看该作者

1方案SCL线未释放就返回了。

1方案
SCL线未释放就返回了。

使用特权

评论回复
板凳
ayb_ice| | 2008-4-24 18:48 | 只看该作者

另外返回值是相反的

使用特权

评论回复
地板
shell3328| | 2008-5-5 00:18 | 只看该作者

00

第一段程序只是查循是否有应答信号的,并没有读数据就直接返回了;而第二段程序没有查询应答信号就直接读数据,并返回数据

使用特权

评论回复
5
hotpower| | 2008-5-5 00:26 | 只看该作者

哈哈~~~必须暂存ACK信号,这样时序才能继续且完整~~~

ask_date=SDA;
  SCL=0



HRESULT CVIFUNC I2C_GetAck(void)
{
    HRESULT __result = S_FALSE;
    int i;
    for (i = 0; i < I2C_waitAckDelay; i ++)
    {
        if (I2C_GetSDA() == 0) //释放数据总线读数据总线
        {
            __result = S_OK;
            break;
        }
    }
    I2C_SetSCL();//拉高时钟
    I2C_ClrSCL();//拉低时钟
    I2C_ClrSDA();//保证SDA=SCL=0
    return __result;//SDA=1,SCL=0
}

相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=8532&page=2

使用特权

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

本版积分规则

4

主题

11

帖子

0

粉丝