Problema para hacer que la comunicación I2C de placa a placa funcione en STM32

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);
¿Cómo se conectan las placas entre sí? I2C no está realmente diseñado para pasar por cables.
Uso de cables. En realidad, el cable mide unos 20 cm de largo. ¿Es eso un problema?
Muy probable. Esos cables están agregando mucha capacitancia a las líneas. Intente usar un cable corto para ver si hace la diferencia.
OK gracias. Lo haré.

Respuestas (1)

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.