搞了一天的stm32f207芯片库函数的I2C问题终于被解决了

本文只介绍自己所遇到的问题,具体配置的详细网上有很多不罗嗦,欢迎各位网友讨论自己所遇到的问题


1.若程序停留在while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));


     则可能的情况是:I2C的初始化没有配置好,可能缺少引脚复用功能的配置
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);   //这两个的配置必须有,没有则无法输出
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);



经过测试可用的程序如下:

        void i2c_init(void)
   {
    GPIO_InitTypeDef  gpio_config;
    I2C_InitTypeDef  i2c_config;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

    gpio_config.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
gpio_config.GPIO_Mode = GPIO_Mode_AF;
gpio_config.GPIO_Speed = GPIO_Speed_100MHz;
gpio_config.GPIO_OType = GPIO_OType_OD;
gpio_config.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&gpio_config);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);  //这两个的配置必须有,没有则无法输出
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);


i2c_config.I2C_ClockSpeed = 400000;
i2c_config.I2C_Mode = I2C_Mode_I2C;
i2c_config.I2C_DutyCycle = I2C_DutyCycle_2;
i2c_config.I2C_OwnAddress1 = 0x10;       //此处地址可以任意设置,当其作为从机的时候,主机对其的寻找地                                                                                                                                 址为此地址和0xa0相同
i2c_config.I2C_Ack = I2C_Ack_Enable;
i2c_config.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_Init(I2C2,&i2c_config);
    I2C_Cmd(I2C2,ENABLE);
   
   }






2.若程序停留在while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

可能的原因是:主函数中的写数据和读数据之间没有加入延时造成的
             如下: I2C_EE_ByteWrite(&data_w, 0x00);
                                delay_s(2);
                        I2C_EE_BufferRead(&data_r,0x00, 1);


        如下的程序为可实现的程序:

writebyte(&data_w,0X00);

delay_s(2);         //若延迟不加,则接下来的readbyte会有问题
readbyte(&data_r,0x00);

    printf("  data is %x  %x  ",data_w,data_r);
          

 3.还有可能的问题是I2C的硬件连接有问题如没有将  SDA和SCL的信号线接上拉电阻。

     正确的接法电路图如下图所示:
   
      








      

你可能感兴趣的:(嵌入式,stm32)