新手可能提出的问题有点弱智,但是就是搞不明白,求大神不吝赐教,拜谢!问题如下
//这是原子的程序
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入 //问题1 此处将GPIO口设置为输入模式,但下一局IIC_SDA=1,却明明是输出语句,这两句不矛盾吗?
IIC_SDA=1;delay_us(1); //问题2 在i2c时序图中可以看到,从机的应答信号应该在第九个时钟脉冲的低电平器件,将SDA拉低,并且在SCL高电平期间保持稳定
IIC_SCL=1;delay_us(1); // 低电平才是一个完整的应答线号,可是程序里直接将SCL拉高,之后在检测SDA有没有被从机拉低,这样超时检测处理不就没意思 while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
//产生ACK应答
这是网上关于应答信号的概述
I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。 
|