查看: 142|回复: 1

[求助] STM32F030模拟IIC无应答

[复制链接]

1

主题

0

好友

10

积分

白丁

Rank: 1

该用户从未签到

发表于 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

好友

1820

积分

进士

Rank: 5Rank: 5

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

    [LV.8]以坛为家I

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

    使用道具 举报

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

    关闭

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


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

    GMT+8, 2016-12-5 06:21 , Processed in 0.121226 second(s), 9 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部