打印

求高手解答I2C应答问题

[复制链接]
1671|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hyw1109|  楼主 | 2011-11-9 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void  SendByte(unsigned char  c)
{
unsigned char  BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
    {
     if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
       else  SDA=0;               
     _Nop();
     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
      _Nop();
      _Nop();             /*保证时钟高电平周期大于4μs*/
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }
   
    _Nop();
    _Nop();
    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        /*判断是否接收到应答信号*/
    SCL=0;
    _Nop();
    _Nop();
}

bit ISendByte(unsigned char sla,unsigned char c)
{
   Start_I2c();              //启动总线
   SendByte(sla);            //发送器件地址
   if(ack==0)return(0);
   SendByte(c);              //发送数据
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);
}

这个发送字节函数在使用时,会返回0或者1(return(0);),1就是非应答信号,0就是应答信号。我想知道返回的值0或者1,在主程序中这个值给谁,是给sda么,还是一种写程序的习惯,跪求高手解答!!!

相关帖子

沙发
ayb_ice| | 2011-11-9 16:03 | 只看该作者
本帖最后由 ayb_ice 于 2011-11-9 16:05 编辑

这个返回值需要程序员来处理

bit r;
r = ISendByte(...)
if(r)
{
   error();
   .....
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hyw1109 + 1
板凳
hotpower| | 2011-11-9 16:07 | 只看该作者
肯定从SDA上得到呀,应答信号是从机或主机给出。主机发送数据,从机应答,反之从机发送数据,即主机接收数据当然要主机主动应答了。应答是一种校验机制。

使用特权

评论回复
地板
Ryanhsiung| | 2011-11-9 19:12 | 只看该作者
这个RETURN 只是返回执行状态,返回给调用他的函数

使用特权

评论回复
5
Mayday| | 2011-11-9 20:45 | 只看该作者
应答信号怎么还又返回啊,,,……那看你程序怎么设计吧,,最好把主函数也拿出来看看

使用特权

评论回复
6
hotpower| | 2011-11-9 23:32 | 只看该作者
俺做IIC从来未有败绩。

使用特权

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

本版积分规则

0

主题

1

帖子

1

粉丝