STM32F415的I2C行为不正常

2019-07-14 17:44发布

我使用的是嵌入在1Bitsy Board中的STM32F415RGT6。我想设置I2C外设,以便从传感器读取一些数据。我正在使用stm32f4标准外设库。我的示例代码:
  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  2. GPIO_InitTypeDef gpioInit;

  3. GPIO_Structinit(&gpioInit);

  4. gpioInit.GPIO_Mode = GPIO_Mode_AF;

  5. gpioInit.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

  6. gpioInit.GPIO_PuPd = GPIO_PuPd_UP;

  7. gpioInit.GPIO_Speed = GPIO_Speed_25MHz;

  8. GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);

  9. GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

  10. GPIO_Init(GPIOB, &gpioInit);

  11. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  12. I2C_DeInit(I2C1);

  13. I2C_InitTypeDef I2C_InitStructure;

  14. I2C_StructInit(&I2C_InitStructure);


  15. /* I2C configuration */

  16. I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

  17. I2C_InitStructure.I2C_ClockSpeed = 100000;

  18. I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

  19. I2C_InitStructure.I2C_OwnAddress1 = 0x01;

  20. I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

  21. I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

  22. I2C_Init(I2C1, &I2C_InitStructure);

  23. I2C_Cmd(I2C1, ENABLE);


  24. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));


  25. /* Generate Start, send the address and wait for ACK */

  26. I2C_GenerateSTART(I2C1, ENABLE);

  27. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

  28. I2C_Send7bitAddress(I2C1, 0xE0, I2C_Direction_Transmitter);


  29. while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
复制代码
之后我想写一个0x00,但代码总是挂在最后一行,显然Master永远不会读取确认。I2C状态寄存器始终读取:I2C1 - > SR1 = 1024I2C1 - > SR2 = 3这意味着始终设置确认失败位。如果我使用我的Saleae分析它,我会得到以下结果: 1.png 从设备发送ACK,但STM32F415无法读取它。奇怪的是:如果我在我的F407上尝试相同的代码 - 迪斯科(只有时钟设置为400khz,但无论速度如何,它在两个MCU上都是相同的行为),它可以完美地工作: 2.png 所有其他外围设备工作正常。我已经尝试了几种解决方法,但无论方法如何,AF位始终设置。PS:我尝试过使用和不使用额外的上拉,并且I2C Slave地址很好,因为它适用于STM32F0,STM32F4-DISCO和Atmel Mcus。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。