野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12973|回复: 2

STM32F030模拟IIC无应答

[复制链接]
发表于 2016-11-12 23:51:43 | 显示全部楼层 |阅读模式
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();//ê&#199;0 2&#187;ó|′e
                else
                                Ack();//ê&#199;1 ó|′e
                return receive;
}


//&#195;&#187;óDó|′e&#190;íê&#199;1£&#172;ó|′e&#190;íê&#199;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)        //&#182;à′&#206;·¢&#203;í&#206;Tó|′e£&#172;&#189;áê&#248;
                                {
                                                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);
}
回复

使用道具 举报

发表于 2016-11-13 19:57:58 来自手机 | 显示全部楼层
具体参考我们提供的模拟i2C的历程,要帮你看代码那是不可能的了。
回复 支持 反对

使用道具 举报

发表于 2016-11-16 10:56:19 | 显示全部楼层
对照I2C的时序图研究研究,再就是保持时间看够不够~!
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 20:31 , Processed in 0.030329 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表