ST Microelectronics I2C Interrupt HAL Library pregunta

3

Estoy intentando que I2C (con interrupciones) en un F411RE funcione. Me sumergí en el código de la biblioteca HAL y encontré este bit tid ...

static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
{
  /* Declaration of temporary variables to prevent undefined behavior of  volatile usage */
  uint32_t CurrentState = hi2c->State;

  if(hi2c->XferCount != 0U)
  {
    /* Write data to DR */
    hi2c->Instance->DR = (*hi2c->pBuffPtr++);
    hi2c->XferCount--;

    if((hi2c->XferCount == 0U) && (CurrentState ==          HAL_I2C_STATE_BUSY_TX_LISTEN))
    {
      /* Last Byte is received, disable Interrupt */
      __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);

      /* Set state at HAL_I2C_STATE_LISTEN */
      hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
      hi2c->State = HAL_I2C_STATE_LISTEN;

      /* Call the Tx complete callback to inform upper layer of the end of receive process */
      HAL_I2C_SlaveTxCpltCallback(hi2c);
    }
  }
  return HAL_OK;

Estoy un poco confundido. Esperaba ver mientras el bucle pasaba por el recuento de transferencias. En cambio, es si las declaraciones. Entonces, mi pregunta es, ¿estoy entendiendo esto correctamente? La forma en que HAL trata a un esclavo que transmite una interrupción es que depende de una interrupción que se genera para cada byte de la transferencia en lugar de una interrupción para transferir todos los bytes a la vez.

    
pregunta Verosity

1 respuesta

2

Sí, creo que lo entendiste correctamente.

Y si lo piensas, ese es el punto central de las interrupciones. No necesita interrupciones cuando simplemente recorre la matriz y espera cada byte.

Las interrupciones le permiten a su programa hacer cosas mientras la transacción I²C está en curso.

La otra cosa con una sola interrupción sería usar DMA para alimentar los datos al periférico I²C.

A partir del trabajo de implementación que he realizado en una HAL propia para el F401, le recomiendo que utilice la capacidad de interrupción solo para la transmisión o recepción a granel. Encontré interrupciones extrañas sin fuente (sin bits establecidos en los registros) mientras intentaba implementar un enfoque basado exclusivamente en interrupciones para el I²C.

    
respondido por el Arsenal

Lea otras preguntas en las etiquetas