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。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
dsgfa
1楼-- · 2019-07-14 22:58
如果7位从属地址是0xE0你需要将8位地址传递给API I2C_Send7bitAddress(I2C1, uint8_t(0xE0<<1), I2C_Direction_Transmitter);但我猜测它是0x70你已经转移它
niggle
2楼-- · 2019-07-15 04:28
 精彩回答 2  元偷偷看……
ROSE1017
3楼-- · 2019-07-15 05:41
感谢所有的建议。我找到了解决方案,这有点奇怪。它在两块板上都能正常工作,但在STM32F415上,它不能用于捕获数据的逻辑分析仪。在F407上没关系。它是一种heisenbug,如果我不看,它不会发生,但我不得不想知道它是否有效。
nvhyfwe
4楼-- · 2019-07-15 06:01
这可能意味着您的上拉电阻太弱。这是为什么使用示波器查看信号的特性很有用的部分,即使逻辑分析仪更好地解码协议(至少一旦你得到一个非常重要的数据量,挑战速度和用户界面的UI)典型的现代示波器内置I2C解码器)。
Lucia_nie
5楼-- · 2019-07-15 09:48
你的公司买了一个示波器,但没有购买I2C解码器的许可证

一周热门 更多>