软件模拟IIC需要注意的问题

iic 总结:
1、从主ic的gpio口出来的电压要确定是高电压,也就是开始模拟iic之前,要把gpio口电压置1
2、在等待ACK的函数里,在置SDA为输入前,可以把SDA置为高输出,然后再置SDA为输入,
      这样可以明显看出ACK(要是有ACK来的时候),确认有ACK之后再把这多余的置SDA为高输出的注释掉。
3、至于延时处理,不是适用于所有的IC的,很多网上的例程代码都有做延时处理,但如果你用的主IC处理慢话没必要
      加延时处理,这样反而加慢处理速度。
4、模拟IIC传送的数据很慢,远远比硬件IIC慢很多,能用硬件IIC就不要用GPIO口来软件模拟。在要求频繁写从IC的
      功能应用上,模拟IIC跟不上速度。

 

从上面两张图,你可以看出来收到ACK的回应吗?看不出来吧,其实上面的图中有ACK应答,只是很难看出来,那有什么办法可以看得比较明显呢?有的:

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
U8 I2C_Wait_Ack(void)
{
    U8 bOk;
    U8 ret;
    U8 ucErrTime=0;

    //加上这里,可以明显看出ACK应答波形图
    //SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);
    //SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SDA);

    SDK_GPIO_SetIO(PIN_SET_INPUT, LEVEL_HIGH, PIN_SDA);
    SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_HIGH, PIN_SCL);      

    bOk = TRUE;
    while(bOk)
    {
        ret = SDK_GPIO_GetInputHighLow(PIN_SDA);
        
        if(ret == LEVEL_LOW) {
            bOk = FALSE;   //SDA被垃低说明回复了ACK
        }
        else if(ret == LEVEL_HIGH){
        }        

      ucErrTime++;
      if(ucErrTime>250)
      {
         I2C_Stop();
         return 1;
      }
    }  
    SDK_GPIO_SetIO(PIN_SET_OUTPUT, LEVEL_LOW, PIN_SCL);
    return 0;     
}


版权声明:本文为dearlaoyuan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。