Untitled
unknown
c_cpp
2 years ago
6.6 kB
8
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...