战舰例程STM32f103模拟IIC问题

2019-08-13 20:06发布

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;  
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
Acuity
2019-08-14 20:47
1、第一点没看出时序哪里不一致?[mw_shl_code=c,true]static void i2c_bitops_stop(struct ops_i2c_dev *i2c_bus)
{
                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]

一周热门 更多>