Untitled
unknown
c_cpp
3 years ago
6.6 kB
13
Indexable
void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
{
uint32_t sr1itflags;
uint32_t sr2itflags = 0U;
uint32_t itsources = READ_REG(hi2c->Instance->CR2);
uint32_t CurrentXferOptions = hi2c->XferOptions;
HAL_I2C_ModeTypeDef CurrentMode = hi2c->Mode;
HAL_I2C_StateTypeDef CurrentState = hi2c->State;
/* Master or Memory mode selected */
if ((CurrentMode == HAL_I2C_MODE_MASTER) || (CurrentMode == HAL_I2C_MODE_MEM))
{
sr2itflags = READ_REG(hi2c->Instance->SR2);
sr1itflags = READ_REG(hi2c->Instance->SR1);
/* Exit IRQ event until Start Bit detected in case of Other frame requested */
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U))
{
return;
}
/* SB Set ----------------------------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
/* Convert OTHER_xxx XferOptions if any */
I2C_ConvertOtherXferOptions(hi2c);
I2C_Master_SB(hi2c);
}
/* ADD10 Set -------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_Master_ADD10(hi2c);
}
/* ADDR Set --------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_Master_ADDR(hi2c);
}
/* I2C in mode Transmitter -----------------------------------------------*/
else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET)
{
/* Do not check buffer and BTF flag if a Xfer DMA is on going */
if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
{
/* TXE set and BTF reset -----------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
{
I2C_MasterTransmit_TXE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
if (CurrentState == HAL_I2C_STATE_BUSY_TX)
{
I2C_MasterTransmit_BTF(hi2c);
}
else /* HAL_I2C_MODE_MEM */
{
if (CurrentMode == HAL_I2C_MODE_MEM)
{
I2C_MemoryTransmit_TXE_BTF(hi2c);
}
}
}
else
{
/* Do nothing */
}
}
}
/* I2C in mode Receiver --------------------------------------------------*/
else
{
/* Do not check buffer and BTF flag if a Xfer DMA is on going */
if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
{
/* RXNE set and BTF reset -----------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
{
I2C_MasterReceive_RXNE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_MasterReceive_BTF(hi2c);
}
else
{
/* Do nothing */
}
}
}
}
/* Slave mode selected */
else
{
/* If an error is detected, read only SR1 register to prevent */
/* a clear of ADDR flags by reading SR2 after reading SR1 in Error treatment */
if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
{
sr1itflags = READ_REG(hi2c->Instance->SR1);
}
else
{
sr2itflags = READ_REG(hi2c->Instance->SR2);
sr1itflags = READ_REG(hi2c->Instance->SR1);
}
/* ADDR set --------------------------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
/* Now time to read SR2, this will clear ADDR flag automatically */
if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
{
sr2itflags = READ_REG(hi2c->Instance->SR2);
}
I2C_Slave_ADDR(hi2c, sr2itflags);
}
/* STOPF set --------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_Slave_STOPF(hi2c);
}
/* I2C in mode Transmitter -----------------------------------------------*/
else if ((CurrentState == HAL_I2C_STATE_BUSY_TX) || (CurrentState == HAL_I2C_STATE_BUSY_TX_LISTEN))
{
/* TXE set and BTF reset -----------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_TXE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
{
I2C_SlaveTransmit_TXE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_SlaveTransmit_BTF(hi2c);
}
else
{
/* Do nothing */
}
}
/* I2C in mode Receiver --------------------------------------------------*/
else
{
/* RXNE set and BTF reset ----------------------------------------------*/
if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_BUF) != RESET) && (I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) == RESET))
{
I2C_SlaveReceive_RXNE(hi2c);
}
/* BTF set -------------------------------------------------------------*/
else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
{
I2C_SlaveReceive_BTF(hi2c);
}
else
{
/* Do nothing */
}
}
}
}
Editor is loading...