我使用的是嵌入在1Bitsy Board中的STM32F415RGT6。我想设置I2C外设,以便从传感器读取一些数据。我正在使用stm32f4标准外设库。我的示例代码:- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- GPIO_InitTypeDef gpioInit;
- GPIO_Structinit(&gpioInit);
- gpioInit.GPIO_Mode = GPIO_Mode_AF;
- gpioInit.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- gpioInit.GPIO_PuPd = GPIO_PuPd_UP;
- gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
- GPIO_Init(GPIOB, &gpioInit);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
- I2C_DeInit(I2C1);
- I2C_InitTypeDef I2C_InitStructure;
- I2C_StructInit(&I2C_InitStructure);
- /* I2C configuration */
- I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
- I2C_InitStructure.I2C_ClockSpeed = 100000;
- I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
- I2C_InitStructure.I2C_OwnAddress1 = 0x01;
- I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
- I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
- I2C_Init(I2C1, &I2C_InitStructure);
- I2C_Cmd(I2C1, ENABLE);
- while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
- /* Generate Start, send the address and wait for ACK */
- I2C_GenerateSTART(I2C1, ENABLE);
- while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
- I2C_Send7bitAddress(I2C1, 0xE0, I2C_Direction_Transmitter);
- while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
复制代码之后我想写一个0x00,但代码总是挂在最后一行,显然Master永远不会读取确认。I2C状态寄存器始终读取:I2C1 - > SR1 = 1024I2C1 - > SR2 = 3这意味着始终设置确认失败位。如果我使用我的Saleae分析它,我会得到以下结果:
从设备发送ACK,但STM32F415无法读取它。奇怪的是:如果我在我的F407上尝试相同的代码 - 迪斯科(只有时钟设置为400khz,但无论速度如何,它在两个MCU上都是相同的行为),它可以完美地工作:
所有其他外围设备工作正常。我已经尝试了几种解决方法,但无论方法如何,AF位始终设置。PS:我尝试过使用和不使用额外的上拉,并且I2C Slave地址很好,因为它适用于STM32F0,STM32F4-DISCO和Atmel Mcus。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>