312 #ifdef HAL_I2C_MODULE_ENABLED
319 #define I2C_TIMEOUT_FLAG 35U
320 #define I2C_TIMEOUT_BUSY_FLAG 25U
321 #define I2C_TIMEOUT_STOP_FLAG 5U
322 #define I2C_NO_OPTION_FRAME 0xFFFF0000U
325 #define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY))))
326 #define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE))
327 #define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))
328 #define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))
329 #define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))
330 #define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))
341 #define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__)
356 static void I2C_ITError(I2C_HandleTypeDef *hi2c);
358 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
359 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart);
360 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
361 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);
364 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);
365 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart);
366 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
367 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
368 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
369 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);
370 static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c);
371 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c);
374 static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
375 static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c);
376 static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c);
377 static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c);
378 static void I2C_Master_SB(I2C_HandleTypeDef *hi2c);
379 static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c);
380 static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c);
382 static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c);
383 static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c);
384 static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c);
385 static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c);
386 static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags);
387 static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c);
388 static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c);
390 static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c);
393 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c);
396 static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c);
457 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
458 assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed));
459 assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle));
460 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
461 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
462 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
463 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
464 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
465 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
470 hi2c->Lock = HAL_UNLOCKED;
472 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
485 if (hi2c->MspInitCallback == NULL)
491 hi2c->MspInitCallback(hi2c);
501 __HAL_I2C_DISABLE(hi2c);
504 hi2c->Instance->CR1 |= I2C_CR1_SWRST;
505 hi2c->Instance->CR1 &= ~I2C_CR1_SWRST;
511 if (I2C_MIN_PCLK_FREQ(pclk1, hi2c->Init.ClockSpeed) == 1U)
517 freqrange = I2C_FREQRANGE(pclk1);
521 MODIFY_REG(hi2c->Instance->CR2, I2C_CR2_FREQ, freqrange);
525 MODIFY_REG(hi2c->Instance->TRISE, I2C_TRISE_TRISE, I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed));
529 MODIFY_REG(hi2c->Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle));
533 MODIFY_REG(hi2c->Instance->CR1, (I2C_CR1_ENGC | I2C_CR1_NOSTRETCH), (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode));
537 MODIFY_REG(hi2c->Instance->OAR1, (I2C_OAR1_ADDMODE | I2C_OAR1_ADD8_9 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD0), (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1));
541 MODIFY_REG(hi2c->Instance->OAR2, (I2C_OAR2_ENDUAL | I2C_OAR2_ADD2), (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2));
544 __HAL_I2C_ENABLE(hi2c);
546 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
548 hi2c->PreviousState = I2C_STATE_NONE;
569 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
574 __HAL_I2C_DISABLE(hi2c);
576 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
577 if (hi2c->MspDeInitCallback == NULL)
583 hi2c->MspDeInitCallback(hi2c);
589 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
591 hi2c->PreviousState = I2C_STATE_NONE;
632 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
656 HAL_StatusTypeDef status = HAL_OK;
658 if (pCallback == NULL)
661 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
673 hi2c->MasterTxCpltCallback = pCallback;
677 hi2c->MasterRxCpltCallback = pCallback;
681 hi2c->SlaveTxCpltCallback = pCallback;
685 hi2c->SlaveRxCpltCallback = pCallback;
689 hi2c->ListenCpltCallback = pCallback;
693 hi2c->MemTxCpltCallback = pCallback;
697 hi2c->MemRxCpltCallback = pCallback;
701 hi2c->ErrorCallback = pCallback;
705 hi2c->AbortCpltCallback = pCallback;
709 hi2c->MspInitCallback = pCallback;
713 hi2c->MspDeInitCallback = pCallback;
718 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
730 hi2c->MspInitCallback = pCallback;
734 hi2c->MspDeInitCallback = pCallback;
739 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
749 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
783 HAL_StatusTypeDef status = HAL_OK;
838 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
859 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
869 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
890 HAL_StatusTypeDef status = HAL_OK;
892 if (pCallback == NULL)
895 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
904 hi2c->AddrCallback = pCallback;
909 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
929 HAL_StatusTypeDef status = HAL_OK;
941 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
959 static void I2C_Flush_DR(I2C_HandleTypeDef *hi2c)
962 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) != RESET)
964 hi2c->Instance->DR = 0x00U;
1056 HAL_StatusTypeDef
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1064 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1073 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1076 __HAL_I2C_ENABLE(hi2c);
1080 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1084 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1087 hi2c->pBuffPtr = pData;
1088 hi2c->XferCount = Size;
1089 hi2c->XferSize = hi2c->XferCount;
1090 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1093 if (I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
1099 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1101 while (hi2c->XferSize > 0U)
1104 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1106 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
1109 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1115 hi2c->Instance->DR = *hi2c->pBuffPtr;
1124 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1127 hi2c->Instance->DR = *hi2c->pBuffPtr;
1138 if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1140 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
1143 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1150 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1177 HAL_StatusTypeDef
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1185 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1194 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1197 __HAL_I2C_ENABLE(hi2c);
1201 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1205 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1208 hi2c->pBuffPtr = pData;
1209 hi2c->XferCount = Size;
1210 hi2c->XferSize = hi2c->XferCount;
1211 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1214 if (I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
1219 if (hi2c->XferSize == 0U)
1222 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1225 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1227 else if (hi2c->XferSize == 1U)
1230 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1233 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1236 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1238 else if (hi2c->XferSize == 2U)
1241 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1244 SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1247 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1252 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1255 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1258 while (hi2c->XferSize > 0U)
1260 if (hi2c->XferSize <= 3U)
1263 if (hi2c->XferSize == 1U)
1266 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1272 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1282 else if (hi2c->XferSize == 2U)
1285 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
1291 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1294 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1304 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1317 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
1323 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1326 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1336 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
1342 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
1345 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1355 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1368 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1374 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1383 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
1386 if (hi2c->XferSize == 3U)
1389 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1393 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1435 if ((pData == NULL) || (Size == 0U))
1444 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1447 __HAL_I2C_ENABLE(hi2c);
1451 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1455 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1458 hi2c->pBuffPtr = pData;
1459 hi2c->XferCount = Size;
1460 hi2c->XferSize = hi2c->XferCount;
1461 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1464 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1467 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1473 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1476 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
1479 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1485 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1488 while (hi2c->XferSize > 0U)
1491 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1494 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1500 hi2c->Instance->DR = *hi2c->pBuffPtr;
1509 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1512 hi2c->Instance->DR = *hi2c->pBuffPtr;
1524 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart) != HAL_OK)
1530 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
1533 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1565 if ((pData == NULL) || (Size == (uint16_t)0))
1574 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1577 __HAL_I2C_ENABLE(hi2c);
1581 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1585 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1588 hi2c->pBuffPtr = pData;
1589 hi2c->XferCount = Size;
1590 hi2c->XferSize = hi2c->XferCount;
1591 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1594 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1597 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1603 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
1605 while (hi2c->XferSize > 0U)
1608 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1611 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1617 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1626 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
1629 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
1641 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1644 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1650 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
1653 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1681 __IO uint32_t count = 0U;
1686 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1692 hi2c->PreviousState = I2C_STATE_NONE;
1695 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
1700 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
1706 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1709 __HAL_I2C_ENABLE(hi2c);
1713 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1717 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1720 hi2c->pBuffPtr = pData;
1721 hi2c->XferCount = Size;
1722 hi2c->XferSize = hi2c->XferCount;
1723 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1724 hi2c->Devaddress = DevAddress;
1733 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1736 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
1758 __IO uint32_t count = 0U;
1763 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1769 hi2c->PreviousState = I2C_STATE_NONE;
1772 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
1777 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
1783 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1786 __HAL_I2C_ENABLE(hi2c);
1790 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1794 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1797 hi2c->pBuffPtr = pData;
1798 hi2c->XferCount = Size;
1799 hi2c->XferSize = hi2c->XferCount;
1800 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1801 hi2c->Devaddress = DevAddress;
1812 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1815 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1818 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
1841 if ((pData == NULL) || (Size == 0U))
1850 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1853 __HAL_I2C_ENABLE(hi2c);
1857 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1861 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1864 hi2c->pBuffPtr = pData;
1865 hi2c->XferCount = Size;
1866 hi2c->XferSize = hi2c->XferCount;
1867 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1870 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1880 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1903 if ((pData == NULL) || (Size == 0U))
1912 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1915 __HAL_I2C_ENABLE(hi2c);
1919 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
1923 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1926 hi2c->pBuffPtr = pData;
1927 hi2c->XferCount = Size;
1928 hi2c->XferSize = hi2c->XferCount;
1929 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1932 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
1942 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
1964 __IO uint32_t count = 0U;
1965 HAL_StatusTypeDef dmaxferstatus;
1970 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1976 hi2c->PreviousState = I2C_STATE_NONE;
1979 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
1984 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
1990 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1993 __HAL_I2C_ENABLE(hi2c);
1997 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2001 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2004 hi2c->pBuffPtr = pData;
2005 hi2c->XferCount = Size;
2006 hi2c->XferSize = hi2c->XferCount;
2007 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2008 hi2c->Devaddress = DevAddress;
2010 if (hi2c->XferSize > 0U)
2012 if (hi2c->hdmatx != NULL)
2015 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
2018 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2021 hi2c->hdmatx->XferHalfCpltCallback = NULL;
2022 hi2c->hdmatx->XferM1CpltCallback = NULL;
2023 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
2024 hi2c->hdmatx->XferAbortCallback = NULL;
2027 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
2036 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2044 if (dmaxferstatus == HAL_OK)
2054 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2057 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2060 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2063 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2072 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2083 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2086 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2096 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
2119 __IO uint32_t count = 0U;
2120 HAL_StatusTypeDef dmaxferstatus;
2125 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2131 hi2c->PreviousState = I2C_STATE_NONE;
2134 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
2139 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2145 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2148 __HAL_I2C_ENABLE(hi2c);
2152 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2156 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2159 hi2c->pBuffPtr = pData;
2160 hi2c->XferCount = Size;
2161 hi2c->XferSize = hi2c->XferCount;
2162 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2163 hi2c->Devaddress = DevAddress;
2165 if (hi2c->XferSize > 0U)
2167 if (hi2c->hdmarx != NULL)
2170 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
2173 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2176 hi2c->hdmarx->XferHalfCpltCallback = NULL;
2177 hi2c->hdmarx->XferM1CpltCallback = NULL;
2178 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
2179 hi2c->hdmarx->XferAbortCallback = NULL;
2182 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
2191 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2199 if (dmaxferstatus == HAL_OK)
2202 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2205 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2215 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2218 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2227 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2245 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
2248 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2251 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2272 HAL_StatusTypeDef dmaxferstatus;
2276 if ((pData == NULL) || (Size == 0U))
2285 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2288 __HAL_I2C_ENABLE(hi2c);
2292 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2296 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2299 hi2c->pBuffPtr = pData;
2300 hi2c->XferCount = Size;
2301 hi2c->XferSize = hi2c->XferCount;
2302 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2304 if (hi2c->hdmatx != NULL)
2307 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
2310 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2313 hi2c->hdmatx->XferHalfCpltCallback = NULL;
2314 hi2c->hdmatx->XferM1CpltCallback = NULL;
2315 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
2316 hi2c->hdmatx->XferAbortCallback = NULL;
2319 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
2328 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2336 if (dmaxferstatus == HAL_OK)
2339 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2348 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2351 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
2362 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2386 HAL_StatusTypeDef dmaxferstatus;
2390 if ((pData == NULL) || (Size == 0U))
2399 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2402 __HAL_I2C_ENABLE(hi2c);
2406 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2410 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2413 hi2c->pBuffPtr = pData;
2414 hi2c->XferCount = Size;
2415 hi2c->XferSize = hi2c->XferCount;
2416 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2418 if (hi2c->hdmarx != NULL)
2421 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
2424 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2427 hi2c->hdmarx->XferHalfCpltCallback = NULL;
2428 hi2c->hdmarx->XferM1CpltCallback = NULL;
2429 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
2430 hi2c->hdmarx->XferAbortCallback = NULL;
2433 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
2442 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2450 if (dmaxferstatus == HAL_OK)
2453 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2462 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
2465 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
2476 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2503 HAL_StatusTypeDef
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2509 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2514 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
2523 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2526 __HAL_I2C_ENABLE(hi2c);
2530 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2534 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2537 hi2c->pBuffPtr = pData;
2538 hi2c->XferCount = Size;
2539 hi2c->XferSize = hi2c->XferCount;
2540 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2543 if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2548 while (hi2c->XferSize > 0U)
2551 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2553 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
2556 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2562 hi2c->Instance->DR = *hi2c->pBuffPtr;
2571 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (hi2c->XferSize != 0U))
2574 hi2c->Instance->DR = *hi2c->pBuffPtr;
2586 if (I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2588 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
2591 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2597 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2626 HAL_StatusTypeDef
HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2632 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2637 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
2646 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2649 __HAL_I2C_ENABLE(hi2c);
2653 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2657 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2660 hi2c->pBuffPtr = pData;
2661 hi2c->XferCount = Size;
2662 hi2c->XferSize = hi2c->XferCount;
2663 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2666 if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2671 if (hi2c->XferSize == 0U)
2674 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2677 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2679 else if (hi2c->XferSize == 1U)
2682 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2685 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2688 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2690 else if (hi2c->XferSize == 2U)
2693 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2696 SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2699 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2704 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
2707 while (hi2c->XferSize > 0U)
2709 if (hi2c->XferSize <= 3U)
2712 if (hi2c->XferSize == 1U)
2715 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2721 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2731 else if (hi2c->XferSize == 2U)
2734 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
2740 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2743 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2753 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2766 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
2772 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2775 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2785 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)
2791 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
2794 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2804 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2817 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2823 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2832 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
2834 if (hi2c->XferSize == 3U)
2837 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
2840 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
2878 HAL_StatusTypeDef
HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2880 __IO uint32_t count = 0U;
2883 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2888 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2894 hi2c->PreviousState = I2C_STATE_NONE;
2897 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
2902 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2908 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2911 __HAL_I2C_ENABLE(hi2c);
2915 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
2919 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2922 hi2c->pBuffPtr = pData;
2923 hi2c->XferCount = Size;
2924 hi2c->XferSize = hi2c->XferCount;
2925 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2926 hi2c->Devaddress = DevAddress;
2927 hi2c->Memaddress = MemAddress;
2928 hi2c->MemaddSize = MemAddSize;
2929 hi2c->EventCount = 0U;
2932 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
2942 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
2963 HAL_StatusTypeDef
HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2965 __IO uint32_t count = 0U;
2968 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2973 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
2979 hi2c->PreviousState = I2C_STATE_NONE;
2982 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
2987 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
2993 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
2996 __HAL_I2C_ENABLE(hi2c);
3000 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3004 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3007 hi2c->pBuffPtr = pData;
3008 hi2c->XferCount = Size;
3009 hi2c->XferSize = hi2c->XferCount;
3010 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3011 hi2c->Devaddress = DevAddress;
3012 hi2c->Memaddress = MemAddress;
3013 hi2c->MemaddSize = MemAddSize;
3014 hi2c->EventCount = 0U;
3017 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3020 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3025 if (hi2c->XferSize > 0U)
3032 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3054 HAL_StatusTypeDef
HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
3056 __IO uint32_t count = 0U;
3057 HAL_StatusTypeDef dmaxferstatus;
3063 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3068 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3074 hi2c->PreviousState = I2C_STATE_NONE;
3077 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3082 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3088 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3091 __HAL_I2C_ENABLE(hi2c);
3095 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3099 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3102 hi2c->pBuffPtr = pData;
3103 hi2c->XferCount = Size;
3104 hi2c->XferSize = hi2c->XferCount;
3105 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3106 hi2c->Devaddress = DevAddress;
3107 hi2c->Memaddress = MemAddress;
3108 hi2c->MemaddSize = MemAddSize;
3109 hi2c->EventCount = 0U;
3111 if (hi2c->XferSize > 0U)
3113 if (hi2c->hdmatx != NULL)
3116 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3119 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3122 hi2c->hdmatx->XferHalfCpltCallback = NULL;
3123 hi2c->hdmatx->XferM1CpltCallback = NULL;
3124 hi2c->hdmatx->XferM1HalfCpltCallback = NULL;
3125 hi2c->hdmatx->XferAbortCallback = NULL;
3128 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
3137 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3145 if (dmaxferstatus == HAL_OK)
3148 if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3154 UNUSED(dmaxferstatus);
3157 hi2c->hdmatx->XferCpltCallback = NULL;
3160 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3162 hi2c->XferSize = 0U;
3163 hi2c->XferCount = 0U;
3166 __HAL_I2C_DISABLE(hi2c);
3172 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3181 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
3184 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
3195 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3210 hi2c->ErrorCode |= HAL_I2C_ERROR_SIZE;
3236 HAL_StatusTypeDef
HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
3240 __IO uint32_t count = 0U;
3241 HAL_StatusTypeDef dmaxferstatus;
3244 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3249 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3255 hi2c->PreviousState = I2C_STATE_NONE;
3258 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3263 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3269 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3272 __HAL_I2C_ENABLE(hi2c);
3276 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3280 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3283 hi2c->pBuffPtr = pData;
3284 hi2c->XferCount = Size;
3285 hi2c->XferSize = hi2c->XferCount;
3286 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3287 hi2c->Devaddress = DevAddress;
3288 hi2c->Memaddress = MemAddress;
3289 hi2c->MemaddSize = MemAddSize;
3290 hi2c->EventCount = 0U;
3292 if (hi2c->XferSize > 0U)
3294 if (hi2c->hdmarx != NULL)
3297 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
3300 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3303 hi2c->hdmarx->XferHalfCpltCallback = NULL;
3304 hi2c->hdmarx->XferM1CpltCallback = NULL;
3305 hi2c->hdmarx->XferM1HalfCpltCallback = NULL;
3306 hi2c->hdmarx->XferAbortCallback = NULL;
3309 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
3318 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3326 if (dmaxferstatus == HAL_OK)
3329 if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3335 UNUSED(dmaxferstatus);
3338 hi2c->hdmarx->XferCpltCallback = NULL;
3341 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3343 hi2c->XferSize = 0U;
3344 hi2c->XferCount = 0U;
3347 __HAL_I2C_DISABLE(hi2c);
3352 if (hi2c->XferSize == 1U)
3355 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3360 SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
3364 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3373 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_ERR);
3376 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
3385 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3396 if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)
3402 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3405 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3432 HAL_StatusTypeDef
HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
3436 uint32_t I2C_Trials = 0U;
3443 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3452 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3455 __HAL_I2C_ENABLE(hi2c);
3459 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3462 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3463 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3468 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3471 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK)
3473 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
3475 hi2c->ErrorCode = HAL_I2C_WRONG_START;
3481 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
3487 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
3488 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3491 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3495 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
3496 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3502 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET)
3505 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3508 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
3511 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3526 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
3529 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
3532 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
3541 while (I2C_Trials < Trials);
3570 __IO uint32_t Prev_State = 0x00U;
3571 __IO uint32_t count = 0x00U;
3574 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3579 if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3582 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3588 hi2c->PreviousState = I2C_STATE_NONE;
3591 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3596 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3603 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3606 __HAL_I2C_ENABLE(hi2c);
3610 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3614 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3617 hi2c->pBuffPtr = pData;
3618 hi2c->XferCount = Size;
3619 hi2c->XferSize = hi2c->XferCount;
3620 hi2c->XferOptions = XferOptions;
3621 hi2c->Devaddress = DevAddress;
3623 Prev_State = hi2c->PreviousState;
3627 if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3630 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3641 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3665 __IO uint32_t Prev_State = 0x00U;
3666 __IO uint32_t count = 0x00U;
3667 HAL_StatusTypeDef dmaxferstatus;
3670 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3675 if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3678 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3684 hi2c->PreviousState = I2C_STATE_NONE;
3687 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3692 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3699 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3702 __HAL_I2C_ENABLE(hi2c);
3706 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3710 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3713 hi2c->pBuffPtr = pData;
3714 hi2c->XferCount = Size;
3715 hi2c->XferSize = hi2c->XferCount;
3716 hi2c->XferOptions = XferOptions;
3717 hi2c->Devaddress = DevAddress;
3719 Prev_State = hi2c->PreviousState;
3721 if (hi2c->XferSize > 0U)
3723 if (hi2c->hdmatx != NULL)
3726 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
3729 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3732 hi2c->hdmatx->XferHalfCpltCallback = NULL;
3733 hi2c->hdmatx->XferAbortCallback = NULL;
3736 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
3745 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3753 if (dmaxferstatus == HAL_OK)
3756 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3760 if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3763 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3775 if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
3778 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
3782 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
3791 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3802 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3806 if ((Prev_State != I2C_STATE_MASTER_BUSY_TX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3809 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3820 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3845 __IO uint32_t Prev_State = 0x00U;
3846 __IO uint32_t count = 0U;
3847 uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3850 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3855 if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3858 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3864 hi2c->PreviousState = I2C_STATE_NONE;
3867 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3872 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
3879 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
3882 __HAL_I2C_ENABLE(hi2c);
3886 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3890 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3893 hi2c->pBuffPtr = pData;
3894 hi2c->XferCount = Size;
3895 hi2c->XferSize = hi2c->XferCount;
3896 hi2c->XferOptions = XferOptions;
3897 hi2c->Devaddress = DevAddress;
3899 Prev_State = hi2c->PreviousState;
3901 if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)))
3903 if (Prev_State == I2C_STATE_MASTER_BUSY_RX)
3906 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3909 SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
3912 enableIT &= ~I2C_IT_BUF;
3917 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3923 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
3928 if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
3931 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
3942 __HAL_I2C_ENABLE_IT(hi2c, enableIT);
3966 __IO uint32_t Prev_State = 0x00U;
3967 __IO uint32_t count = 0U;
3968 uint32_t enableIT = (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
3969 HAL_StatusTypeDef dmaxferstatus;
3972 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3977 if ((READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP) || (XferOptions == I2C_FIRST_AND_LAST_FRAME) || (XferOptions == I2C_FIRST_FRAME))
3980 count = I2C_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
3986 hi2c->PreviousState = I2C_STATE_NONE;
3989 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3994 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
4001 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4004 __HAL_I2C_ENABLE(hi2c);
4008 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4011 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4015 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4018 hi2c->pBuffPtr = pData;
4019 hi2c->XferCount = Size;
4020 hi2c->XferSize = hi2c->XferCount;
4021 hi2c->XferOptions = XferOptions;
4022 hi2c->Devaddress = DevAddress;
4024 Prev_State = hi2c->PreviousState;
4026 if (hi2c->XferSize > 0U)
4028 if ((hi2c->XferCount == 2U) && ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP)))
4030 if (Prev_State == I2C_STATE_MASTER_BUSY_RX)
4033 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4036 SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4039 SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4044 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4050 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4052 if ((XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_OTHER_AND_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
4055 SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
4058 if (hi2c->hdmarx != NULL)
4061 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
4064 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
4067 hi2c->hdmarx->XferHalfCpltCallback = NULL;
4068 hi2c->hdmarx->XferAbortCallback = NULL;
4071 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
4080 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4087 if (dmaxferstatus == HAL_OK)
4091 if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
4094 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
4097 enableIT = (I2C_IT_EVT | I2C_IT_ERR);
4102 enableIT = I2C_IT_ERR;
4114 if ((XferOptions == I2C_NEXT_FRAME) || (XferOptions == I2C_LAST_FRAME) || (XferOptions == I2C_LAST_FRAME_NO_STOP))
4117 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4121 __HAL_I2C_ENABLE_IT(hi2c, enableIT);
4130 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4141 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4145 if ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 1))
4148 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
4159 __HAL_I2C_ENABLE_IT(hi2c, enableIT);
4182 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4186 if ((pData == NULL) || (Size == 0U))
4195 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4198 __HAL_I2C_ENABLE(hi2c);
4202 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4206 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4209 hi2c->pBuffPtr = pData;
4210 hi2c->XferCount = Size;
4211 hi2c->XferSize = hi2c->XferCount;
4212 hi2c->XferOptions = XferOptions;
4215 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4225 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4247 HAL_StatusTypeDef dmaxferstatus;
4250 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4254 if ((pData == NULL) || (Size == 0U))
4263 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4269 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4272 if (hi2c->hdmarx != NULL)
4274 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4278 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4284 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4291 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4293 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4296 if (hi2c->hdmatx != NULL)
4300 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4306 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4317 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4320 __HAL_I2C_ENABLE(hi2c);
4324 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4328 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4331 hi2c->pBuffPtr = pData;
4332 hi2c->XferCount = Size;
4333 hi2c->XferSize = hi2c->XferCount;
4334 hi2c->XferOptions = XferOptions;
4336 if (hi2c->hdmatx != NULL)
4339 hi2c->hdmatx->XferCpltCallback = I2C_DMAXferCplt;
4342 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
4345 hi2c->hdmatx->XferHalfCpltCallback = NULL;
4346 hi2c->hdmatx->XferAbortCallback = NULL;
4349 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->DR, hi2c->XferSize);
4358 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4366 if (dmaxferstatus == HAL_OK)
4369 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4372 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4381 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4384 hi2c->Instance->CR2 |= I2C_CR2_DMAEN;
4395 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4422 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4426 if ((pData == NULL) || (Size == 0U))
4435 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4438 __HAL_I2C_ENABLE(hi2c);
4442 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4446 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4449 hi2c->pBuffPtr = pData;
4450 hi2c->XferCount = Size;
4451 hi2c->XferSize = hi2c->XferCount;
4452 hi2c->XferOptions = XferOptions;
4455 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4465 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4487 HAL_StatusTypeDef dmaxferstatus;
4490 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4494 if ((pData == NULL) || (Size == 0U))
4503 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4509 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4512 if (hi2c->hdmarx != NULL)
4514 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4518 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4524 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4531 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
4533 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4536 if (hi2c->hdmatx != NULL)
4540 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4546 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4557 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4560 __HAL_I2C_ENABLE(hi2c);
4564 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
4568 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4571 hi2c->pBuffPtr = pData;
4572 hi2c->XferCount = Size;
4573 hi2c->XferSize = hi2c->XferCount;
4574 hi2c->XferOptions = XferOptions;
4576 if (hi2c->hdmarx != NULL)
4579 hi2c->hdmarx->XferCpltCallback = I2C_DMAXferCplt;
4582 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
4585 hi2c->hdmarx->XferHalfCpltCallback = NULL;
4586 hi2c->hdmarx->XferAbortCallback = NULL;
4589 dmaxferstatus =
HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize);
4598 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4606 if (dmaxferstatus == HAL_OK)
4609 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4612 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
4618 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
4624 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4635 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4662 if ((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
4665 __HAL_I2C_ENABLE(hi2c);
4669 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4672 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4696 tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
4697 hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
4702 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4705 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
4732 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && ((CurrentMode ==
HAL_I2C_MODE_MASTER) ||
4738 hi2c->PreviousState = I2C_STATE_NONE;
4742 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
4745 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
4747 hi2c->XferCount = 0U;
4750 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
4785 uint32_t sr1itflags;
4786 uint32_t sr2itflags = 0U;
4787 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
4788 uint32_t CurrentXferOptions = hi2c->XferOptions;
4795 sr2itflags = READ_REG(hi2c->Instance->SR2);
4796 sr1itflags = READ_REG(hi2c->Instance->SR1);
4799 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) == RESET) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(CurrentXferOptions) == 1U))
4805 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_SB) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4808 I2C_ConvertOtherXferOptions(hi2c);
4810 I2C_Master_SB(hi2c);
4813 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADD10) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4815 I2C_Master_ADD10(hi2c);
4818 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4820 I2C_Master_ADDR(hi2c);
4823 else if (I2C_CHECK_FLAG(sr2itflags, I2C_FLAG_TRA) != RESET)
4826 if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
4829 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))
4831 I2C_MasterTransmit_TXE(hi2c);
4834 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4838 I2C_MasterTransmit_BTF(hi2c);
4844 I2C_MemoryTransmit_TXE_BTF(hi2c);
4858 if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN)
4861 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))
4863 I2C_MasterReceive_RXNE(hi2c);
4866 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4868 I2C_MasterReceive_BTF(hi2c);
4882 if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
4884 sr1itflags = READ_REG(hi2c->Instance->SR1);
4888 sr2itflags = READ_REG(hi2c->Instance->SR2);
4889 sr1itflags = READ_REG(hi2c->Instance->SR1);
4893 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4896 if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
4898 sr2itflags = READ_REG(hi2c->Instance->SR2);
4900 I2C_Slave_ADDR(hi2c, sr2itflags);
4903 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4905 I2C_Slave_STOPF(hi2c);
4911 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))
4913 I2C_SlaveTransmit_TXE(hi2c);
4916 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4918 I2C_SlaveTransmit_BTF(hi2c);
4929 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))
4931 I2C_SlaveReceive_RXNE(hi2c);
4934 else if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BTF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_EVT) != RESET))
4936 I2C_SlaveReceive_BTF(hi2c);
4958 uint32_t sr1itflags = READ_REG(hi2c->Instance->SR1);
4959 uint32_t itsources = READ_REG(hi2c->Instance->CR2);
4960 uint32_t error = HAL_I2C_ERROR_NONE;
4964 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
4966 error |= HAL_I2C_ERROR_BERR;
4969 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
4973 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
4975 error |= HAL_I2C_ERROR_ARLO;
4978 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
4982 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
4985 tmp2 = hi2c->XferCount;
4987 tmp4 = hi2c->PreviousState;
4997 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
4999 error |= HAL_I2C_ERROR_AF;
5005 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5011 if ((I2C_CHECK_FLAG(sr1itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERR) != RESET))
5013 error |= HAL_I2C_ERROR_OVR;
5015 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
5019 if (error != HAL_I2C_ERROR_NONE)
5021 hi2c->ErrorCode |= error;
5101 UNUSED(TransferDirection);
5102 UNUSED(AddrMatchCode);
5239 return hi2c->ErrorCode;
5260 static void I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
5265 uint32_t CurrentXferOptions = hi2c->XferOptions;
5270 if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
5272 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5274 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
5278 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5279 hi2c->MasterTxCpltCallback(hi2c);
5287 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5290 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5292 hi2c->PreviousState = I2C_STATE_NONE;
5298 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5299 hi2c->MemTxCpltCallback(hi2c);
5307 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5308 hi2c->MasterTxCpltCallback(hi2c);
5318 if (hi2c->XferCount == 0U)
5321 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5327 I2C_MemoryTransmit_TXE_BTF(hi2c);
5332 hi2c->Instance->DR = *hi2c->pBuffPtr;
5354 static void I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
5357 uint32_t CurrentXferOptions = hi2c->XferOptions;
5361 if (hi2c->XferCount != 0U)
5364 hi2c->Instance->DR = *hi2c->pBuffPtr;
5375 if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
5377 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5379 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
5383 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5384 hi2c->MasterTxCpltCallback(hi2c);
5392 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5395 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5397 hi2c->PreviousState = I2C_STATE_NONE;
5402 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5403 hi2c->MemTxCpltCallback(hi2c);
5412 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5413 hi2c->MasterTxCpltCallback(hi2c);
5433 static void I2C_MemoryTransmit_TXE_BTF(I2C_HandleTypeDef *hi2c)
5438 if (hi2c->EventCount == 0U)
5441 if (hi2c->MemaddSize == I2C_MEMADD_SIZE_8BIT)
5444 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
5446 hi2c->EventCount += 2U;
5452 hi2c->Instance->DR = I2C_MEM_ADD_MSB(hi2c->Memaddress);
5457 else if (hi2c->EventCount == 1U)
5460 hi2c->Instance->DR = I2C_MEM_ADD_LSB(hi2c->Memaddress);
5464 else if (hi2c->EventCount == 2U)
5469 hi2c->Instance->CR1 |= I2C_CR1_START;
5476 hi2c->Instance->DR = *hi2c->pBuffPtr;
5488 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5491 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5493 hi2c->PreviousState = I2C_STATE_NONE;
5496 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5497 hi2c->MemTxCpltCallback(hi2c);
5520 static void I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
5525 uint32_t CurrentXferOptions;
5527 CurrentXferOptions = hi2c->XferOptions;
5528 tmp = hi2c->XferCount;
5532 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5540 if (hi2c->XferCount == (uint16_t)3)
5545 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5548 else if ((hi2c->XferOptions != I2C_FIRST_AND_NEXT_FRAME) && ((tmp == 1U) || (tmp == 0U)))
5550 if (I2C_WaitOnSTOPRequestThroughIT(hi2c) == HAL_OK)
5553 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5556 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5559 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5572 hi2c->PreviousState = I2C_STATE_NONE;
5574 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5575 hi2c->MemRxCpltCallback(hi2c);
5583 if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME))
5585 hi2c->PreviousState = I2C_STATE_NONE;
5589 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
5592 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5593 hi2c->MasterRxCpltCallback(hi2c);
5602 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
5605 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5617 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5618 hi2c->ErrorCallback(hi2c);
5628 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5639 static void I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
5642 uint32_t CurrentXferOptions = hi2c->XferOptions;
5644 if (hi2c->XferCount == 4U)
5648 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5651 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5659 else if (hi2c->XferCount == 3U)
5663 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
5665 if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME))
5668 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5672 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5680 else if (hi2c->XferCount == 2U)
5683 if ((CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP))
5686 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5688 else if ((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_NEXT_FRAME))
5691 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5693 else if (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP)
5696 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5704 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5713 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5722 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
5728 hi2c->PreviousState = I2C_STATE_NONE;
5729 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5730 hi2c->MemRxCpltCallback(hi2c);
5738 if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME))
5740 hi2c->PreviousState = I2C_STATE_NONE;
5744 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
5746 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5747 hi2c->MasterRxCpltCallback(hi2c);
5756 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
5772 static void I2C_Master_SB(I2C_HandleTypeDef *hi2c)
5776 if (hi2c->EventCount == 0U)
5779 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
5783 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
5788 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
5793 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(hi2c->Devaddress);
5797 hi2c->Instance->DR = I2C_7BIT_ADD_READ(hi2c->Devaddress);
5800 if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL))
5801 || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL)))
5804 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
5809 if (hi2c->EventCount == 0U)
5812 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(hi2c->Devaddress);
5814 else if (hi2c->EventCount == 1U)
5817 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(hi2c->Devaddress);
5833 static void I2C_Master_ADD10(I2C_HandleTypeDef *hi2c)
5836 hi2c->Instance->DR = I2C_10BIT_ADDRESS(hi2c->Devaddress);
5838 if (((hi2c->hdmatx != NULL) && (hi2c->hdmatx->XferCpltCallback != NULL))
5839 || ((hi2c->hdmarx != NULL) && (hi2c->hdmarx->XferCpltCallback != NULL)))
5842 SET_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
5852 static void I2C_Master_ADDR(I2C_HandleTypeDef *hi2c)
5856 uint32_t CurrentXferOptions = hi2c->XferOptions;
5857 uint32_t Prev_State = hi2c->PreviousState;
5864 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5866 else if ((hi2c->EventCount == 0U) && (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT))
5869 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5872 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
5878 if (hi2c->XferCount == 0U)
5881 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5884 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5886 else if (hi2c->XferCount == 1U)
5888 if (CurrentXferOptions == I2C_NO_OPTION_FRAME)
5891 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5893 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
5896 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5899 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5904 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5907 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5911 else if ((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) \
5912 && ((Prev_State != I2C_STATE_MASTER_BUSY_RX) || (CurrentXferOptions == I2C_FIRST_FRAME)))
5914 if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP))
5917 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5922 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5926 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5931 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5934 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5937 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
5940 else if (hi2c->XferCount == 2U)
5942 if ((CurrentXferOptions != I2C_NEXT_FRAME) && (CurrentXferOptions != I2C_FIRST_AND_NEXT_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME_NO_STOP))
5945 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5948 SET_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
5953 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5956 if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME)))
5959 SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
5963 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5968 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
5970 if (((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN) && ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME_NO_STOP) || (CurrentXferOptions == I2C_LAST_FRAME)))
5973 SET_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
5977 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5981 hi2c->EventCount = 0U;
5987 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
5997 static void I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c)
6002 if (hi2c->XferCount != 0U)
6005 hi2c->Instance->DR = *hi2c->pBuffPtr;
6016 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
6019 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6023 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6024 hi2c->SlaveTxCpltCallback(hi2c);
6038 static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
6040 if (hi2c->XferCount != 0U)
6043 hi2c->Instance->DR = *hi2c->pBuffPtr;
6059 static void I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c)
6064 if (hi2c->XferCount != 0U)
6067 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6078 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
6081 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
6085 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6086 hi2c->SlaveRxCpltCallback(hi2c);
6100 static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
6102 if (hi2c->XferCount != 0U)
6105 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6122 static void I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c, uint32_t IT2Flags)
6124 uint8_t TransferDirection = I2C_DIRECTION_RECEIVE;
6125 uint16_t SlaveAddrCode;
6130 __HAL_I2C_DISABLE_IT(hi2c, (I2C_IT_BUF));
6133 if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_TRA) == RESET)
6135 TransferDirection = I2C_DIRECTION_TRANSMIT;
6138 if (I2C_CHECK_FLAG(IT2Flags, I2C_FLAG_DUALF) == RESET)
6140 SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress1;
6144 SlaveAddrCode = (uint16_t)hi2c->Init.OwnAddress2;
6151 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6152 hi2c->AddrCallback(hi2c, TransferDirection, SlaveAddrCode);
6160 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6173 static void I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c)
6179 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6182 __HAL_I2C_CLEAR_STOPFLAG(hi2c);
6185 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6188 if ((hi2c->Instance->CR2 & I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
6192 hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx));
6194 if (hi2c->XferCount != 0U)
6197 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6201 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
6208 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
6214 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
6220 hi2c->XferCount = (uint16_t)(I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx));
6222 if (hi2c->XferCount != 0U)
6225 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6229 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
6236 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
6242 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
6249 if (hi2c->XferCount != 0U)
6252 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)
6255 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6265 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6268 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6277 if (hi2c->XferCount != 0U)
6280 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6284 if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
6294 hi2c->PreviousState = I2C_STATE_NONE;
6298 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6299 hi2c->SlaveRxCpltCallback(hi2c);
6307 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6308 hi2c->PreviousState = I2C_STATE_NONE;
6313 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6314 hi2c->ListenCpltCallback(hi2c);
6323 hi2c->PreviousState = I2C_STATE_NONE;
6327 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6328 hi2c->SlaveRxCpltCallback(hi2c);
6342 static void I2C_Slave_AF(I2C_HandleTypeDef *hi2c)
6346 uint32_t CurrentXferOptions = hi2c->XferOptions;
6348 if (((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME)) && \
6351 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6354 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6357 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6360 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6362 hi2c->PreviousState = I2C_STATE_NONE;
6367 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6368 hi2c->ListenCpltCallback(hi2c);
6375 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6376 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6381 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6384 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6387 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6392 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6393 hi2c->SlaveTxCpltCallback(hi2c);
6402 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6411 static void I2C_ITError(I2C_HandleTypeDef *hi2c)
6416 uint32_t CurrentError;
6421 hi2c->Instance->CR1 &= ~I2C_CR1_POS;
6427 hi2c->PreviousState = I2C_STATE_NONE;
6434 if ((READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) != I2C_CR2_DMAEN) && (CurrentState !=
HAL_I2C_STATE_ABORT))
6439 hi2c->PreviousState = I2C_STATE_NONE;
6443 if (READ_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN) == I2C_CR2_DMAEN)
6445 hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN;
6451 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
6456 __HAL_I2C_DISABLE(hi2c);
6461 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
6468 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
6473 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6476 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6483 __HAL_I2C_DISABLE(hi2c);
6488 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
6495 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
6498 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6501 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6508 __HAL_I2C_DISABLE(hi2c);
6511 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6512 hi2c->AbortCpltCallback(hi2c);
6520 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
6523 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
6530 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6531 hi2c->ErrorCallback(hi2c);
6538 CurrentError = hi2c->ErrorCode;
6540 if (((CurrentError & HAL_I2C_ERROR_BERR) == HAL_I2C_ERROR_BERR) || \
6541 ((CurrentError & HAL_I2C_ERROR_ARLO) == HAL_I2C_ERROR_ARLO) || \
6542 ((CurrentError & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) || \
6543 ((CurrentError & HAL_I2C_ERROR_OVR) == HAL_I2C_ERROR_OVR))
6546 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR);
6551 CurrentState = hi2c->State;
6552 if (((hi2c->ErrorCode & HAL_I2C_ERROR_AF) == HAL_I2C_ERROR_AF) && (CurrentState ==
HAL_I2C_STATE_LISTEN))
6554 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6555 hi2c->PreviousState = I2C_STATE_NONE;
6560 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6561 hi2c->ListenCpltCallback(hi2c);
6577 static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
6580 uint32_t CurrentXferOptions = hi2c->XferOptions;
6583 if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
6586 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6588 else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX)
6591 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6599 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6601 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6603 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6608 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
6611 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6616 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
6619 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
6625 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
6629 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6647 static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)
6650 uint32_t CurrentXferOptions = hi2c->XferOptions;
6653 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6656 if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME) || (CurrentXferOptions == I2C_NO_OPTION_FRAME))
6659 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6661 else if (hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX)
6664 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6672 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6674 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6676 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6681 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
6684 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
6689 hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress);
6692 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout, Tickstart) != HAL_OK)
6698 hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress);
6701 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6707 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6710 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6713 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6715 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6717 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6723 hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress);
6727 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6747 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
6750 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6753 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6755 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6757 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6763 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6766 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6772 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6775 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6777 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6780 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6786 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
6789 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6795 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
6798 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6800 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6803 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6809 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6827 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)
6830 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
6833 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6836 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6838 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6840 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6846 hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
6849 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6855 __HAL_I2C_CLEAR_ADDRFLAG(hi2c);
6858 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6860 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6863 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6869 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
6872 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6878 hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);
6881 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6883 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6886 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6892 hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
6896 if (I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
6898 if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
6901 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
6907 SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);
6910 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout, Tickstart) != HAL_OK)
6912 if (READ_BIT(hi2c->Instance->CR1, I2C_CR1_START) == I2C_CR1_START)
6914 hi2c->ErrorCode = HAL_I2C_WRONG_START;
6920 hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress);
6923 if (I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout, Tickstart) != HAL_OK)
6938 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
6943 uint32_t CurrentXferOptions = hi2c->XferOptions;
6946 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
6949 if (hi2c->hdmatx != NULL)
6951 hi2c->hdmatx->XferCpltCallback = NULL;
6953 if (hi2c->hdmarx != NULL)
6955 hi2c->hdmarx->XferCpltCallback = NULL;
6961 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
6963 hi2c->XferCount = 0U;
6968 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6972 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6973 hi2c->SlaveTxCpltCallback(hi2c);
6981 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
6985 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6986 hi2c->SlaveRxCpltCallback(hi2c);
6997 __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
7002 if (hi2c->XferCount == (uint16_t)1)
7005 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7009 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR);
7012 if ((CurrentXferOptions == I2C_NO_OPTION_FRAME) || (CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_OTHER_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME))
7015 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
7019 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_LAST);
7022 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_DMAEN);
7024 hi2c->XferCount = 0U;
7027 if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
7029 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7030 hi2c->ErrorCallback(hi2c);
7042 hi2c->PreviousState = I2C_STATE_NONE;
7044 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7045 hi2c->MemRxCpltCallback(hi2c);
7053 if ((CurrentXferOptions == I2C_FIRST_AND_LAST_FRAME) || (CurrentXferOptions == I2C_LAST_FRAME))
7055 hi2c->PreviousState = I2C_STATE_NONE;
7059 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
7062 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7063 hi2c->MasterRxCpltCallback(hi2c);
7083 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
7086 if (hi2c->hdmatx != NULL)
7088 hi2c->hdmatx->XferCpltCallback = NULL;
7090 if (hi2c->hdmarx != NULL)
7092 hi2c->hdmarx->XferCpltCallback = NULL;
7099 hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
7101 hi2c->XferCount = 0U;
7106 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
7108 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7109 hi2c->ErrorCallback(hi2c);
7124 __IO uint32_t count = 0U;
7125 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)((
DMA_HandleTypeDef *)hdma)->Parent;
7132 count = I2C_TIMEOUT_FLAG * (SystemCoreClock / 25U / 1000U);
7137 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7142 while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP);
7145 if (hi2c->hdmatx != NULL)
7147 hi2c->hdmatx->XferCpltCallback = NULL;
7149 if (hi2c->hdmarx != NULL)
7151 hi2c->hdmarx->XferCpltCallback = NULL;
7155 CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7157 hi2c->XferCount = 0U;
7160 if (hi2c->hdmatx != NULL)
7162 hi2c->hdmatx->XferAbortCallback = NULL;
7164 if (hi2c->hdmarx != NULL)
7166 hi2c->hdmarx->XferAbortCallback = NULL;
7170 __HAL_I2C_DISABLE(hi2c);
7177 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
7180 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7181 hi2c->AbortCpltCallback(hi2c);
7191 __HAL_I2C_ENABLE(hi2c);
7194 SET_BIT(hi2c->Instance->CR1, I2C_CR1_ACK);
7197 hi2c->PreviousState = I2C_STATE_NONE;
7207 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7208 hi2c->ErrorCallback(hi2c);
7225 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
7228 while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)
7231 if (Timeout != HAL_MAX_DELAY)
7233 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7235 if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status))
7237 hi2c->PreviousState = I2C_STATE_NONE;
7240 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7262 static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout, uint32_t Tickstart)
7264 while (__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
7266 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
7269 SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
7272 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7274 hi2c->PreviousState = I2C_STATE_NONE;
7277 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
7286 if (Timeout != HAL_MAX_DELAY)
7288 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7290 if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET))
7292 hi2c->PreviousState = I2C_STATE_NONE;
7295 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7316 static HAL_StatusTypeDef I2C_WaitOnTXEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7318 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
7321 if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7327 if (Timeout != HAL_MAX_DELAY)
7329 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7331 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET))
7333 hi2c->PreviousState = I2C_STATE_NONE;
7336 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7357 static HAL_StatusTypeDef I2C_WaitOnBTFFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7359 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET)
7362 if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7368 if (Timeout != HAL_MAX_DELAY)
7370 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7372 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == RESET))
7374 hi2c->PreviousState = I2C_STATE_NONE;
7377 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7398 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7400 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
7403 if (I2C_IsAcknowledgeFailed(hi2c) != HAL_OK)
7409 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7411 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET))
7413 hi2c->PreviousState = I2C_STATE_NONE;
7416 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7434 static HAL_StatusTypeDef I2C_WaitOnSTOPRequestThroughIT(I2C_HandleTypeDef *hi2c)
7436 __IO uint32_t count = 0U;
7439 count = I2C_TIMEOUT_STOP_FLAG * (SystemCoreClock / 25U / 1000U);
7445 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7450 while (READ_BIT(hi2c->Instance->CR1, I2C_CR1_STOP) == I2C_CR1_STOP);
7463 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7466 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)
7469 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
7472 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
7474 hi2c->PreviousState = I2C_STATE_NONE;
7477 hi2c->ErrorCode |= HAL_I2C_ERROR_NONE;
7486 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7488 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET))
7490 hi2c->PreviousState = I2C_STATE_NONE;
7493 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7511 static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c)
7513 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
7516 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7518 hi2c->PreviousState = I2C_STATE_NONE;
7521 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
7536 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
7541 if (hi2c->XferOptions == I2C_OTHER_FRAME)
7543 hi2c->XferOptions = I2C_FIRST_FRAME;
7549 else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME)
7551 hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME;
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
Aborts the DMA Transfer in Interrupt mode.
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
Start the DMA Transfer with interrupt enabled.
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
Return the DMA error code.
HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma)
Returns the DMA state.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
@ HAL_I2C_STATE_BUSY_TX_LISTEN
@ HAL_I2C_STATE_BUSY_RX_LISTEN
HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback)
Register a User I2C Callback To be used instead of the weak predefined callback.
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
DeInitialize the I2C MSP.
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
Initialize the I2C MSP.
HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID)
Unregister an I2C Callback I2C callback is redirected to the weak predefined callback.
HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback)
Register the Slave Address Match I2C Callback To be used instead of the weak HAL_I2C_AddrCallback() p...
HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)
UnRegister the Slave Address Match I2C Callback Info Ready I2C Callback is redirected to the weak HAL...
HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
Initializes the I2C according to the specified parameters in the I2C_InitTypeDef and initialize the a...
HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
DeInitialize the I2C peripheral.
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential transmit in slave mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
Write an amount of data in non-blocking mode with DMA to a specific memory address.
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential receive in slave mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
Read an amount of data in non-blocking mode with Interrupt from a specific memory address.
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
Receive in master mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
Receive in master mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Write an amount of data in blocking mode to a specific memory address.
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
Receive in slave mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
Transmit in master mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
Transmit in slave mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receives in master mode an amount of data in blocking mode.
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential transmit in slave mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Read an amount of data in blocking mode from a specific memory address.
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential receive in master mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Transmits in slave mode an amount of data in blocking mode.
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Receive in slave mode an amount of data in blocking mode.
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Transmits in master mode an amount of data in blocking mode.
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
Transmit in master mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
Reads an amount of data in non-blocking mode with DMA from a specific memory address.
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
Write an amount of data in non-blocking mode with Interrupt to a specific memory address.
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
Transmit in slave mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
Abort a master or memory I2C IT or DMA process communication with Interrupt.
HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)
Enable the Address listen mode with Interrupt.
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
Receive in slave mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
Checks if target device is ready for communication.
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Sequential receive in slave mode an amount of data in non-blocking mode with DMA.
HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)
Disable the Address listen mode with Interrupt.
HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
Returns the I2C Master, Slave, Memory or no mode.
uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)
Return the I2C error code.
HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
Return the I2C handle state.
void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
This function handles I2C event interrupt request.
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
Master Rx Transfer completed callback.
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
Memory Tx Transfer completed callback.
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
I2C abort callback.
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
I2C error callback.
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
Memory Rx Transfer completed callback.
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
Listen Complete callback.
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
Slave Rx Transfer completed callback.
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
Slave Address Match callback.
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
Master Tx Transfer completed callback.
void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
This function handles I2C error interrupt request.
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
Slave Tx Transfer completed callback.
void(* pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c)
HAL I2C Callback pointer definition.
void(* pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
HAL_I2C_CallbackIDTypeDef
HAL I2C Callback ID enumeration definition.
@ HAL_I2C_MASTER_TX_COMPLETE_CB_ID
@ HAL_I2C_MEM_RX_COMPLETE_CB_ID
@ HAL_I2C_MASTER_RX_COMPLETE_CB_ID
@ HAL_I2C_MSPDEINIT_CB_ID
@ HAL_I2C_LISTEN_COMPLETE_CB_ID
@ HAL_I2C_SLAVE_TX_COMPLETE_CB_ID
@ HAL_I2C_SLAVE_RX_COMPLETE_CB_ID
@ HAL_I2C_MEM_TX_COMPLETE_CB_ID
uint32_t HAL_RCC_GetPCLK1Freq(void)
Returns the PCLK1 frequency.
This file contains all the functions prototypes for the HAL module driver.
DMA handle Structure definition.