1回答

1收藏

STM32F030模拟IIC无应答

STMCU STMCU 3464 人阅读 | 1 人回复 | 2016-11-12

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);
}
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

啸风6636

发表于 2016-11-14 10:43:49 | 只看该作者

最好的方法,示波器抓波形进行分析,直观明了
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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