STM32F415 extraño comportamiento I2C

4

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!

    
pregunta Dustin Lehmann

1 respuesta

2

gracias por todas las sugerencias. Encontré la solución y es un poco raro. Funciona correctamente en ambas placas, pero en el STM32F415 no funciona con el analizador lógico que captura los datos. En el F407 no importa. Es una especie de bichito, no sucede si no miro, pero tuve que mirar para saber si está funcionando.

    
respondido por el Dustin Lehmann

Lea otras preguntas en las etiquetas