Tengo dos placas trabajando en STM32F030R8 y F030C6 respectivamente. He estado tratando de hacer que las placas se comuniquen entre sí mediante I2C, pero hasta ahora no ha funcionado. Una de mis placas funciona a 48MHz y la otra a 20Mhz. He configurado el modo normal I2C con 100Khz y 100ns de tiempo de subida y bajada. He intentado usar tanto DMA como TI. Mientras usaba DMA, mi placa maestra intentaba recibir y transmitir simultáneamente, por lo que la lógica de mi código no funcionaba como se esperaba. Pero luego cambié a interrupciones y pude hacerlo funcionar. Pero el problema es que, después del encendido, comunica solo unos y luego pasa a HAL_I2C_STATE_BUSY. Luego tengo que encender y apagar la placa para que vuelva a funcionar. Incluso restablecer la MCU resultó inútil.
Código de inicio I2C para maestro:
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = I2C_TIMING;//check in .h file
hi2c1.Init.OwnAddress1 = 0x123;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_10BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0xFF;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
para esclavo:
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x00101D2D;//0x00201D2B;
hi2c1.Init.OwnAddress1 = I2C_ADDRESS;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_10BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0xFF;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
Este es el código que transmite:
if(HAL_I2C_GetState(&hi2c1) == HAL_I2C_STATE_READY) {
if(HAL_I2C_Slave_Transmit_IT(&hi2c1, (uint8_t*)aTxBuffer, 10)!= HAL_OK) {
/* Transfer error in reception process */
Error_Handler();
}
}
Y este recibe:
do {
HAL_I2C_Init(&hi2c1);
if(HAL_I2C_Master_Receive_IT(&hi2c1, (uint16_t)I2C_ADD_CHILLER, aRxBuffer, 14)!= HAL_OK) {
Error_Handler();
}
State = HAL_I2C_GetState(&hi2c1) ;
Teor=HAL_I2C_GetError(&hi2c1);
HAL_I2C_DeInit(&hi2c1);
} while(Teor == HAL_I2C_ERROR_AF);
Verifique que tenga resistencias pull-up sensibles en SDA y SCL.
Reducir el valor de estas resistencias puede ser útil para superar la capacitancia y el ruido.
Además, asegúrese de que el 0V esté bien unido entre las placas.
DoxyLover
sixter
DoxyLover
sixter