|
|
@@ -400,9 +400,17 @@
|
|
|
* @}
|
|
|
*/
|
|
|
|
|
|
-/* Private macro -------------------------------------------------------------*/
|
|
|
+/* Private macros ------------------------------------------------------------*/
|
|
|
+/** @addtogroup I2C_Private_Macro
|
|
|
+ * @{
|
|
|
+ */
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* Macro to get remaining data to transfer on DMA side */
|
|
|
#define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__)
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
+/**
|
|
|
+ * @}
|
|
|
+ */
|
|
|
|
|
|
/* Private variables ---------------------------------------------------------*/
|
|
|
/* Private function prototypes -----------------------------------------------*/
|
|
|
@@ -410,6 +418,7 @@
|
|
|
/** @defgroup I2C_Private_Functions I2C Private Functions
|
|
|
* @{
|
|
|
*/
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* Private functions to handle DMA transfer */
|
|
|
static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
|
|
|
static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
|
@@ -418,6 +427,8 @@ static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
|
|
|
static void I2C_DMAError(DMA_HandleTypeDef *hdma);
|
|
|
static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);
|
|
|
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
+
|
|
|
/* Private functions to handle IT transfer */
|
|
|
static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
|
|
|
static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c);
|
|
|
@@ -442,12 +453,14 @@ static HAL_StatusTypeDef I2C_Mem_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32
|
|
|
uint32_t ITSources);
|
|
|
static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
uint32_t ITSources);
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
uint32_t ITSources);
|
|
|
static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
uint32_t ITSources);
|
|
|
static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
uint32_t ITSources);
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/* Private functions to handle flags during polling transfer */
|
|
|
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status,
|
|
|
@@ -711,6 +724,8 @@ __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
|
|
|
/**
|
|
|
* @brief Register a User I2C Callback
|
|
|
* To be used instead of the weak predefined callback
|
|
|
+ * @note The HAL_I2C_RegisterCallback() may be called before HAL_I2C_Init() in HAL_I2C_STATE_RESET
|
|
|
+ * to register callbacks for HAL_I2C_MSPINIT_CB_ID and HAL_I2C_MSPDEINIT_CB_ID.
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
* the configuration information for the specified I2C.
|
|
|
* @param CallbackID ID of the callback to be registered
|
|
|
@@ -741,8 +756,6 @@ HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_Call
|
|
|
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
- /* Process locked */
|
|
|
- __HAL_LOCK(hi2c);
|
|
|
|
|
|
if (HAL_I2C_STATE_READY == hi2c->State)
|
|
|
{
|
|
|
@@ -831,14 +844,14 @@ HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_Call
|
|
|
status = HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- /* Release Lock */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Unregister an I2C Callback
|
|
|
* I2C callback is redirected to the weak predefined callback
|
|
|
+ * @note The HAL_I2C_UnRegisterCallback() may be called before HAL_I2C_Init() in HAL_I2C_STATE_RESET
|
|
|
+ * to un-register callbacks for HAL_I2C_MSPINIT_CB_ID and HAL_I2C_MSPDEINIT_CB_ID.
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
* the configuration information for the specified I2C.
|
|
|
* @param CallbackID ID of the callback to be unregistered
|
|
|
@@ -861,9 +874,6 @@ HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_Ca
|
|
|
{
|
|
|
HAL_StatusTypeDef status = HAL_OK;
|
|
|
|
|
|
- /* Process locked */
|
|
|
- __HAL_LOCK(hi2c);
|
|
|
-
|
|
|
if (HAL_I2C_STATE_READY == hi2c->State)
|
|
|
{
|
|
|
switch (CallbackID)
|
|
|
@@ -951,8 +961,6 @@ HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_Ca
|
|
|
status = HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- /* Release Lock */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -975,8 +983,6 @@ HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_Add
|
|
|
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
- /* Process locked */
|
|
|
- __HAL_LOCK(hi2c);
|
|
|
|
|
|
if (HAL_I2C_STATE_READY == hi2c->State)
|
|
|
{
|
|
|
@@ -991,8 +997,6 @@ HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_Add
|
|
|
status = HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- /* Release Lock */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1007,9 +1011,6 @@ HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)
|
|
|
{
|
|
|
HAL_StatusTypeDef status = HAL_OK;
|
|
|
|
|
|
- /* Process locked */
|
|
|
- __HAL_LOCK(hi2c);
|
|
|
-
|
|
|
if (HAL_I2C_STATE_READY == hi2c->State)
|
|
|
{
|
|
|
hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */
|
|
|
@@ -1023,8 +1024,6 @@ HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)
|
|
|
status = HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- /* Release Lock */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
@@ -1393,6 +1392,19 @@ HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
+ /* Preload TX data if no stretch enable */
|
|
|
+ if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
|
|
|
+ {
|
|
|
+ /* Preload TX register */
|
|
|
+ /* Write data to TXDR */
|
|
|
+ hi2c->Instance->TXDR = *hi2c->pBuffPtr;
|
|
|
+
|
|
|
+ /* Increment Buffer pointer */
|
|
|
+ hi2c->pBuffPtr++;
|
|
|
+
|
|
|
+ hi2c->XferCount--;
|
|
|
+ }
|
|
|
+
|
|
|
/* Clear ADDR flag */
|
|
|
__HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
|
|
|
|
@@ -1789,6 +1801,20 @@ HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pD
|
|
|
hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
|
hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
|
|
|
|
+ /* Preload TX data if no stretch enable */
|
|
|
+ if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
|
|
|
+ {
|
|
|
+ /* Preload TX register */
|
|
|
+ /* Write data to TXDR */
|
|
|
+ hi2c->Instance->TXDR = *hi2c->pBuffPtr;
|
|
|
+
|
|
|
+ /* Increment Buffer pointer */
|
|
|
+ hi2c->pBuffPtr++;
|
|
|
+
|
|
|
+ hi2c->XferCount--;
|
|
|
+ hi2c->XferSize--;
|
|
|
+ }
|
|
|
+
|
|
|
/* Process Unlocked */
|
|
|
__HAL_UNLOCK(hi2c);
|
|
|
|
|
|
@@ -1860,6 +1886,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pDa
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Transmit in master mode an amount of data in non-blocking mode with DMA
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
@@ -2187,67 +2214,99 @@ HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *p
|
|
|
hi2c->XferOptions = I2C_NO_OPTION_FRAME;
|
|
|
hi2c->XferISR = I2C_Slave_ISR_DMA;
|
|
|
|
|
|
- if (hi2c->hdmatx != NULL)
|
|
|
+ /* Preload TX data if no stretch enable */
|
|
|
+ if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
|
|
|
{
|
|
|
- /* Set the I2C DMA transfer complete callback */
|
|
|
- hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
|
|
|
-
|
|
|
- /* Set the DMA error callback */
|
|
|
- hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
|
+ /* Preload TX register */
|
|
|
+ /* Write data to TXDR */
|
|
|
+ hi2c->Instance->TXDR = *hi2c->pBuffPtr;
|
|
|
|
|
|
- /* Set the unused DMA callbacks to NULL */
|
|
|
- hi2c->hdmatx->XferHalfCpltCallback = NULL;
|
|
|
- hi2c->hdmatx->XferAbortCallback = NULL;
|
|
|
+ /* Increment Buffer pointer */
|
|
|
+ hi2c->pBuffPtr++;
|
|
|
|
|
|
- /* Enable the DMA channel */
|
|
|
- dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR,
|
|
|
- hi2c->XferSize);
|
|
|
+ hi2c->XferCount--;
|
|
|
+ hi2c->XferSize--;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if (hi2c->XferCount != 0U)
|
|
|
{
|
|
|
- /* Update I2C state */
|
|
|
- hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
+ if (hi2c->hdmatx != NULL)
|
|
|
+ {
|
|
|
+ /* Set the I2C DMA transfer complete callback */
|
|
|
+ hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
|
|
|
|
|
|
- /* Update I2C error code */
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
|
|
|
+ /* Set the DMA error callback */
|
|
|
+ hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ /* Set the unused DMA callbacks to NULL */
|
|
|
+ hi2c->hdmatx->XferHalfCpltCallback = NULL;
|
|
|
+ hi2c->hdmatx->XferAbortCallback = NULL;
|
|
|
|
|
|
- return HAL_ERROR;
|
|
|
- }
|
|
|
+ /* Enable the DMA channel */
|
|
|
+ dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx,
|
|
|
+ (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR,
|
|
|
+ hi2c->XferSize);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* Update I2C state */
|
|
|
+ hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
|
+ hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
|
|
|
- if (dmaxferstatus == HAL_OK)
|
|
|
- {
|
|
|
- /* Enable Address Acknowledge */
|
|
|
- hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
|
+ /* Update I2C error code */
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
|
|
|
- /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
|
- to avoid the risk of I2C interrupt handle execution before current
|
|
|
- process unlock */
|
|
|
- /* Enable ERR, STOP, NACK, ADDR interrupts */
|
|
|
- I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
|
|
|
- /* Enable DMA Request */
|
|
|
- hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
|
+ if (dmaxferstatus == HAL_OK)
|
|
|
+ {
|
|
|
+ /* Enable Address Acknowledge */
|
|
|
+ hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
|
+
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
+
|
|
|
+ /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
|
+ to avoid the risk of I2C interrupt handle execution before current
|
|
|
+ process unlock */
|
|
|
+ /* Enable ERR, STOP, NACK, ADDR interrupts */
|
|
|
+ I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
|
+
|
|
|
+ /* Enable DMA Request */
|
|
|
+ hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* Update I2C state */
|
|
|
+ hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
|
+ hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
+
|
|
|
+ /* Update I2C error code */
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
|
|
|
+
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
+
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- /* Update I2C state */
|
|
|
- hi2c->State = HAL_I2C_STATE_LISTEN;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
-
|
|
|
- /* Update I2C error code */
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
|
|
|
+ /* Enable Address Acknowledge */
|
|
|
+ hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
|
|
|
|
|
|
/* Process Unlocked */
|
|
|
__HAL_UNLOCK(hi2c);
|
|
|
|
|
|
- return HAL_ERROR;
|
|
|
+ /* Note : The I2C interrupts must be enabled after unlocking current process
|
|
|
+ to avoid the risk of I2C interrupt handle execution before current
|
|
|
+ process unlock */
|
|
|
+ /* Enable ERR, STOP, NACK, ADDR interrupts */
|
|
|
+ I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
|
|
|
}
|
|
|
|
|
|
return HAL_OK;
|
|
|
@@ -2361,6 +2420,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pD
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
+
|
|
|
/**
|
|
|
* @brief Write an amount of data in blocking mode to a specific memory address
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
@@ -2809,6 +2870,8 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddre
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Write an amount of data in non-blocking mode with DMA to a specific memory address
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
@@ -3100,6 +3163,7 @@ HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddr
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Checks if target device is ready for communication.
|
|
|
@@ -3333,6 +3397,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA.
|
|
|
* @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
|
@@ -3500,6 +3565,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint1
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt
|
|
|
@@ -3588,6 +3654,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with DMA
|
|
|
* @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
|
@@ -3755,6 +3822,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16
|
|
|
return HAL_BUSY;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt
|
|
|
@@ -3769,6 +3837,9 @@ HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16
|
|
|
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
|
|
|
uint32_t XferOptions)
|
|
|
{
|
|
|
+ /* Declaration of tmp to prevent undefined behavior of volatile usage */
|
|
|
+ FlagStatus tmp;
|
|
|
+
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
|
|
|
|
@@ -3793,6 +3864,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
/* Disable associated Interrupts */
|
|
|
I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* Abort DMA Xfer if any */
|
|
|
if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
|
|
|
{
|
|
|
@@ -3812,6 +3884,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
}
|
|
|
|
|
|
hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN;
|
|
|
@@ -3828,7 +3901,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
hi2c->XferOptions = XferOptions;
|
|
|
hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
|
|
|
|
- if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)
|
|
|
+ tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
|
+ if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) && (tmp != RESET))
|
|
|
{
|
|
|
/* Clear ADDR flag after prepare the transfer parameters */
|
|
|
/* This action will generate an acknowledge to the Master */
|
|
|
@@ -3852,6 +3926,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with DMA
|
|
|
* @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
|
@@ -3865,6 +3940,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
|
|
|
uint32_t XferOptions)
|
|
|
{
|
|
|
+ /* Declaration of tmp to prevent undefined behavior of volatile usage */
|
|
|
+ FlagStatus tmp;
|
|
|
HAL_StatusTypeDef dmaxferstatus;
|
|
|
|
|
|
/* Check the parameters */
|
|
|
@@ -3899,7 +3976,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_
|
|
|
hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
|
|
|
|
|
|
/* Set the I2C DMA Abort callback :
|
|
|
- will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
|
+ will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
|
hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
|
|
|
|
|
|
/* Abort DMA RX */
|
|
|
@@ -3921,7 +3998,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_
|
|
|
if (hi2c->hdmatx != NULL)
|
|
|
{
|
|
|
/* Set the I2C DMA Abort callback :
|
|
|
- will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
|
+ will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */
|
|
|
hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
|
|
|
|
|
|
/* Abort DMA TX */
|
|
|
@@ -4006,7 +4083,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)
|
|
|
+ tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
|
+ if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) && (tmp != RESET))
|
|
|
{
|
|
|
/* Clear ADDR flag after prepare the transfer parameters */
|
|
|
/* This action will generate an acknowledge to the Master */
|
|
|
@@ -4032,6 +4110,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt
|
|
|
@@ -4046,6 +4125,9 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_
|
|
|
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
|
|
|
uint32_t XferOptions)
|
|
|
{
|
|
|
+ /* Declaration of tmp to prevent undefined behavior of volatile usage */
|
|
|
+ FlagStatus tmp;
|
|
|
+
|
|
|
/* Check the parameters */
|
|
|
assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
|
|
|
|
|
|
@@ -4070,6 +4152,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
/* Disable associated Interrupts */
|
|
|
I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
|
|
|
{
|
|
|
hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
|
|
|
@@ -4089,6 +4172,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
}
|
|
|
|
|
|
hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN;
|
|
|
@@ -4105,7 +4189,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
hi2c->XferOptions = XferOptions;
|
|
|
hi2c->XferISR = I2C_Slave_ISR_IT;
|
|
|
|
|
|
- if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)
|
|
|
+ tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
|
+ if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) && (tmp != RESET))
|
|
|
{
|
|
|
/* Clear ADDR flag after prepare the transfer parameters */
|
|
|
/* This action will generate an acknowledge to the Master */
|
|
|
@@ -4129,6 +4214,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with DMA
|
|
|
* @note This interface allow to manage repeated start condition when a direction change during transfer
|
|
|
@@ -4142,6 +4228,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
|
|
|
uint32_t XferOptions)
|
|
|
{
|
|
|
+ /* Declaration of tmp to prevent undefined behavior of volatile usage */
|
|
|
+ FlagStatus tmp;
|
|
|
HAL_StatusTypeDef dmaxferstatus;
|
|
|
|
|
|
/* Check the parameters */
|
|
|
@@ -4283,7 +4371,8 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
|
|
|
- if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)
|
|
|
+ tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
|
|
|
+ if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) && (tmp != RESET))
|
|
|
{
|
|
|
/* Clear ADDR flag after prepare the transfer parameters */
|
|
|
/* This action will generate an acknowledge to the Master */
|
|
|
@@ -4309,6 +4398,7 @@ HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t
|
|
|
return HAL_ERROR;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Enable the Address listen mode with Interrupt.
|
|
|
@@ -4435,7 +4525,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevA
|
|
|
* the configuration information for the specified I2C.
|
|
|
* @retval None
|
|
|
*/
|
|
|
-void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
|
|
|
+void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) /* Derogation MISRAC2012-Rule-8.13 */
|
|
|
{
|
|
|
/* Get current IT Flags and IT sources value */
|
|
|
uint32_t itflags = READ_REG(hi2c->Instance->ISR);
|
|
|
@@ -4688,7 +4778,7 @@ __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
|
|
|
* the configuration information for the specified I2C.
|
|
|
* @retval HAL state
|
|
|
*/
|
|
|
-HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
|
|
|
+HAL_I2C_StateTypeDef HAL_I2C_GetState(const I2C_HandleTypeDef *hi2c)
|
|
|
{
|
|
|
/* Return I2C handle state */
|
|
|
return hi2c->State;
|
|
|
@@ -4700,7 +4790,7 @@ HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
|
|
|
* the configuration information for I2C module
|
|
|
* @retval HAL mode
|
|
|
*/
|
|
|
-HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
|
|
|
+HAL_I2C_ModeTypeDef HAL_I2C_GetMode(const I2C_HandleTypeDef *hi2c)
|
|
|
{
|
|
|
return hi2c->Mode;
|
|
|
}
|
|
|
@@ -4711,7 +4801,7 @@ HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
|
|
|
* the configuration information for the specified I2C.
|
|
|
* @retval I2C Error Code
|
|
|
*/
|
|
|
-uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
|
|
|
+uint32_t HAL_I2C_GetError(const I2C_HandleTypeDef *hi2c)
|
|
|
{
|
|
|
return hi2c->ErrorCode;
|
|
|
}
|
|
|
@@ -4883,7 +4973,7 @@ static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uin
|
|
|
* @retval HAL status
|
|
|
*/
|
|
|
static HAL_StatusTypeDef I2C_Mem_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
- uint32_t ITSources)
|
|
|
+ uint32_t ITSources)
|
|
|
{
|
|
|
uint32_t direction = I2C_GENERATE_START_WRITE;
|
|
|
uint32_t tmpITFlags = ITFlags;
|
|
|
@@ -5152,6 +5242,7 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.
|
|
|
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
|
|
|
@@ -5301,7 +5392,7 @@ static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, ui
|
|
|
* @retval HAL status
|
|
|
*/
|
|
|
static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
|
|
|
- uint32_t ITSources)
|
|
|
+ uint32_t ITSources)
|
|
|
{
|
|
|
uint32_t direction = I2C_GENERATE_START_WRITE;
|
|
|
|
|
|
@@ -5571,6 +5662,7 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin
|
|
|
|
|
|
return HAL_OK;
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/**
|
|
|
* @brief Master sends target device address followed by internal memory address for write request.
|
|
|
@@ -5843,6 +5935,7 @@ static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c)
|
|
|
/* Reset I2C handle mode */
|
|
|
hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* If a DMA is ongoing, Update handle size context */
|
|
|
if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET)
|
|
|
{
|
|
|
@@ -5858,6 +5951,7 @@ static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c)
|
|
|
{
|
|
|
/* Do nothing */
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
|
|
|
{
|
|
|
@@ -6087,6 +6181,7 @@ static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
|
/* Flush TX register */
|
|
|
I2C_Flush_TXDR(hi2c);
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* If a DMA is ongoing, Update handle size context */
|
|
|
if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET)
|
|
|
{
|
|
|
@@ -6112,6 +6207,7 @@ static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
|
{
|
|
|
/* Do nothing */
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/* Store Last receive data if any */
|
|
|
if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET)
|
|
|
@@ -6266,7 +6362,10 @@ static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
|
|
|
static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)
|
|
|
{
|
|
|
HAL_I2C_StateTypeDef tmpstate = hi2c->State;
|
|
|
+
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
uint32_t tmppreviousstate;
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/* Reset handle parameters */
|
|
|
hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
@@ -6293,18 +6392,37 @@ static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)
|
|
|
/* Disable all interrupts */
|
|
|
I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);
|
|
|
|
|
|
+ /* Flush TX register */
|
|
|
+ I2C_Flush_TXDR(hi2c);
|
|
|
+
|
|
|
/* If state is an abort treatment on going, don't change state */
|
|
|
/* This change will be do later */
|
|
|
if (hi2c->State != HAL_I2C_STATE_ABORT)
|
|
|
{
|
|
|
/* Set HAL_I2C_STATE_READY */
|
|
|
hi2c->State = HAL_I2C_STATE_READY;
|
|
|
+
|
|
|
+ /* Check if a STOPF is detected */
|
|
|
+ if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
|
|
|
+ {
|
|
|
+ if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
|
|
|
+ {
|
|
|
+ __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Clear STOP Flag */
|
|
|
+ __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
hi2c->XferISR = NULL;
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/* Abort DMA TX transfer if any */
|
|
|
tmppreviousstate = hi2c->PreviousState;
|
|
|
+
|
|
|
if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \
|
|
|
(tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX)))
|
|
|
{
|
|
|
@@ -6365,6 +6483,7 @@ static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
{
|
|
|
I2C_TreatErrorCallback(hi2c);
|
|
|
}
|
|
|
@@ -6429,6 +6548,7 @@ static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
/**
|
|
|
* @brief DMA I2C master transmit process complete callback.
|
|
|
* @param hdma DMA handle
|
|
|
@@ -6479,6 +6599,7 @@ static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* @brief DMA I2C slave transmit process complete callback.
|
|
|
* @param hdma DMA handle
|
|
|
@@ -6507,6 +6628,7 @@ static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* @brief DMA I2C master receive process complete callback.
|
|
|
* @param hdma DMA handle
|
|
|
@@ -6557,6 +6679,7 @@ static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* @brief DMA I2C slave receive process complete callback.
|
|
|
* @param hdma DMA handle
|
|
|
@@ -6585,6 +6708,7 @@ static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* @brief DMA I2C communication error callback.
|
|
|
* @param hdma DMA handle
|
|
|
@@ -6602,6 +6726,7 @@ static void I2C_DMAError(DMA_HandleTypeDef *hdma)
|
|
|
I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* @brief DMA I2C communication abort callback
|
|
|
* (To be called at end of DMA Abort procedure).
|
|
|
@@ -6626,6 +6751,8 @@ static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
|
|
|
I2C_TreatErrorCallback(hi2c);
|
|
|
}
|
|
|
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
+
|
|
|
/**
|
|
|
* @brief This function handles I2C Communication Timeout. It waits
|
|
|
* until a flag is no longer in the specified status.
|
|
|
@@ -6647,13 +6774,16 @@ static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uin
|
|
|
{
|
|
|
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
|
|
|
{
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
- hi2c->State = HAL_I2C_STATE_READY;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
+ if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status))
|
|
|
+ {
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
+ hi2c->State = HAL_I2C_STATE_READY;
|
|
|
+ hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
- return HAL_ERROR;
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -6684,14 +6814,17 @@ static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c,
|
|
|
{
|
|
|
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
|
|
|
{
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
- hi2c->State = HAL_I2C_STATE_READY;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
+ if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET))
|
|
|
+ {
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
+ hi2c->State = HAL_I2C_STATE_READY;
|
|
|
+ hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
|
|
|
- return HAL_ERROR;
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -6720,14 +6853,17 @@ static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c,
|
|
|
/* Check for the Timeout */
|
|
|
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
|
|
|
{
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
- hi2c->State = HAL_I2C_STATE_READY;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
+ if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET))
|
|
|
+ {
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
+ hi2c->State = HAL_I2C_STATE_READY;
|
|
|
+ hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
|
|
|
- return HAL_ERROR;
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return HAL_OK;
|
|
|
@@ -6794,13 +6930,16 @@ static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c,
|
|
|
/* Check for the Timeout */
|
|
|
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
|
|
|
{
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
- hi2c->State = HAL_I2C_STATE_READY;
|
|
|
+ if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET))
|
|
|
+ {
|
|
|
+ hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
+ hi2c->State = HAL_I2C_STATE_READY;
|
|
|
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ /* Process Unlocked */
|
|
|
+ __HAL_UNLOCK(hi2c);
|
|
|
|
|
|
- return HAL_ERROR;
|
|
|
+ return HAL_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return HAL_OK;
|
|
|
@@ -6857,14 +6996,11 @@ static HAL_StatusTypeDef I2C_IsErrorOccurred(I2C_HandleTypeDef *hi2c, uint32_t T
|
|
|
/* Check for the Timeout */
|
|
|
if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF)
|
|
|
{
|
|
|
- hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
- hi2c->State = HAL_I2C_STATE_READY;
|
|
|
- hi2c->Mode = HAL_I2C_MODE_NONE;
|
|
|
-
|
|
|
- /* Process Unlocked */
|
|
|
- __HAL_UNLOCK(hi2c);
|
|
|
+ error_code |= HAL_I2C_ERROR_TIMEOUT;
|
|
|
|
|
|
status = HAL_ERROR;
|
|
|
+
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -6989,8 +7125,11 @@ static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
|
{
|
|
|
uint32_t tmpisr = 0U;
|
|
|
|
|
|
- if ((hi2c->XferISR == I2C_Master_ISR_DMA) || \
|
|
|
- (hi2c->XferISR == I2C_Slave_ISR_DMA))
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
+ if ((hi2c->XferISR != I2C_Master_ISR_DMA) && \
|
|
|
+ (hi2c->XferISR != I2C_Slave_ISR_DMA) && \
|
|
|
+ (hi2c->XferISR != I2C_Mem_ISR_DMA))
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
{
|
|
|
if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
|
|
|
{
|
|
|
@@ -6998,6 +7137,18 @@ static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
|
tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
|
}
|
|
|
|
|
|
+ if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
|
|
|
+ {
|
|
|
+ /* Enable ERR, TC, STOP, NACK and RXI interrupts */
|
|
|
+ tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
|
|
|
+ {
|
|
|
+ /* Enable ERR, TC, STOP, NACK and TXI interrupts */
|
|
|
+ tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI;
|
|
|
+ }
|
|
|
+
|
|
|
if (InterruptRequest == I2C_XFER_ERROR_IT)
|
|
|
{
|
|
|
/* Enable ERR and NACK interrupts */
|
|
|
@@ -7007,20 +7158,16 @@ static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
|
if (InterruptRequest == I2C_XFER_CPLT_IT)
|
|
|
{
|
|
|
/* Enable STOP interrupts */
|
|
|
- tmpisr |= (I2C_IT_STOPI | I2C_IT_TCI);
|
|
|
- }
|
|
|
-
|
|
|
- if (InterruptRequest == I2C_XFER_RELOAD_IT)
|
|
|
- {
|
|
|
- /* Enable TC interrupts */
|
|
|
- tmpisr |= I2C_IT_TCI;
|
|
|
+ tmpisr |= I2C_IT_STOPI;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#if defined(HAL_DMA_MODULE_ENABLED)
|
|
|
else
|
|
|
{
|
|
|
if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
|
|
|
{
|
|
|
- /* Enable ERR, STOP, NACK, and ADDR interrupts */
|
|
|
+ /* Enable ERR, STOP, NACK and ADDR interrupts */
|
|
|
tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
|
|
|
}
|
|
|
|
|
|
@@ -7045,9 +7192,16 @@ static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
|
|
|
if (InterruptRequest == I2C_XFER_CPLT_IT)
|
|
|
{
|
|
|
/* Enable STOP interrupts */
|
|
|
- tmpisr |= I2C_IT_STOPI;
|
|
|
+ tmpisr |= (I2C_IT_STOPI | I2C_IT_TCI);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((hi2c->XferISR != I2C_Mem_ISR_DMA) && (InterruptRequest == I2C_XFER_RELOAD_IT))
|
|
|
+ {
|
|
|
+ /* Enable TC interrupts */
|
|
|
+ tmpisr |= I2C_IT_TCI;
|
|
|
}
|
|
|
}
|
|
|
+#endif /* HAL_DMA_MODULE_ENABLED */
|
|
|
|
|
|
/* Enable interrupts only at the end */
|
|
|
/* to avoid the risk of I2C interrupt handle execution before */
|