这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【已OK】软件模拟IIC

共6条 1/1 1 跳转至

【已OK】软件模拟IIC

菜鸟
2008-07-29 17:30:25     打赏
软件模拟IIC,在ACK应答的时候SDA返回1(NG)。
但是IIC通信协议基本满足,就是ACK应答返回NG。
请问问题可能出在哪?
以下是我的程序:
void StartIIC(void)
{
IIC_SCL = 1;
IIC_SDA = 1;
waitus(5);
IIC_SDA = 0;         //开始通信条件建立
waitus(4);     
IIC_SCL = 0;
}

Bool TxData(U8 data)
{
   U8 i;
   for(i = 0; i<8; i++)
   {
       if(data&0x80){
        IIC_SDA = 1;
        waitus(2);
        }
    else{
        IIC_SDA = 0;
        waitus(2); //中间函数调用3us,SCL低电平时间大于4.7us
          }
      IIC_SCL = 1; 
       waitus(2);
       IIC_SCL = 0;
       data<<=1;
     }
    IIC_SDA = 1;    //MCU侧主动拉高
    waitus(2);
   IIC_SCL = 1;
    PD_IIC_SDA = IN; //设为输入管脚
    waitus(4);
    if(IIC_SDA){   //如果为高电平 
     return Error;
    }
   else
   ...... 
}



关键词: 软件     模拟    

菜鸟
2008-07-29 18:04:03     打赏
2楼

IIC的协议好像是规定SDA只能在SCK为'L’的时候改变吧。
如果上述成立的话,你的程序最后有问题:
     ......                                                   <-------- Master设定SDA
      IIC_SCL = 1;                                 <-------- Master将SCK置'H'不允许SDA改变
       waitus(2);                                     <-------- Slave读SDA的电平并移位
       IIC_SCL = 0;                                <-------- Master将SCK置'L',准备改变数据(问题就在这里)如果这时'i'<7是没有问题的,因为下次还是Master发送数据。但是如果此时'i'=7,那么下次就是接受Slave的应答(由Slave发送)。那么SCL一为L,Slave就可以改变数据,但是此时你却在输出H。如果此时你的硬件上没有线与(开漏输出,L电平有效)的话,Slave就会出错。因此当你后面读取SDA的时值可能就不定。
还有一种可能,你用的是那款单片机?有些单片机的引脚方向寄存器是有保护的,比如R8C/25的Port0。需要先打开保护寄存器再修改。
       data<<=1;         
     }
    IIC_SDA = 1;    //MCU侧主动拉高
    waitus(2);
   IIC_SCL = 1;
    PD_IIC_SDA = IN; //设为输入管脚
    waitus(4);
    if(IIC_SDA){   //如果为高电平 
     return Error;
    }
   else
   ...... 


菜鸟
2008-07-29 19:59:29     打赏
3楼

谢谢了。
经过FISHS_NEW_LIFE的指导,IIC通信已经OK。


菜鸟
2008-07-29 20:04:43     打赏
4楼

英文PDF中其实有这么一句话,供大家一起参考:
The master(uP) puts a resistive HIGH level on the SDA line during the acknowledge clock pulse. The peripheral that acknowledges has to pull-down(LOW) the SDA line during the acknowledge clock pulse, so that the SDA line is stable LOW during this clock pulse.

我使用的是R8C 2C的片子。


高工
2013-04-06 12:39:43     打赏
5楼
I2C总线的软件模拟,一定要好好研究下时序,关键在ACK和NACK的实现,注意分清主从

高工
2013-04-06 14:30:52     打赏
6楼
楼主软件实现的协议有问题吧,感觉有点别扭呢

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]