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.