1、IIC停止信号产生,感觉与IIC时序不一致
代码如下:
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}
2、等待应答信号函数中,将SDA设置为输入,后更改SDA的脚状态,不能够理解。
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
i2c_bus->set_sda(0); //stop:when CLK is high DATA change form low to high
//i2c_bus->delayus(3);
i2c_bus->set_scl(1);
i2c_bus->delayus(3);
i2c_bus->set_sda(1);
i2c_bus->delayus(5);
}[/mw_shl_code]
2、IO口设置为开漏模式,无需切换输入、输出状态,入DS18B20的单总线时序也是,设置为开漏模式![mw_shl_code=c,true]static char i2c_bitops_wait_ack(struct ops_i2c_dev *i2c_bus)
{
char ack = 1;
i2c_bus->set_sda(1);
i2c_bus->delayus(3);
i2c_bus->set_scl(1);
i2c_bus->delayus(3);
ack = i2c_bus->get_sda();
i2c_bus->set_scl(0);
return ack;
}[/mw_shl_code]
一周热门 更多>