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;
}