查看: 450|回复: 1

[求助] STM32F030模拟IIC无应答

[复制链接]

2

主题

0

好友

30

积分

白丁

Rank: 1

  • TA的每日心情
    奋斗
    2017-4-1 19:01
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-11-12 23:47:24 |显示全部楼层
    STM32F030模拟IIC无应答,都设置为开漏了,而且外部有上拉电阻,不知道问题出现在哪?




    void GPIO_init(void)
    {
                    GPIO_InitTypeDef GPIO_InitStruct;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
            
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;   
        GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        GPIO_Init(GPIOB, &GPIO_InitStruct);

        GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
                    SMBus_Stop() ;
    }

    void I2C_CLK(u8 mode)
    {
        if(mode == 1)
            GPIO_SetBits(GPIOB,GPIO_Pin_10);
        else
            GPIO_ResetBits(GPIOB,GPIO_Pin_10);
    }

    void I2C_SDA(u8 mode)
    {
        if(mode == 1)
            GPIO_SetBits(GPIOB,GPIO_Pin_11);
        else
            GPIO_ResetBits(GPIOB,GPIO_Pin_11);
    }

    unsigned char READ_I2C_SDA(void)
    {
        return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
    }

    void SMBus_Start(void)
    {
                    I2C_SDA(1) ;        //SMBus_SDA=1;
                    I2C_CLK(1) ;        //SMBus_SCL=1;
                    delay_us(4);
                    I2C_SDA(0)        ;        //SMBus_SDA=0;
                    delay_us(4);
                    I2C_CLK(0) ;        //SMBus_SCL=0;ÇˉסI2C×üÏß,×¼±¸·¢Ëí»ò½óêÕêy¾Y
                    delay_us(4);
    }

    void SMBus_Stop(void)
    {
                    I2C_SDA(0) ;
                    I2C_CLK(1) ;
                    delay_us(4) ;
                    I2C_SDA(1) ;
    }

    void SMBus_Send(u8 dat)
    {
                    u8 i;

                    for(i=0;i<8;i++)
                    {
                                    if(dat&0x80)        
                                                    I2C_SDA(1) ;
                                    else
                                                    I2C_SDA(0) ;
                                    
                                    delay_us(2);
                                    I2C_CLK(1) ;        //SMBus_SCL=1;
                                    delay_us(2);
                                    I2C_CLK(0) ;        //SMBus_SCL=0;

                                    if(i == 7)
                                                    I2C_SDA(1) ;
                                    dat        <<= 1;
                                    delay_us(2);
                    }
    }

    u8 SMBus_Read(u8 ack)
    {
                    u8 receive=0;
                    u8 k;

                    for(k=0;k<8;k++)
                    {
                                    receive<<=1;
                                    I2C_CLK(1)        ;        //SMBus_SCL=1;
                                    delay_us(2);
                                    if(READ_I2C_SDA)
                                                    receive++;
                                    I2C_CLK(0) ;        //SMBus_SCL=0;
                                    delay_us(2);
                    }
                    if(!ack)
                                    NAck();//êÇ0 2»ó|′e
                    else
                                    Ack();//êÇ1 ó|′e
                    return receive;
    }


    //ûóDó|′e¾íêÇ1£¬ó|′e¾íêÇ0
    u8 Wait_Ack(void)
    {
                    u8 times=0;
                   
                    I2C_SDA(1)        ;        //SMBus_SDA=1;
                    delay_us(2);
                    I2C_CLK(1) ;        //SMBus_SCL=1;
                    delay_us(2);
                    I2C_SDA(0) ;
                    while(READ_I2C_SDA)        //while(READ_SDA)
                    {
                                    times++;
                                    if(times>20)        //¶à′η¢ËíÎTó|′e£¬½áêø
                                    {
                                                    SMBus_Stop();
                                                    return 1;
                                    }
    //                                USART_SendData(USART1,0x67) ;
                    }
                    I2C_CLK(0) ;        //SMBus_SCL=0;
                    delay_us(2);
                    return 0;
    }

    void Ack(void)
    {
                    I2C_SDA(0)        ;        //SMBus_SDA=0;
                    delay_us(2);
                    I2C_CLK(1) ;        //SMBus_SCL=0;
                    delay_us(2);
                    I2C_CLK(0) ;        //SMBus_SCL=1;
                    delay_us(2);
                    I2C_SDA(1)        ;
    }

    void NAck(void)
    {
                    I2C_SDA(1)        ;        //SMBus_SDA=1;
                    delay_us(2);
                    I2C_CLK(1) ;        //SMBus_SCL=0;
                    delay_us(2);
                    I2C_CLK(0) ;        //SMBus_SCL=1;
                    delay_us(2);
    }
    回复

    使用道具 举报

    8

    主题

    0

    好友

    1827

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    2016-11-14 10:54
  • 签到天数: 266 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-11-14 10:43:49 |显示全部楼层
    最好的方法,示波器抓波形进行分析,直观明了
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-6-29 03:22 , Processed in 0.108516 second(s), 9 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部