Estoy usando un STM32F415RGT6 incrustado en el tablero 1Bitsy. Quiero configurar el Periférico I2C para leer algunos datos de un sensor. Estoy usando la biblioteca de periféricos estándar stm32f4.
Mi código de ejemplo:
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));
Después de eso quiero escribir un 0x00, pero el código siempre se cuelga en la última línea, aparentemente el Maestro nunca lee el acuse de recibo. Los registros de estado de I2C siempre leen:
I2C1 - > SR1 = 1024
I2C1 - > SR2 = 3
lo que significa que el bit de error de reconocimiento siempre se establece. Si lo analizo usando mi Saleae obtengo lo siguiente:
ElesclavoenvíaelACK,peroelSTM32F415nopuedeleerlo.
Loextraño:siintentoelmismocódigoenmiF407-Disco(soloconelrelojconfiguradoen400kHz,peroeselmismocomportamientoenambasMCUindependientementedelavelocidad),funcionaperfectamente:
Todos los demás periféricos funcionan bien. Ya probé varias soluciones alternativas, pero el bit AF siempre se establece, independientemente del método. Espero que me puedas ayudar.
P.S: He intentado con y sin detonaciones adicionales y la dirección de esclavo I2C está bien, porque funciona con STM32F0, STM32F4-DISCO y Atmel Mcus.
Saludos cordiales y gracias de antemano!