334#ifdef HAL_FMPI2C_MODULE_ENABLED
335#if defined(FMPI2C_CR1_PE)
343#define TIMING_CLEAR_MASK (0xF0FFFFFFU)
344#define FMPI2C_TIMEOUT_ADDR (10000U)
345#define FMPI2C_TIMEOUT_BUSY (25U)
346#define FMPI2C_TIMEOUT_DIR (25U)
347#define FMPI2C_TIMEOUT_RXNE (25U)
348#define FMPI2C_TIMEOUT_STOPF (25U)
349#define FMPI2C_TIMEOUT_TC (25U)
350#define FMPI2C_TIMEOUT_TCR (25U)
351#define FMPI2C_TIMEOUT_TXIS (25U)
352#define FMPI2C_TIMEOUT_FLAG (25U)
354#define MAX_NBYTE_SIZE 255U
355#define SLAVE_ADDR_SHIFT 7U
356#define SLAVE_ADDR_MSK 0x06U
359#define FMPI2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_FMPI2C_STATE_BUSY_TX | \
360 (uint32_t)HAL_FMPI2C_STATE_BUSY_RX) & \
361 (uint32_t)(~((uint32_t)HAL_FMPI2C_STATE_READY))))
363#define FMPI2C_STATE_NONE ((uint32_t)(HAL_FMPI2C_MODE_NONE))
365#define FMPI2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_TX & FMPI2C_STATE_MSK) | \
366 (uint32_t)HAL_FMPI2C_MODE_MASTER))
368#define FMPI2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_RX & FMPI2C_STATE_MSK) | \
369 (uint32_t)HAL_FMPI2C_MODE_MASTER))
371#define FMPI2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_TX & FMPI2C_STATE_MSK) | \
372 (uint32_t)HAL_FMPI2C_MODE_SLAVE))
374#define FMPI2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_RX & FMPI2C_STATE_MSK) | \
375 (uint32_t)HAL_FMPI2C_MODE_SLAVE))
377#define FMPI2C_STATE_MEM_BUSY_TX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_TX & FMPI2C_STATE_MSK) | \
378 (uint32_t)HAL_FMPI2C_MODE_MEM))
380#define FMPI2C_STATE_MEM_BUSY_RX ((uint32_t)(((uint32_t)HAL_FMPI2C_STATE_BUSY_RX & FMPI2C_STATE_MSK) | \
381 (uint32_t)HAL_FMPI2C_MODE_MEM))
386#define FMPI2C_XFER_TX_IT (uint16_t)(0x0001U)
388#define FMPI2C_XFER_RX_IT (uint16_t)(0x0002U)
390#define FMPI2C_XFER_LISTEN_IT (uint16_t)(0x8000U)
393#define FMPI2C_XFER_ERROR_IT (uint16_t)(0x0010U)
395#define FMPI2C_XFER_CPLT_IT (uint16_t)(0x0020U)
396#define FMPI2C_XFER_RELOAD_IT (uint16_t)(0x0040U)
399#define FMPI2C_NO_OPTION_FRAME (0xFFFF0000U)
409#define FMPI2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__)
430static void FMPI2C_ITAddrCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags);
431static void FMPI2C_ITMasterSeqCplt(FMPI2C_HandleTypeDef *hfmpi2c);
432static void FMPI2C_ITSlaveSeqCplt(FMPI2C_HandleTypeDef *hfmpi2c);
433static void FMPI2C_ITMasterCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags);
434static void FMPI2C_ITSlaveCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags);
435static void FMPI2C_ITListenCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags);
436static void FMPI2C_ITError(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ErrorCode);
439static HAL_StatusTypeDef FMPI2C_RequestMemoryWrite(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress,
440 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
442static HAL_StatusTypeDef FMPI2C_RequestMemoryRead(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress,
443 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
447static HAL_StatusTypeDef FMPI2C_Master_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
449static HAL_StatusTypeDef FMPI2C_Mem_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
451static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
453static HAL_StatusTypeDef FMPI2C_Master_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
455static HAL_StatusTypeDef FMPI2C_Mem_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
457static HAL_StatusTypeDef FMPI2C_Slave_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
461static HAL_StatusTypeDef FMPI2C_WaitOnFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Flag, FlagStatus Status,
462 uint32_t Timeout, uint32_t Tickstart);
463static HAL_StatusTypeDef FMPI2C_WaitOnTXISFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
465static HAL_StatusTypeDef FMPI2C_WaitOnRXNEFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
467static HAL_StatusTypeDef FMPI2C_WaitOnSTOPFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
469static HAL_StatusTypeDef FMPI2C_IsErrorOccurred(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
473static void FMPI2C_Enable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest);
474static void FMPI2C_Disable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest);
477static void FMPI2C_TreatErrorCallback(FMPI2C_HandleTypeDef *hfmpi2c);
480static void FMPI2C_Flush_TXDR(FMPI2C_HandleTypeDef *hfmpi2c);
483static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode,
487static void FMPI2C_ConvertOtherXferOptions(FMPI2C_HandleTypeDef *hfmpi2c);
545 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
546 assert_param(IS_FMPI2C_OWN_ADDRESS1(hfmpi2c->Init.OwnAddress1));
547 assert_param(IS_FMPI2C_ADDRESSING_MODE(hfmpi2c->Init.AddressingMode));
548 assert_param(IS_FMPI2C_DUAL_ADDRESS(hfmpi2c->Init.DualAddressMode));
549 assert_param(IS_FMPI2C_OWN_ADDRESS2(hfmpi2c->Init.OwnAddress2));
550 assert_param(IS_FMPI2C_OWN_ADDRESS2_MASK(hfmpi2c->Init.OwnAddress2Masks));
551 assert_param(IS_FMPI2C_GENERAL_CALL(hfmpi2c->Init.GeneralCallMode));
552 assert_param(IS_FMPI2C_NO_STRETCH(hfmpi2c->Init.NoStretchMode));
554 if (hfmpi2c->State == HAL_FMPI2C_STATE_RESET)
559#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
561 hfmpi2c->MasterTxCpltCallback = HAL_FMPI2C_MasterTxCpltCallback;
562 hfmpi2c->MasterRxCpltCallback = HAL_FMPI2C_MasterRxCpltCallback;
563 hfmpi2c->SlaveTxCpltCallback = HAL_FMPI2C_SlaveTxCpltCallback;
564 hfmpi2c->SlaveRxCpltCallback = HAL_FMPI2C_SlaveRxCpltCallback;
565 hfmpi2c->ListenCpltCallback = HAL_FMPI2C_ListenCpltCallback;
566 hfmpi2c->MemTxCpltCallback = HAL_FMPI2C_MemTxCpltCallback;
567 hfmpi2c->MemRxCpltCallback = HAL_FMPI2C_MemRxCpltCallback;
568 hfmpi2c->ErrorCallback = HAL_FMPI2C_ErrorCallback;
569 hfmpi2c->AbortCpltCallback = HAL_FMPI2C_AbortCpltCallback;
570 hfmpi2c->AddrCallback = HAL_FMPI2C_AddrCallback;
572 if (hfmpi2c->MspInitCallback == NULL)
574 hfmpi2c->MspInitCallback = HAL_FMPI2C_MspInit;
578 hfmpi2c->MspInitCallback(hfmpi2c);
581 HAL_FMPI2C_MspInit(hfmpi2c);
585 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
588 __HAL_FMPI2C_DISABLE(hfmpi2c);
592 hfmpi2c->Instance->TIMINGR = hfmpi2c->Init.Timing & TIMING_CLEAR_MASK;
596 hfmpi2c->Instance->OAR1 &= ~FMPI2C_OAR1_OA1EN;
599 if (hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_7BIT)
601 hfmpi2c->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | hfmpi2c->Init.OwnAddress1);
605 hfmpi2c->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | FMPI2C_OAR1_OA1MODE | hfmpi2c->Init.OwnAddress1);
610 if (hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
612 SET_BIT(hfmpi2c->Instance->CR2, FMPI2C_CR2_ADD10);
617 CLEAR_BIT(hfmpi2c->Instance->CR2, FMPI2C_CR2_ADD10);
620 hfmpi2c->Instance->CR2 |= (FMPI2C_CR2_AUTOEND | FMPI2C_CR2_NACK);
624 hfmpi2c->Instance->OAR2 &= ~FMPI2C_DUALADDRESS_ENABLE;
627 hfmpi2c->Instance->OAR2 = (hfmpi2c->Init.DualAddressMode | hfmpi2c->Init.OwnAddress2 | \
628 (hfmpi2c->Init.OwnAddress2Masks << 8));
632 hfmpi2c->Instance->CR1 = (hfmpi2c->Init.GeneralCallMode | hfmpi2c->Init.NoStretchMode);
635 __HAL_FMPI2C_ENABLE(hfmpi2c);
637 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
638 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
639 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
640 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
660 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
662 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
665 __HAL_FMPI2C_DISABLE(hfmpi2c);
667#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
668 if (hfmpi2c->MspDeInitCallback == NULL)
670 hfmpi2c->MspDeInitCallback = HAL_FMPI2C_MspDeInit;
674 hfmpi2c->MspDeInitCallback(hfmpi2c);
677 HAL_FMPI2C_MspDeInit(hfmpi2c);
680 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
681 hfmpi2c->State = HAL_FMPI2C_STATE_RESET;
682 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
683 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
697__weak
void HAL_FMPI2C_MspInit(FMPI2C_HandleTypeDef *hfmpi2c)
713__weak
void HAL_FMPI2C_MspDeInit(FMPI2C_HandleTypeDef *hfmpi2c)
723#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
747HAL_StatusTypeDef HAL_FMPI2C_RegisterCallback(FMPI2C_HandleTypeDef *hfmpi2c, HAL_FMPI2C_CallbackIDTypeDef CallbackID,
748 pFMPI2C_CallbackTypeDef pCallback)
752 if (pCallback == NULL)
755 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
760 if (HAL_FMPI2C_STATE_READY == hfmpi2c->State)
764 case HAL_FMPI2C_MASTER_TX_COMPLETE_CB_ID :
765 hfmpi2c->MasterTxCpltCallback = pCallback;
768 case HAL_FMPI2C_MASTER_RX_COMPLETE_CB_ID :
769 hfmpi2c->MasterRxCpltCallback = pCallback;
772 case HAL_FMPI2C_SLAVE_TX_COMPLETE_CB_ID :
773 hfmpi2c->SlaveTxCpltCallback = pCallback;
776 case HAL_FMPI2C_SLAVE_RX_COMPLETE_CB_ID :
777 hfmpi2c->SlaveRxCpltCallback = pCallback;
780 case HAL_FMPI2C_LISTEN_COMPLETE_CB_ID :
781 hfmpi2c->ListenCpltCallback = pCallback;
784 case HAL_FMPI2C_MEM_TX_COMPLETE_CB_ID :
785 hfmpi2c->MemTxCpltCallback = pCallback;
788 case HAL_FMPI2C_MEM_RX_COMPLETE_CB_ID :
789 hfmpi2c->MemRxCpltCallback = pCallback;
792 case HAL_FMPI2C_ERROR_CB_ID :
793 hfmpi2c->ErrorCallback = pCallback;
796 case HAL_FMPI2C_ABORT_CB_ID :
797 hfmpi2c->AbortCpltCallback = pCallback;
800 case HAL_FMPI2C_MSPINIT_CB_ID :
801 hfmpi2c->MspInitCallback = pCallback;
804 case HAL_FMPI2C_MSPDEINIT_CB_ID :
805 hfmpi2c->MspDeInitCallback = pCallback;
810 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
817 else if (HAL_FMPI2C_STATE_RESET == hfmpi2c->State)
821 case HAL_FMPI2C_MSPINIT_CB_ID :
822 hfmpi2c->MspInitCallback = pCallback;
825 case HAL_FMPI2C_MSPDEINIT_CB_ID :
826 hfmpi2c->MspDeInitCallback = pCallback;
831 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
841 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
873HAL_StatusTypeDef HAL_FMPI2C_UnRegisterCallback(FMPI2C_HandleTypeDef *hfmpi2c, HAL_FMPI2C_CallbackIDTypeDef CallbackID)
877 if (HAL_FMPI2C_STATE_READY == hfmpi2c->State)
881 case HAL_FMPI2C_MASTER_TX_COMPLETE_CB_ID :
882 hfmpi2c->MasterTxCpltCallback = HAL_FMPI2C_MasterTxCpltCallback;
885 case HAL_FMPI2C_MASTER_RX_COMPLETE_CB_ID :
886 hfmpi2c->MasterRxCpltCallback = HAL_FMPI2C_MasterRxCpltCallback;
889 case HAL_FMPI2C_SLAVE_TX_COMPLETE_CB_ID :
890 hfmpi2c->SlaveTxCpltCallback = HAL_FMPI2C_SlaveTxCpltCallback;
893 case HAL_FMPI2C_SLAVE_RX_COMPLETE_CB_ID :
894 hfmpi2c->SlaveRxCpltCallback = HAL_FMPI2C_SlaveRxCpltCallback;
897 case HAL_FMPI2C_LISTEN_COMPLETE_CB_ID :
898 hfmpi2c->ListenCpltCallback = HAL_FMPI2C_ListenCpltCallback;
901 case HAL_FMPI2C_MEM_TX_COMPLETE_CB_ID :
902 hfmpi2c->MemTxCpltCallback = HAL_FMPI2C_MemTxCpltCallback;
905 case HAL_FMPI2C_MEM_RX_COMPLETE_CB_ID :
906 hfmpi2c->MemRxCpltCallback = HAL_FMPI2C_MemRxCpltCallback;
909 case HAL_FMPI2C_ERROR_CB_ID :
910 hfmpi2c->ErrorCallback = HAL_FMPI2C_ErrorCallback;
913 case HAL_FMPI2C_ABORT_CB_ID :
914 hfmpi2c->AbortCpltCallback = HAL_FMPI2C_AbortCpltCallback;
917 case HAL_FMPI2C_MSPINIT_CB_ID :
918 hfmpi2c->MspInitCallback = HAL_FMPI2C_MspInit;
921 case HAL_FMPI2C_MSPDEINIT_CB_ID :
922 hfmpi2c->MspDeInitCallback = HAL_FMPI2C_MspDeInit;
927 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
934 else if (HAL_FMPI2C_STATE_RESET == hfmpi2c->State)
938 case HAL_FMPI2C_MSPINIT_CB_ID :
939 hfmpi2c->MspInitCallback = HAL_FMPI2C_MspInit;
942 case HAL_FMPI2C_MSPDEINIT_CB_ID :
943 hfmpi2c->MspDeInitCallback = HAL_FMPI2C_MspDeInit;
948 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
958 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
975HAL_StatusTypeDef HAL_FMPI2C_RegisterAddrCallback(FMPI2C_HandleTypeDef *hfmpi2c, pFMPI2C_AddrCallbackTypeDef pCallback)
979 if (pCallback == NULL)
982 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
987 if (HAL_FMPI2C_STATE_READY == hfmpi2c->State)
989 hfmpi2c->AddrCallback = pCallback;
994 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
1010HAL_StatusTypeDef HAL_FMPI2C_UnRegisterAddrCallback(FMPI2C_HandleTypeDef *hfmpi2c)
1014 if (HAL_FMPI2C_STATE_READY == hfmpi2c->State)
1016 hfmpi2c->AddrCallback = HAL_FMPI2C_AddrCallback;
1021 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_INVALID_CALLBACK;
1120HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
1121 uint16_t Size, uint32_t Timeout)
1126 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1134 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY, tickstart) !=
HAL_OK)
1139 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
1140 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
1141 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1144 hfmpi2c->pBuffPtr = pData;
1145 hfmpi2c->XferCount = Size;
1146 hfmpi2c->XferISR = NULL;
1148 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1150 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
1151 xfermode = FMPI2C_RELOAD_MODE;
1155 hfmpi2c->XferSize = hfmpi2c->XferCount;
1156 xfermode = FMPI2C_AUTOEND_MODE;
1159 if (hfmpi2c->XferSize > 0U)
1163 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1166 hfmpi2c->pBuffPtr++;
1168 hfmpi2c->XferCount--;
1169 hfmpi2c->XferSize--;
1173 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)(hfmpi2c->XferSize + 1U), xfermode,
1174 FMPI2C_GENERATE_START_WRITE);
1180 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode,
1181 FMPI2C_GENERATE_START_WRITE);
1184 while (hfmpi2c->XferCount > 0U)
1187 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1192 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1195 hfmpi2c->pBuffPtr++;
1197 hfmpi2c->XferCount--;
1198 hfmpi2c->XferSize--;
1200 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
1203 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) !=
HAL_OK)
1208 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1210 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
1211 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
1212 FMPI2C_NO_STARTSTOP);
1216 hfmpi2c->XferSize = hfmpi2c->XferCount;
1217 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
1218 FMPI2C_NO_STARTSTOP);
1225 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1231 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
1234 FMPI2C_RESET_CR2(hfmpi2c);
1236 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
1237 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
1261HAL_StatusTypeDef HAL_FMPI2C_Master_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
1262 uint16_t Size, uint32_t Timeout)
1266 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1274 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY, tickstart) !=
HAL_OK)
1279 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
1280 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
1281 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1284 hfmpi2c->pBuffPtr = pData;
1285 hfmpi2c->XferCount = Size;
1286 hfmpi2c->XferISR = NULL;
1290 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1292 hfmpi2c->XferSize = 1U;
1293 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
1294 FMPI2C_GENERATE_START_READ);
1298 hfmpi2c->XferSize = hfmpi2c->XferCount;
1299 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
1300 FMPI2C_GENERATE_START_READ);
1303 while (hfmpi2c->XferCount > 0U)
1306 if (FMPI2C_WaitOnRXNEFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1312 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
1315 hfmpi2c->pBuffPtr++;
1317 hfmpi2c->XferSize--;
1318 hfmpi2c->XferCount--;
1320 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
1323 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) !=
HAL_OK)
1328 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1330 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
1331 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
1332 FMPI2C_NO_STARTSTOP);
1336 hfmpi2c->XferSize = hfmpi2c->XferCount;
1337 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
1338 FMPI2C_NO_STARTSTOP);
1345 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1351 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
1354 FMPI2C_RESET_CR2(hfmpi2c);
1356 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
1357 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
1379HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
1383 uint16_t tmpXferCount;
1386 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1388 if ((pData == NULL) || (Size == 0U))
1390 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
1399 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
1400 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
1401 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1404 hfmpi2c->pBuffPtr = pData;
1405 hfmpi2c->XferCount = Size;
1406 hfmpi2c->XferISR = NULL;
1409 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1412 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout, tickstart) !=
HAL_OK)
1415 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1420 if (hfmpi2c->Init.NoStretchMode == FMPI2C_NOSTRETCH_ENABLE)
1424 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1427 hfmpi2c->pBuffPtr++;
1429 hfmpi2c->XferCount--;
1433 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
1436 if (hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
1439 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout, tickstart) !=
HAL_OK)
1442 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1447 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
1451 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, RESET, Timeout, tickstart) !=
HAL_OK)
1454 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1458 while (hfmpi2c->XferCount > 0U)
1461 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1464 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1469 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1472 hfmpi2c->pBuffPtr++;
1474 hfmpi2c->XferCount--;
1478 error = FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_AF, RESET, Timeout, tickstart);
1486 tmpXferCount = hfmpi2c->XferCount;
1487 if ((hfmpi2c->ErrorCode == HAL_FMPI2C_ERROR_AF) && (tmpXferCount == 0U))
1490 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1495 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1502 FMPI2C_Flush_TXDR(hfmpi2c);
1505 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
1508 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1511 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1517 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
1521 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, Timeout, tickstart) !=
HAL_OK)
1524 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1529 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1531 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
1532 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
1554HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
1559 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1561 if ((pData == NULL) || (Size == 0U))
1563 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
1572 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
1573 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
1574 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1577 hfmpi2c->pBuffPtr = pData;
1578 hfmpi2c->XferCount = Size;
1579 hfmpi2c->XferSize = hfmpi2c->XferCount;
1580 hfmpi2c->XferISR = NULL;
1583 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1586 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_ADDR, RESET, Timeout, tickstart) !=
HAL_OK)
1589 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1594 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
1597 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_DIR, SET, Timeout, tickstart) !=
HAL_OK)
1600 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1604 while (hfmpi2c->XferCount > 0U)
1607 if (FMPI2C_WaitOnRXNEFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1610 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1613 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET)
1616 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
1619 hfmpi2c->pBuffPtr++;
1621 hfmpi2c->XferCount--;
1622 hfmpi2c->XferSize--;
1629 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
1632 hfmpi2c->pBuffPtr++;
1634 hfmpi2c->XferCount--;
1635 hfmpi2c->XferSize--;
1639 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
1642 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1647 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
1650 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, Timeout, tickstart) !=
HAL_OK)
1653 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1658 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
1660 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
1661 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
1684HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
1689 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1691 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
1699 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
1700 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
1701 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1704 hfmpi2c->pBuffPtr = pData;
1705 hfmpi2c->XferCount = Size;
1706 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
1707 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
1709 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1711 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
1712 xfermode = FMPI2C_RELOAD_MODE;
1716 hfmpi2c->XferSize = hfmpi2c->XferCount;
1717 xfermode = FMPI2C_AUTOEND_MODE;
1722 if (hfmpi2c->XferSize > 0U)
1726 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1729 hfmpi2c->pBuffPtr++;
1731 hfmpi2c->XferCount--;
1732 hfmpi2c->XferSize--;
1734 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)(hfmpi2c->XferSize + 1U), xfermode,
1735 FMPI2C_GENERATE_START_WRITE);
1739 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode,
1740 FMPI2C_GENERATE_START_WRITE);
1754 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
1774HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
1779 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1781 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
1789 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
1790 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
1791 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1794 hfmpi2c->pBuffPtr = pData;
1795 hfmpi2c->XferCount = Size;
1796 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
1797 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
1799 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1801 hfmpi2c->XferSize = 1U;
1802 xfermode = FMPI2C_RELOAD_MODE;
1806 hfmpi2c->XferSize = hfmpi2c->XferCount;
1807 xfermode = FMPI2C_AUTOEND_MODE;
1812 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, FMPI2C_GENERATE_START_READ);
1825 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
1843HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
1845 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1850 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
1851 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
1852 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1855 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1858 hfmpi2c->pBuffPtr = pData;
1859 hfmpi2c->XferCount = Size;
1860 hfmpi2c->XferSize = hfmpi2c->XferCount;
1861 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
1862 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
1865 if (hfmpi2c->Init.NoStretchMode == FMPI2C_NOSTRETCH_ENABLE)
1869 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
1872 hfmpi2c->pBuffPtr++;
1874 hfmpi2c->XferCount--;
1875 hfmpi2c->XferSize--;
1889 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT | FMPI2C_XFER_LISTEN_IT);
1907HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
1909 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1914 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
1915 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
1916 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1919 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1922 hfmpi2c->pBuffPtr = pData;
1923 hfmpi2c->XferCount = Size;
1924 hfmpi2c->XferSize = hfmpi2c->XferCount;
1925 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
1926 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
1939 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT | FMPI2C_XFER_LISTEN_IT);
1959HAL_StatusTypeDef HAL_FMPI2C_Master_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
1964 uint32_t sizetoxfer = 0U;
1966 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
1968 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
1976 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
1977 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
1978 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
1981 hfmpi2c->pBuffPtr = pData;
1982 hfmpi2c->XferCount = Size;
1983 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
1984 hfmpi2c->XferISR = FMPI2C_Master_ISR_DMA;
1986 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
1988 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
1989 xfermode = FMPI2C_RELOAD_MODE;
1993 hfmpi2c->XferSize = hfmpi2c->XferCount;
1994 xfermode = FMPI2C_AUTOEND_MODE;
1997 if (hfmpi2c->XferSize > 0U)
2001 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
2004 hfmpi2c->pBuffPtr++;
2006 sizetoxfer = hfmpi2c->XferSize;
2007 hfmpi2c->XferCount--;
2008 hfmpi2c->XferSize--;
2011 if (hfmpi2c->XferSize > 0U)
2013 if (hfmpi2c->hdmatx != NULL)
2016 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMAMasterTransmitCplt;
2019 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
2022 hfmpi2c->hdmatx->XferHalfCpltCallback = NULL;
2023 hfmpi2c->hdmatx->XferAbortCallback = NULL;
2026 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)hfmpi2c->pBuffPtr,
2027 (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
2032 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2033 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2036 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
2044 if (dmaxferstatus ==
HAL_OK)
2048 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)(hfmpi2c->XferSize + 1U),
2049 xfermode, FMPI2C_GENERATE_START_WRITE);
2052 hfmpi2c->XferCount -= hfmpi2c->XferSize;
2061 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
2064 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
2069 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2070 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2073 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
2084 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
2088 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)sizetoxfer, FMPI2C_AUTOEND_MODE,
2089 FMPI2C_GENERATE_START_WRITE);
2101 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
2122HAL_StatusTypeDef HAL_FMPI2C_Master_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
2128 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2130 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
2138 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
2139 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
2140 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2143 hfmpi2c->pBuffPtr = pData;
2144 hfmpi2c->XferCount = Size;
2145 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2146 hfmpi2c->XferISR = FMPI2C_Master_ISR_DMA;
2148 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2150 hfmpi2c->XferSize = 1U;
2151 xfermode = FMPI2C_RELOAD_MODE;
2155 hfmpi2c->XferSize = hfmpi2c->XferCount;
2156 xfermode = FMPI2C_AUTOEND_MODE;
2159 if (hfmpi2c->XferSize > 0U)
2161 if (hfmpi2c->hdmarx != NULL)
2164 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMasterReceiveCplt;
2167 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
2170 hfmpi2c->hdmarx->XferHalfCpltCallback = NULL;
2171 hfmpi2c->hdmarx->XferAbortCallback = NULL;
2174 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData,
2180 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2181 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2184 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
2192 if (dmaxferstatus ==
HAL_OK)
2196 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, FMPI2C_GENERATE_START_READ);
2199 hfmpi2c->XferCount -= hfmpi2c->XferSize;
2208 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
2211 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
2216 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2217 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2220 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
2231 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
2235 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
2236 FMPI2C_GENERATE_START_READ);
2248 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
2267HAL_StatusTypeDef HAL_FMPI2C_Slave_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
2271 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2273 if ((pData == NULL) || (Size == 0U))
2275 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2281 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
2282 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
2283 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2286 hfmpi2c->pBuffPtr = pData;
2287 hfmpi2c->XferCount = Size;
2288 hfmpi2c->XferSize = hfmpi2c->XferCount;
2289 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2290 hfmpi2c->XferISR = FMPI2C_Slave_ISR_DMA;
2293 if (hfmpi2c->Init.NoStretchMode == FMPI2C_NOSTRETCH_ENABLE)
2297 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
2300 hfmpi2c->pBuffPtr++;
2302 hfmpi2c->XferCount--;
2303 hfmpi2c->XferSize--;
2306 if (hfmpi2c->XferCount != 0U)
2308 if (hfmpi2c->hdmatx != NULL)
2311 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMASlaveTransmitCplt;
2314 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
2317 hfmpi2c->hdmatx->XferHalfCpltCallback = NULL;
2318 hfmpi2c->hdmatx->XferAbortCallback = NULL;
2322 (uint32_t)hfmpi2c->pBuffPtr, (uint32_t)&hfmpi2c->Instance->TXDR,
2328 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
2329 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2332 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
2340 if (dmaxferstatus ==
HAL_OK)
2343 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
2352 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
2355 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
2360 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
2361 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2364 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
2375 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
2384 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
2403HAL_StatusTypeDef HAL_FMPI2C_Slave_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size)
2407 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2409 if ((pData == NULL) || (Size == 0U))
2411 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2417 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
2418 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
2419 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2422 hfmpi2c->pBuffPtr = pData;
2423 hfmpi2c->XferCount = Size;
2424 hfmpi2c->XferSize = hfmpi2c->XferCount;
2425 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2426 hfmpi2c->XferISR = FMPI2C_Slave_ISR_DMA;
2428 if (hfmpi2c->hdmarx != NULL)
2431 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMASlaveReceiveCplt;
2434 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
2437 hfmpi2c->hdmarx->XferHalfCpltCallback = NULL;
2438 hfmpi2c->hdmarx->XferAbortCallback = NULL;
2441 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData,
2447 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
2448 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2451 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
2459 if (dmaxferstatus ==
HAL_OK)
2462 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
2471 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
2474 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
2479 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
2480 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2483 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
2512HAL_StatusTypeDef HAL_FMPI2C_Mem_Write(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
2513 uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2520 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2522 if ((pData == NULL) || (Size == 0U))
2524 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2534 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY, tickstart) !=
HAL_OK)
2539 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
2540 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
2541 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2544 hfmpi2c->pBuffPtr = pData;
2545 hfmpi2c->XferCount = Size;
2546 hfmpi2c->XferISR = NULL;
2549 if (FMPI2C_RequestMemoryWrite(hfmpi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) !=
HAL_OK)
2557 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2559 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
2560 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
2564 hfmpi2c->XferSize = hfmpi2c->XferCount;
2565 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
2571 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
2577 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
2580 hfmpi2c->pBuffPtr++;
2582 hfmpi2c->XferCount--;
2583 hfmpi2c->XferSize--;
2585 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
2588 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) !=
HAL_OK)
2593 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2595 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
2596 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
2597 FMPI2C_NO_STARTSTOP);
2601 hfmpi2c->XferSize = hfmpi2c->XferCount;
2602 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
2603 FMPI2C_NO_STARTSTOP);
2607 }
while (hfmpi2c->XferCount > 0U);
2611 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
2617 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
2620 FMPI2C_RESET_CR2(hfmpi2c);
2622 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2623 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2649HAL_StatusTypeDef HAL_FMPI2C_Mem_Read(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
2650 uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2657 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2659 if ((pData == NULL) || (Size == 0U))
2661 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2671 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_BUSY, SET, FMPI2C_TIMEOUT_BUSY, tickstart) !=
HAL_OK)
2676 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
2677 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
2678 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2681 hfmpi2c->pBuffPtr = pData;
2682 hfmpi2c->XferCount = Size;
2683 hfmpi2c->XferISR = NULL;
2686 if (FMPI2C_RequestMemoryRead(hfmpi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) !=
HAL_OK)
2695 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2697 hfmpi2c->XferSize = 1U;
2698 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
2699 FMPI2C_GENERATE_START_READ);
2703 hfmpi2c->XferSize = hfmpi2c->XferCount;
2704 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
2705 FMPI2C_GENERATE_START_READ);
2711 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_RXNE, RESET, Timeout, tickstart) !=
HAL_OK)
2717 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
2720 hfmpi2c->pBuffPtr++;
2722 hfmpi2c->XferSize--;
2723 hfmpi2c->XferCount--;
2725 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
2728 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, tickstart) !=
HAL_OK)
2733 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2735 hfmpi2c->XferSize = 1U;
2736 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t) hfmpi2c->XferSize, FMPI2C_RELOAD_MODE,
2737 FMPI2C_NO_STARTSTOP);
2741 hfmpi2c->XferSize = hfmpi2c->XferCount;
2742 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
2743 FMPI2C_NO_STARTSTOP);
2746 }
while (hfmpi2c->XferCount > 0U);
2750 if (FMPI2C_WaitOnSTOPFlagUntilTimeout(hfmpi2c, Timeout, tickstart) !=
HAL_OK)
2756 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
2759 FMPI2C_RESET_CR2(hfmpi2c);
2761 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
2762 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
2786HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
2787 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2792 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2794 if ((pData == NULL) || (Size == 0U))
2796 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2800 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
2808 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
2809 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
2810 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2813 hfmpi2c->XferSize = 0U;
2814 hfmpi2c->pBuffPtr = pData;
2815 hfmpi2c->XferCount = Size;
2816 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2817 hfmpi2c->XferISR = FMPI2C_Mem_ISR_IT;
2818 hfmpi2c->Devaddress = DevAddress;
2821 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
2824 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
2827 hfmpi2c->Memaddress = 0xFFFFFFFFU;
2833 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
2836 hfmpi2c->Memaddress = FMPI2C_MEM_ADD_LSB(MemAddress);
2839 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
2852 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
2874HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
2875 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2880 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2882 if ((pData == NULL) || (Size == 0U))
2884 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2888 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
2896 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
2897 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
2898 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2901 hfmpi2c->pBuffPtr = pData;
2902 hfmpi2c->XferCount = Size;
2903 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2904 hfmpi2c->XferISR = FMPI2C_Mem_ISR_IT;
2905 hfmpi2c->Devaddress = DevAddress;
2908 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
2911 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
2914 hfmpi2c->Memaddress = 0xFFFFFFFFU;
2920 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
2923 hfmpi2c->Memaddress = FMPI2C_MEM_ADD_LSB(MemAddress);
2926 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_SOFTEND_MODE, FMPI2C_GENERATE_START_WRITE);
2939 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
2961HAL_StatusTypeDef HAL_FMPI2C_Mem_Write_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
2962 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2969 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
2971 if ((pData == NULL) || (Size == 0U))
2973 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
2977 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
2985 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
2986 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
2987 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
2990 hfmpi2c->pBuffPtr = pData;
2991 hfmpi2c->XferCount = Size;
2992 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
2993 hfmpi2c->XferISR = FMPI2C_Mem_ISR_DMA;
2994 hfmpi2c->Devaddress = DevAddress;
2996 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
2998 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3002 hfmpi2c->XferSize = hfmpi2c->XferCount;
3006 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
3009 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
3012 hfmpi2c->Memaddress = 0xFFFFFFFFU;
3018 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
3021 hfmpi2c->Memaddress = FMPI2C_MEM_ADD_LSB(MemAddress);
3024 if (hfmpi2c->hdmatx != NULL)
3027 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMAMasterTransmitCplt;
3030 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
3033 hfmpi2c->hdmatx->XferHalfCpltCallback = NULL;
3034 hfmpi2c->hdmatx->XferAbortCallback = NULL;
3037 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)pData, (uint32_t)&hfmpi2c->Instance->TXDR,
3043 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3044 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3047 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
3055 if (dmaxferstatus ==
HAL_OK)
3058 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
3070 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
3075 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3076 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3079 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
3107HAL_StatusTypeDef HAL_FMPI2C_Mem_Read_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint16_t MemAddress,
3108 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
3115 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3117 if ((pData == NULL) || (Size == 0U))
3119 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
3123 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
3131 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
3132 hfmpi2c->Mode = HAL_FMPI2C_MODE_MEM;
3133 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3136 hfmpi2c->pBuffPtr = pData;
3137 hfmpi2c->XferCount = Size;
3138 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
3139 hfmpi2c->XferISR = FMPI2C_Mem_ISR_DMA;
3140 hfmpi2c->Devaddress = DevAddress;
3142 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
3144 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3148 hfmpi2c->XferSize = hfmpi2c->XferCount;
3152 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
3155 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
3158 hfmpi2c->Memaddress = 0xFFFFFFFFU;
3164 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
3167 hfmpi2c->Memaddress = FMPI2C_MEM_ADD_LSB(MemAddress);
3170 if (hfmpi2c->hdmarx != NULL)
3173 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMasterReceiveCplt;
3176 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
3179 hfmpi2c->hdmarx->XferHalfCpltCallback = NULL;
3180 hfmpi2c->hdmarx->XferAbortCallback = NULL;
3183 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData,
3189 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3190 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3193 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
3201 if (dmaxferstatus ==
HAL_OK)
3204 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_SOFTEND_MODE, FMPI2C_GENERATE_START_WRITE);
3216 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
3221 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3222 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3225 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
3252HAL_StatusTypeDef HAL_FMPI2C_IsDeviceReady(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint32_t Trials,
3257 __IO uint32_t FMPI2C_Trials = 0UL;
3262 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3264 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) == SET)
3272 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY;
3273 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3278 hfmpi2c->Instance->CR2 = FMPI2C_GENERATE_START(hfmpi2c->Init.AddressingMode, DevAddress);
3284 tmp1 = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
3285 tmp2 = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
3287 while ((tmp1 == RESET) && (tmp2 == RESET))
3291 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3294 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3297 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
3306 tmp1 = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
3307 tmp2 = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
3311 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == RESET)
3314 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_STOPF, RESET, Timeout, tickstart) !=
HAL_OK)
3320 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
3323 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3333 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_STOPF, RESET, Timeout, tickstart) !=
HAL_OK)
3339 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
3342 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
3347 }
while (FMPI2C_Trials < Trials);
3350 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3353 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
3378HAL_StatusTypeDef HAL_FMPI2C_Master_Seq_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
3379 uint16_t Size, uint32_t XferOptions)
3382 uint32_t xferrequest = FMPI2C_GENERATE_START_WRITE;
3383 uint32_t sizetoxfer = 0U;
3386 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3388 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3393 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
3394 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
3395 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3398 hfmpi2c->pBuffPtr = pData;
3399 hfmpi2c->XferCount = Size;
3400 hfmpi2c->XferOptions = XferOptions;
3401 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
3404 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
3406 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3407 xfermode = FMPI2C_RELOAD_MODE;
3411 hfmpi2c->XferSize = hfmpi2c->XferCount;
3412 xfermode = hfmpi2c->XferOptions;
3415 if ((hfmpi2c->XferSize > 0U) && ((XferOptions == FMPI2C_FIRST_FRAME) || \
3416 (XferOptions == FMPI2C_FIRST_AND_LAST_FRAME)))
3420 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
3423 hfmpi2c->pBuffPtr++;
3425 sizetoxfer = hfmpi2c->XferSize;
3426 hfmpi2c->XferCount--;
3427 hfmpi2c->XferSize--;
3433 if ((hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_TX) && \
3434 (IS_FMPI2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3436 xferrequest = FMPI2C_NO_STARTSTOP;
3441 FMPI2C_ConvertOtherXferOptions(hfmpi2c);
3444 if (hfmpi2c->XferCount <= MAX_NBYTE_SIZE)
3446 xfermode = hfmpi2c->XferOptions;
3451 if ((XferOptions == FMPI2C_FIRST_FRAME) || (XferOptions == FMPI2C_FIRST_AND_LAST_FRAME))
3453 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3457 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, xferrequest);
3470 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
3492HAL_StatusTypeDef HAL_FMPI2C_Master_Seq_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
3493 uint16_t Size, uint32_t XferOptions)
3496 uint32_t xferrequest = FMPI2C_GENERATE_START_WRITE;
3498 uint32_t sizetoxfer = 0U;
3501 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3503 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3508 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX;
3509 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
3510 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3513 hfmpi2c->pBuffPtr = pData;
3514 hfmpi2c->XferCount = Size;
3515 hfmpi2c->XferOptions = XferOptions;
3516 hfmpi2c->XferISR = FMPI2C_Master_ISR_DMA;
3519 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
3521 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3522 xfermode = FMPI2C_RELOAD_MODE;
3526 hfmpi2c->XferSize = hfmpi2c->XferCount;
3527 xfermode = hfmpi2c->XferOptions;
3530 if ((hfmpi2c->XferSize > 0U) && ((XferOptions == FMPI2C_FIRST_FRAME) || \
3531 (XferOptions == FMPI2C_FIRST_AND_LAST_FRAME)))
3535 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
3538 hfmpi2c->pBuffPtr++;
3540 sizetoxfer = hfmpi2c->XferSize;
3541 hfmpi2c->XferCount--;
3542 hfmpi2c->XferSize--;
3548 if ((hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_TX) && \
3549 (IS_FMPI2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3551 xferrequest = FMPI2C_NO_STARTSTOP;
3556 FMPI2C_ConvertOtherXferOptions(hfmpi2c);
3559 if (hfmpi2c->XferCount <= MAX_NBYTE_SIZE)
3561 xfermode = hfmpi2c->XferOptions;
3565 if (hfmpi2c->XferSize > 0U)
3567 if (hfmpi2c->hdmatx != NULL)
3570 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMAMasterTransmitCplt;
3573 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
3576 hfmpi2c->hdmatx->XferHalfCpltCallback = NULL;
3577 hfmpi2c->hdmatx->XferAbortCallback = NULL;
3580 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)hfmpi2c->pBuffPtr,
3581 (uint32_t)&hfmpi2c->Instance->TXDR, hfmpi2c->XferSize);
3586 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3587 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3590 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
3598 if (dmaxferstatus ==
HAL_OK)
3601 if ((XferOptions == FMPI2C_FIRST_FRAME) || (XferOptions == FMPI2C_FIRST_AND_LAST_FRAME))
3603 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3607 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, xferrequest);
3611 hfmpi2c->XferCount -= hfmpi2c->XferSize;
3620 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
3623 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
3628 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3629 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3632 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
3643 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
3647 if ((XferOptions == FMPI2C_FIRST_FRAME) || (XferOptions == FMPI2C_FIRST_AND_LAST_FRAME))
3649 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3653 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, xferrequest);
3666 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
3689HAL_StatusTypeDef HAL_FMPI2C_Master_Seq_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
3690 uint16_t Size, uint32_t XferOptions)
3693 uint32_t xferrequest = FMPI2C_GENERATE_START_READ;
3696 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3698 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3703 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
3704 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
3705 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3708 hfmpi2c->pBuffPtr = pData;
3709 hfmpi2c->XferCount = Size;
3710 hfmpi2c->XferOptions = XferOptions;
3711 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
3714 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
3716 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3717 xfermode = FMPI2C_RELOAD_MODE;
3721 hfmpi2c->XferSize = hfmpi2c->XferCount;
3722 xfermode = hfmpi2c->XferOptions;
3728 if ((hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_RX) && \
3729 (IS_FMPI2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3731 xferrequest = FMPI2C_NO_STARTSTOP;
3736 FMPI2C_ConvertOtherXferOptions(hfmpi2c);
3739 if (hfmpi2c->XferCount <= MAX_NBYTE_SIZE)
3741 xfermode = hfmpi2c->XferOptions;
3746 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, xferrequest);
3754 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
3776HAL_StatusTypeDef HAL_FMPI2C_Master_Seq_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t *pData,
3777 uint16_t Size, uint32_t XferOptions)
3780 uint32_t xferrequest = FMPI2C_GENERATE_START_READ;
3784 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3786 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
3791 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX;
3792 hfmpi2c->Mode = HAL_FMPI2C_MODE_MASTER;
3793 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3796 hfmpi2c->pBuffPtr = pData;
3797 hfmpi2c->XferCount = Size;
3798 hfmpi2c->XferOptions = XferOptions;
3799 hfmpi2c->XferISR = FMPI2C_Master_ISR_DMA;
3802 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
3804 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
3805 xfermode = FMPI2C_RELOAD_MODE;
3809 hfmpi2c->XferSize = hfmpi2c->XferCount;
3810 xfermode = hfmpi2c->XferOptions;
3816 if ((hfmpi2c->PreviousState == FMPI2C_STATE_MASTER_BUSY_RX) && \
3817 (IS_FMPI2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3819 xferrequest = FMPI2C_NO_STARTSTOP;
3824 FMPI2C_ConvertOtherXferOptions(hfmpi2c);
3827 if (hfmpi2c->XferCount <= MAX_NBYTE_SIZE)
3829 xfermode = hfmpi2c->XferOptions;
3833 if (hfmpi2c->XferSize > 0U)
3835 if (hfmpi2c->hdmarx != NULL)
3838 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMAMasterReceiveCplt;
3841 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
3844 hfmpi2c->hdmarx->XferHalfCpltCallback = NULL;
3845 hfmpi2c->hdmarx->XferAbortCallback = NULL;
3848 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)pData,
3854 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3855 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3858 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
3866 if (dmaxferstatus ==
HAL_OK)
3869 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, xfermode, xferrequest);
3872 hfmpi2c->XferCount -= hfmpi2c->XferSize;
3881 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
3884 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
3889 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
3890 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
3893 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
3904 hfmpi2c->XferISR = FMPI2C_Master_ISR_IT;
3908 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_AUTOEND_MODE,
3909 FMPI2C_GENERATE_START_READ);
3921 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
3942HAL_StatusTypeDef HAL_FMPI2C_Slave_Seq_Transmit_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
3943 uint32_t XferOptions)
3949 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3951 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) == (uint32_t)HAL_FMPI2C_STATE_LISTEN)
3953 if ((pData == NULL) || (Size == 0U))
3955 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
3960 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_TX_IT);
3967 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX_LISTEN)
3970 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
3973 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_RXDMAEN) == FMPI2C_CR1_RXDMAEN)
3975 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
3977 if (hfmpi2c->hdmarx != NULL)
3981 hfmpi2c->hdmarx->XferAbortCallback = FMPI2C_DMAAbort;
3987 hfmpi2c->hdmarx->XferAbortCallback(hfmpi2c->hdmarx);
3993 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX_LISTEN;
3994 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
3995 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
3998 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
4001 hfmpi2c->pBuffPtr = pData;
4002 hfmpi2c->XferCount = Size;
4003 hfmpi2c->XferSize = hfmpi2c->XferCount;
4004 hfmpi2c->XferOptions = XferOptions;
4005 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
4007 tmp = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4008 if ((FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE) && (tmp != RESET))
4012 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4022 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT | FMPI2C_XFER_LISTEN_IT);
4042HAL_StatusTypeDef HAL_FMPI2C_Slave_Seq_Transmit_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
4043 uint32_t XferOptions)
4050 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4052 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) == (uint32_t)HAL_FMPI2C_STATE_LISTEN)
4054 if ((pData == NULL) || (Size == 0U))
4056 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
4064 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_TX_IT);
4068 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX_LISTEN)
4071 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
4073 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_RXDMAEN) == FMPI2C_CR1_RXDMAEN)
4076 if (hfmpi2c->hdmarx != NULL)
4078 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
4082 hfmpi2c->hdmarx->XferAbortCallback = FMPI2C_DMAAbort;
4088 hfmpi2c->hdmarx->XferAbortCallback(hfmpi2c->hdmarx);
4093 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN)
4095 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_TXDMAEN) == FMPI2C_CR1_TXDMAEN)
4097 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
4100 if (hfmpi2c->hdmatx != NULL)
4104 hfmpi2c->hdmatx->XferAbortCallback = FMPI2C_DMAAbort;
4110 hfmpi2c->hdmatx->XferAbortCallback(hfmpi2c->hdmatx);
4120 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_TX_LISTEN;
4121 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
4122 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
4125 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
4128 hfmpi2c->pBuffPtr = pData;
4129 hfmpi2c->XferCount = Size;
4130 hfmpi2c->XferSize = hfmpi2c->XferCount;
4131 hfmpi2c->XferOptions = XferOptions;
4132 hfmpi2c->XferISR = FMPI2C_Slave_ISR_DMA;
4134 if (hfmpi2c->hdmatx != NULL)
4137 hfmpi2c->hdmatx->XferCpltCallback = FMPI2C_DMASlaveTransmitCplt;
4140 hfmpi2c->hdmatx->XferErrorCallback = FMPI2C_DMAError;
4143 hfmpi2c->hdmatx->XferHalfCpltCallback = NULL;
4144 hfmpi2c->hdmatx->XferAbortCallback = NULL;
4147 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)pData, (uint32_t)&hfmpi2c->Instance->TXDR,
4153 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
4154 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
4157 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
4165 if (dmaxferstatus ==
HAL_OK)
4168 hfmpi2c->XferCount -= hfmpi2c->XferSize;
4171 hfmpi2c->XferSize = 0;
4176 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
4177 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
4180 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
4188 tmp = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4189 if ((FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE) && (tmp != RESET))
4193 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4200 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
4206 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
4226HAL_StatusTypeDef HAL_FMPI2C_Slave_Seq_Receive_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
4227 uint32_t XferOptions)
4233 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4235 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) == (uint32_t)HAL_FMPI2C_STATE_LISTEN)
4237 if ((pData == NULL) || (Size == 0U))
4239 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
4244 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_RX_IT);
4251 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN)
4254 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
4256 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_TXDMAEN) == FMPI2C_CR1_TXDMAEN)
4258 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
4261 if (hfmpi2c->hdmatx != NULL)
4265 hfmpi2c->hdmatx->XferAbortCallback = FMPI2C_DMAAbort;
4271 hfmpi2c->hdmatx->XferAbortCallback(hfmpi2c->hdmatx);
4277 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX_LISTEN;
4278 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
4279 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
4282 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
4285 hfmpi2c->pBuffPtr = pData;
4286 hfmpi2c->XferCount = Size;
4287 hfmpi2c->XferSize = hfmpi2c->XferCount;
4288 hfmpi2c->XferOptions = XferOptions;
4289 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
4291 tmp = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4292 if ((FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_TRANSMIT) && (tmp != RESET))
4296 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4306 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT | FMPI2C_XFER_LISTEN_IT);
4326HAL_StatusTypeDef HAL_FMPI2C_Slave_Seq_Receive_DMA(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t *pData, uint16_t Size,
4327 uint32_t XferOptions)
4334 assert_param(IS_FMPI2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4336 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) == (uint32_t)HAL_FMPI2C_STATE_LISTEN)
4338 if ((pData == NULL) || (Size == 0U))
4340 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_INVALID_PARAM;
4345 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_RX_IT);
4352 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN)
4355 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
4357 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_TXDMAEN) == FMPI2C_CR1_TXDMAEN)
4360 if (hfmpi2c->hdmatx != NULL)
4362 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
4366 hfmpi2c->hdmatx->XferAbortCallback = FMPI2C_DMAAbort;
4372 hfmpi2c->hdmatx->XferAbortCallback(hfmpi2c->hdmatx);
4377 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX_LISTEN)
4379 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_RXDMAEN) == FMPI2C_CR1_RXDMAEN)
4381 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
4384 if (hfmpi2c->hdmarx != NULL)
4388 hfmpi2c->hdmarx->XferAbortCallback = FMPI2C_DMAAbort;
4394 hfmpi2c->hdmarx->XferAbortCallback(hfmpi2c->hdmarx);
4404 hfmpi2c->State = HAL_FMPI2C_STATE_BUSY_RX_LISTEN;
4405 hfmpi2c->Mode = HAL_FMPI2C_MODE_SLAVE;
4406 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
4409 hfmpi2c->Instance->CR2 &= ~FMPI2C_CR2_NACK;
4412 hfmpi2c->pBuffPtr = pData;
4413 hfmpi2c->XferCount = Size;
4414 hfmpi2c->XferSize = hfmpi2c->XferCount;
4415 hfmpi2c->XferOptions = XferOptions;
4416 hfmpi2c->XferISR = FMPI2C_Slave_ISR_DMA;
4418 if (hfmpi2c->hdmarx != NULL)
4421 hfmpi2c->hdmarx->XferCpltCallback = FMPI2C_DMASlaveReceiveCplt;
4424 hfmpi2c->hdmarx->XferErrorCallback = FMPI2C_DMAError;
4427 hfmpi2c->hdmarx->XferHalfCpltCallback = NULL;
4428 hfmpi2c->hdmarx->XferAbortCallback = NULL;
4431 dmaxferstatus =
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR,
4432 (uint32_t)pData, hfmpi2c->XferSize);
4437 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
4438 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
4441 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA_PARAM;
4449 if (dmaxferstatus ==
HAL_OK)
4452 hfmpi2c->XferCount -= hfmpi2c->XferSize;
4455 hfmpi2c->XferSize = 0;
4460 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
4461 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
4464 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_DMA;
4472 tmp = __HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4473 if ((FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_TRANSMIT) && (tmp != RESET))
4477 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
4484 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
4490 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT | FMPI2C_XFER_LISTEN_IT);
4508 if (hfmpi2c->State == HAL_FMPI2C_STATE_READY)
4510 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
4511 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
4514 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
4536 if (hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN)
4538 tmp = (uint32_t)(hfmpi2c->State) & FMPI2C_STATE_MSK;
4539 hfmpi2c->PreviousState = tmp | (uint32_t)(hfmpi2c->Mode);
4540 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
4541 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
4542 hfmpi2c->XferISR = NULL;
4545 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
4563HAL_StatusTypeDef HAL_FMPI2C_Master_Abort_IT(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress)
4565 if (hfmpi2c->Mode == HAL_FMPI2C_MODE_MASTER)
4571 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX)
4573 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
4574 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_TX;
4576 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
4578 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
4579 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_RX;
4587 hfmpi2c->State = HAL_FMPI2C_STATE_ABORT;
4591 FMPI2C_TransferConfig(hfmpi2c, DevAddress, 1, FMPI2C_AUTOEND_MODE, FMPI2C_GENERATE_STOP);
4599 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT);
4625void HAL_FMPI2C_EV_IRQHandler(FMPI2C_HandleTypeDef *hfmpi2c)
4628 uint32_t itflags = READ_REG(hfmpi2c->Instance->ISR);
4629 uint32_t itsources = READ_REG(hfmpi2c->Instance->CR1);
4632 if (hfmpi2c->XferISR != NULL)
4634 hfmpi2c->XferISR(hfmpi2c, itflags, itsources);
4644void HAL_FMPI2C_ER_IRQHandler(FMPI2C_HandleTypeDef *hfmpi2c)
4646 uint32_t itflags = READ_REG(hfmpi2c->Instance->ISR);
4647 uint32_t itsources = READ_REG(hfmpi2c->Instance->CR1);
4651 if ((FMPI2C_CHECK_FLAG(itflags, FMPI2C_FLAG_BERR) != RESET) && \
4652 (FMPI2C_CHECK_IT_SOURCE(itsources, FMPI2C_IT_ERRI) != RESET))
4654 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_BERR;
4657 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_BERR);
4661 if ((FMPI2C_CHECK_FLAG(itflags, FMPI2C_FLAG_OVR) != RESET) && \
4662 (FMPI2C_CHECK_IT_SOURCE(itsources, FMPI2C_IT_ERRI) != RESET))
4664 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_OVR;
4667 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_OVR);
4671 if ((FMPI2C_CHECK_FLAG(itflags, FMPI2C_FLAG_ARLO) != RESET) && \
4672 (FMPI2C_CHECK_IT_SOURCE(itsources, FMPI2C_IT_ERRI) != RESET))
4674 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_ARLO;
4677 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ARLO);
4681 tmperror = hfmpi2c->ErrorCode;
4684 if ((tmperror & (HAL_FMPI2C_ERROR_BERR | HAL_FMPI2C_ERROR_OVR | HAL_FMPI2C_ERROR_ARLO)) != HAL_FMPI2C_ERROR_NONE)
4686 FMPI2C_ITError(hfmpi2c, tmperror);
4696__weak
void HAL_FMPI2C_MasterTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4712__weak
void HAL_FMPI2C_MasterRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4727__weak
void HAL_FMPI2C_SlaveTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4743__weak
void HAL_FMPI2C_SlaveRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4761__weak
void HAL_FMPI2C_AddrCallback(FMPI2C_HandleTypeDef *hfmpi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
4765 UNUSED(TransferDirection);
4766 UNUSED(AddrMatchCode);
4779__weak
void HAL_FMPI2C_ListenCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4795__weak
void HAL_FMPI2C_MemTxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4811__weak
void HAL_FMPI2C_MemRxCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4827__weak
void HAL_FMPI2C_ErrorCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4843__weak
void HAL_FMPI2C_AbortCpltCallback(FMPI2C_HandleTypeDef *hfmpi2c)
4878HAL_FMPI2C_StateTypeDef HAL_FMPI2C_GetState(
const FMPI2C_HandleTypeDef *hfmpi2c)
4881 return hfmpi2c->State;
4890HAL_FMPI2C_ModeTypeDef HAL_FMPI2C_GetMode(
const FMPI2C_HandleTypeDef *hfmpi2c)
4892 return hfmpi2c->Mode;
4901uint32_t HAL_FMPI2C_GetError(
const FMPI2C_HandleTypeDef *hfmpi2c)
4903 return hfmpi2c->ErrorCode;
4926static HAL_StatusTypeDef FMPI2C_Master_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
4929 uint16_t devaddress;
4930 uint32_t tmpITFlags = ITFlags;
4935 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_AF) != RESET) && \
4936 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
4939 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
4944 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
4947 FMPI2C_Flush_TXDR(hfmpi2c);
4949 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_RXNE) != RESET) && \
4950 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_RXI) != RESET))
4953 tmpITFlags &= ~FMPI2C_FLAG_RXNE;
4956 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
4959 hfmpi2c->pBuffPtr++;
4961 hfmpi2c->XferSize--;
4962 hfmpi2c->XferCount--;
4964 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TC) == RESET) && \
4965 ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TXIS) != RESET) && \
4966 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TXI) != RESET)))
4969 if (hfmpi2c->XferCount != 0U)
4972 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
4975 hfmpi2c->pBuffPtr++;
4977 hfmpi2c->XferSize--;
4978 hfmpi2c->XferCount--;
4981 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TCR) != RESET) && \
4982 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
4984 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
4986 devaddress = (uint16_t)(hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
4988 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
4991 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
4993 hfmpi2c->XferSize = 1U;
4997 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
4999 FMPI2C_TransferConfig(hfmpi2c, devaddress, (uint8_t)hfmpi2c->XferSize, FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
5003 hfmpi2c->XferSize = hfmpi2c->XferCount;
5004 if (hfmpi2c->XferOptions != FMPI2C_NO_OPTION_FRAME)
5006 FMPI2C_TransferConfig(hfmpi2c, devaddress, (uint8_t)hfmpi2c->XferSize,
5007 hfmpi2c->XferOptions, FMPI2C_NO_STARTSTOP);
5011 FMPI2C_TransferConfig(hfmpi2c, devaddress, (uint8_t)hfmpi2c->XferSize,
5012 FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
5019 if (FMPI2C_GET_STOP_MODE(hfmpi2c) != FMPI2C_AUTOEND_MODE)
5022 FMPI2C_ITMasterSeqCplt(hfmpi2c);
5028 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5032 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TC) != RESET) && \
5033 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5035 if (hfmpi2c->XferCount == 0U)
5037 if (FMPI2C_GET_STOP_MODE(hfmpi2c) != FMPI2C_AUTOEND_MODE)
5040 if (hfmpi2c->XferOptions == FMPI2C_NO_OPTION_FRAME)
5043 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
5048 FMPI2C_ITMasterSeqCplt(hfmpi2c);
5056 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5064 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5065 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5068 FMPI2C_ITMasterCplt(hfmpi2c, tmpITFlags);
5085static HAL_StatusTypeDef FMPI2C_Mem_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
5088 uint32_t direction = FMPI2C_GENERATE_START_WRITE;
5089 uint32_t tmpITFlags = ITFlags;
5094 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_AF) != RESET) && \
5095 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
5098 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5103 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
5106 FMPI2C_Flush_TXDR(hfmpi2c);
5108 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_RXNE) != RESET) && \
5109 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_RXI) != RESET))
5112 tmpITFlags &= ~FMPI2C_FLAG_RXNE;
5115 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
5118 hfmpi2c->pBuffPtr++;
5120 hfmpi2c->XferSize--;
5121 hfmpi2c->XferCount--;
5123 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TXIS) != RESET) && \
5124 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TXI) != RESET))
5126 if (hfmpi2c->Memaddress == 0xFFFFFFFFU)
5129 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
5132 hfmpi2c->pBuffPtr++;
5134 hfmpi2c->XferSize--;
5135 hfmpi2c->XferCount--;
5140 hfmpi2c->Instance->TXDR = hfmpi2c->Memaddress;
5143 hfmpi2c->Memaddress = 0xFFFFFFFFU;
5146 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TCR) != RESET) && \
5147 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5149 if ((hfmpi2c->XferCount != 0U) && (hfmpi2c->XferSize == 0U))
5151 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
5154 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
5156 hfmpi2c->XferSize = 1U;
5160 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
5162 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5163 FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
5167 hfmpi2c->XferSize = hfmpi2c->XferCount;
5168 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5169 FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
5176 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5179 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TC) != RESET) && \
5180 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5183 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
5186 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
5188 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
5190 direction = FMPI2C_GENERATE_START_READ;
5193 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
5196 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
5198 hfmpi2c->XferSize = 1U;
5202 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
5206 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5207 FMPI2C_RELOAD_MODE, direction);
5211 hfmpi2c->XferSize = hfmpi2c->XferCount;
5214 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5215 FMPI2C_AUTOEND_MODE, direction);
5223 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5224 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5227 FMPI2C_ITMasterCplt(hfmpi2c, tmpITFlags);
5244static HAL_StatusTypeDef FMPI2C_Slave_ISR_IT(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
5247 uint32_t tmpoptions = hfmpi2c->XferOptions;
5248 uint32_t tmpITFlags = ITFlags;
5254 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5255 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5258 FMPI2C_ITSlaveCplt(hfmpi2c, tmpITFlags);
5260 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_AF) != RESET) && \
5261 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
5267 if (hfmpi2c->XferCount == 0U)
5269 if ((hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN) && (tmpoptions == FMPI2C_FIRST_AND_LAST_FRAME))
5274 FMPI2C_ITListenCplt(hfmpi2c, tmpITFlags);
5276 else if ((hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != FMPI2C_NO_OPTION_FRAME))
5279 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5282 FMPI2C_Flush_TXDR(hfmpi2c);
5286 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
5291 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5298 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5301 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
5303 if ((tmpoptions == FMPI2C_FIRST_FRAME) || (tmpoptions == FMPI2C_NEXT_FRAME))
5306 FMPI2C_ITError(hfmpi2c, hfmpi2c->ErrorCode);
5310 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_RXNE) != RESET) && \
5311 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_RXI) != RESET))
5313 if (hfmpi2c->XferCount > 0U)
5316 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
5319 hfmpi2c->pBuffPtr++;
5321 hfmpi2c->XferSize--;
5322 hfmpi2c->XferCount--;
5325 if ((hfmpi2c->XferCount == 0U) && \
5326 (tmpoptions != FMPI2C_NO_OPTION_FRAME))
5329 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
5332 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_ADDR) != RESET) && \
5333 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_ADDRI) != RESET))
5335 FMPI2C_ITAddrCplt(hfmpi2c, tmpITFlags);
5337 else if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_TXIS) != RESET) && \
5338 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TXI) != RESET))
5344 if (hfmpi2c->XferCount > 0U)
5347 hfmpi2c->Instance->TXDR = *hfmpi2c->pBuffPtr;
5350 hfmpi2c->pBuffPtr++;
5352 hfmpi2c->XferCount--;
5353 hfmpi2c->XferSize--;
5357 if ((tmpoptions == FMPI2C_NEXT_FRAME) || (tmpoptions == FMPI2C_FIRST_FRAME))
5361 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
5384static HAL_StatusTypeDef FMPI2C_Master_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
5387 uint16_t devaddress;
5393 if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_AF) != RESET) && \
5394 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
5397 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5400 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
5405 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT);
5408 FMPI2C_Flush_TXDR(hfmpi2c);
5410 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_TCR) != RESET) && \
5411 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5414 __HAL_FMPI2C_DISABLE_IT(hfmpi2c, FMPI2C_IT_TCI);
5416 if (hfmpi2c->XferCount != 0U)
5419 devaddress = (uint16_t)(hfmpi2c->Instance->CR2 & FMPI2C_CR2_SADD);
5422 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
5425 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
5427 hfmpi2c->XferSize = 1U;
5431 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
5433 xfermode = FMPI2C_RELOAD_MODE;
5437 hfmpi2c->XferSize = hfmpi2c->XferCount;
5438 if (hfmpi2c->XferOptions != FMPI2C_NO_OPTION_FRAME)
5440 xfermode = hfmpi2c->XferOptions;
5444 xfermode = FMPI2C_AUTOEND_MODE;
5449 FMPI2C_TransferConfig(hfmpi2c, devaddress, (uint8_t)hfmpi2c->XferSize, xfermode, FMPI2C_NO_STARTSTOP);
5452 hfmpi2c->XferCount -= hfmpi2c->XferSize;
5455 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
5457 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
5461 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
5467 if (FMPI2C_GET_STOP_MODE(hfmpi2c) != FMPI2C_AUTOEND_MODE)
5470 FMPI2C_ITMasterSeqCplt(hfmpi2c);
5476 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5480 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_TC) != RESET) && \
5481 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5483 if (hfmpi2c->XferCount == 0U)
5485 if (FMPI2C_GET_STOP_MODE(hfmpi2c) != FMPI2C_AUTOEND_MODE)
5488 if (hfmpi2c->XferOptions == FMPI2C_NO_OPTION_FRAME)
5491 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
5496 FMPI2C_ITMasterSeqCplt(hfmpi2c);
5504 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5507 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5508 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5511 FMPI2C_ITMasterCplt(hfmpi2c, ITFlags);
5532static HAL_StatusTypeDef FMPI2C_Mem_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
5535 uint32_t direction = FMPI2C_GENERATE_START_WRITE;
5540 if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_AF) != RESET) && \
5541 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
5544 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5547 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
5552 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT);
5555 FMPI2C_Flush_TXDR(hfmpi2c);
5557 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_TXIS) != RESET) && \
5558 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TXI) != RESET))
5561 hfmpi2c->Instance->TXDR = hfmpi2c->Memaddress;
5564 hfmpi2c->Memaddress = 0xFFFFFFFFU;
5566 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_TCR) != RESET) && \
5567 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5570 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
5573 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
5575 if (hfmpi2c->XferCount != 0U)
5578 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
5581 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
5583 hfmpi2c->XferSize = 1U;
5587 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
5589 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5590 FMPI2C_RELOAD_MODE, FMPI2C_NO_STARTSTOP);
5594 hfmpi2c->XferSize = hfmpi2c->XferCount;
5595 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5596 FMPI2C_AUTOEND_MODE, FMPI2C_NO_STARTSTOP);
5600 hfmpi2c->XferCount -= hfmpi2c->XferSize;
5603 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
5605 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
5609 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
5616 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_SIZE);
5619 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_TC) != RESET) && \
5620 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_TCI) != RESET))
5623 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
5626 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_ERROR_IT);
5628 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
5630 direction = FMPI2C_GENERATE_START_READ;
5633 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
5636 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
5638 hfmpi2c->XferSize = 1U;
5642 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
5646 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5647 FMPI2C_RELOAD_MODE, direction);
5651 hfmpi2c->XferSize = hfmpi2c->XferCount;
5654 FMPI2C_TransferConfig(hfmpi2c, (uint16_t)hfmpi2c->Devaddress, (uint8_t)hfmpi2c->XferSize,
5655 FMPI2C_AUTOEND_MODE, direction);
5659 hfmpi2c->XferCount -= hfmpi2c->XferSize;
5662 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
5664 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_RXDMAEN;
5668 hfmpi2c->Instance->CR1 |= FMPI2C_CR1_TXDMAEN;
5671 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5672 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5675 FMPI2C_ITMasterCplt(hfmpi2c, ITFlags);
5696static HAL_StatusTypeDef FMPI2C_Slave_ISR_DMA(
struct __FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags,
5699 uint32_t tmpoptions = hfmpi2c->XferOptions;
5700 uint32_t treatdmanack = 0U;
5701 HAL_FMPI2C_StateTypeDef tmpstate;
5707 if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_STOPF) != RESET) && \
5708 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_STOPI) != RESET))
5711 FMPI2C_ITSlaveCplt(hfmpi2c, ITFlags);
5713 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_AF) != RESET) && \
5714 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_NACKI) != RESET))
5720 if ((FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_CR1_TXDMAEN) != RESET) ||
5721 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_CR1_RXDMAEN) != RESET))
5724 if (hfmpi2c->hdmarx != NULL)
5726 if (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_CR1_RXDMAEN) != RESET)
5728 if (FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmarx) == 0U)
5736 if (hfmpi2c->hdmatx != NULL)
5738 if (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_CR1_TXDMAEN) != RESET)
5740 if (FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmatx) == 0U)
5747 if (treatdmanack == 1U)
5749 if ((hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN) && (tmpoptions == FMPI2C_FIRST_AND_LAST_FRAME))
5754 FMPI2C_ITListenCplt(hfmpi2c, ITFlags);
5756 else if ((hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != FMPI2C_NO_OPTION_FRAME))
5759 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5762 FMPI2C_Flush_TXDR(hfmpi2c);
5766 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
5771 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5778 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5781 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
5784 tmpstate = hfmpi2c->State;
5786 if ((tmpoptions == FMPI2C_FIRST_FRAME) || (tmpoptions == FMPI2C_NEXT_FRAME))
5788 if ((tmpstate == HAL_FMPI2C_STATE_BUSY_TX) || (tmpstate == HAL_FMPI2C_STATE_BUSY_TX_LISTEN))
5790 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_TX;
5792 else if ((tmpstate == HAL_FMPI2C_STATE_BUSY_RX) || (tmpstate == HAL_FMPI2C_STATE_BUSY_RX_LISTEN))
5794 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_RX;
5802 FMPI2C_ITError(hfmpi2c, hfmpi2c->ErrorCode);
5809 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
5812 else if ((FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_ADDR) != RESET) && \
5813 (FMPI2C_CHECK_IT_SOURCE(ITSources, FMPI2C_IT_ADDRI) != RESET))
5815 FMPI2C_ITAddrCplt(hfmpi2c, ITFlags);
5840static HAL_StatusTypeDef FMPI2C_RequestMemoryWrite(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress,
5841 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
5844 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_RELOAD_MODE, FMPI2C_GENERATE_START_WRITE);
5847 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
5853 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
5856 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
5862 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
5865 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
5871 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
5875 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TCR, RESET, Timeout, Tickstart) !=
HAL_OK)
5895static HAL_StatusTypeDef FMPI2C_RequestMemoryRead(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress,
5896 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
5899 FMPI2C_TransferConfig(hfmpi2c, DevAddress, (uint8_t)MemAddSize, FMPI2C_SOFTEND_MODE, FMPI2C_GENERATE_START_WRITE);
5902 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
5908 if (MemAddSize == FMPI2C_MEMADD_SIZE_8BIT)
5911 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
5917 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_MSB(MemAddress);
5920 if (FMPI2C_WaitOnTXISFlagUntilTimeout(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
5926 hfmpi2c->Instance->TXDR = FMPI2C_MEM_ADD_LSB(MemAddress);
5930 if (FMPI2C_WaitOnFlagUntilTimeout(hfmpi2c, FMPI2C_FLAG_TC, RESET, Timeout, Tickstart) !=
HAL_OK)
5944static void FMPI2C_ITAddrCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags)
5946 uint8_t transferdirection;
5947 uint16_t slaveaddrcode;
5948 uint16_t ownadd1code;
5949 uint16_t ownadd2code;
5955 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) == (uint32_t)HAL_FMPI2C_STATE_LISTEN)
5957 transferdirection = FMPI2C_GET_DIR(hfmpi2c);
5958 slaveaddrcode = FMPI2C_GET_ADDR_MATCH(hfmpi2c);
5959 ownadd1code = FMPI2C_GET_OWN_ADDRESS1(hfmpi2c);
5960 ownadd2code = FMPI2C_GET_OWN_ADDRESS2(hfmpi2c);
5963 if (hfmpi2c->Init.AddressingMode == FMPI2C_ADDRESSINGMODE_10BIT)
5965 if ((slaveaddrcode & SLAVE_ADDR_MSK) == ((ownadd1code >> SLAVE_ADDR_SHIFT) & SLAVE_ADDR_MSK))
5967 slaveaddrcode = ownadd1code;
5968 hfmpi2c->AddrEventCount++;
5969 if (hfmpi2c->AddrEventCount == 2U)
5972 hfmpi2c->AddrEventCount = 0U;
5975 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
5981#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
5982 hfmpi2c->AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
5984 HAL_FMPI2C_AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
5990 slaveaddrcode = ownadd2code;
5993 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
5999#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6000 hfmpi2c->AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
6002 HAL_FMPI2C_AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
6010 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT);
6016#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6017 hfmpi2c->AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
6019 HAL_FMPI2C_AddrCallback(hfmpi2c, transferdirection, slaveaddrcode);
6027 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ADDR);
6039static void FMPI2C_ITMasterSeqCplt(FMPI2C_HandleTypeDef *hfmpi2c)
6042 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6046 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX)
6048 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6049 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_TX;
6050 hfmpi2c->XferISR = NULL;
6053 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
6059#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6060 hfmpi2c->MasterTxCpltCallback(hfmpi2c);
6062 HAL_FMPI2C_MasterTxCpltCallback(hfmpi2c);
6068 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6069 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_RX;
6070 hfmpi2c->XferISR = NULL;
6073 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
6079#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6080 hfmpi2c->MasterRxCpltCallback(hfmpi2c);
6082 HAL_FMPI2C_MasterRxCpltCallback(hfmpi2c);
6092static void FMPI2C_ITSlaveSeqCplt(FMPI2C_HandleTypeDef *hfmpi2c)
6094 uint32_t tmpcr1value = READ_REG(hfmpi2c->Instance->CR1);
6097 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6100 if (FMPI2C_CHECK_IT_SOURCE(tmpcr1value, FMPI2C_CR1_TXDMAEN) != RESET)
6103 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
6105 else if (FMPI2C_CHECK_IT_SOURCE(tmpcr1value, FMPI2C_CR1_RXDMAEN) != RESET)
6108 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
6115 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN)
6118 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
6119 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_TX;
6122 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
6128#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6129 hfmpi2c->SlaveTxCpltCallback(hfmpi2c);
6131 HAL_FMPI2C_SlaveTxCpltCallback(hfmpi2c);
6135 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX_LISTEN)
6138 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
6139 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_RX;
6142 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
6148#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6149 hfmpi2c->SlaveRxCpltCallback(hfmpi2c);
6151 HAL_FMPI2C_SlaveRxCpltCallback(hfmpi2c);
6166static void FMPI2C_ITMasterCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags)
6169 uint32_t tmpITFlags = ITFlags;
6170 __IO uint32_t tmpreg;
6173 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
6176 if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX)
6178 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_TX_IT);
6179 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_TX;
6181 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
6183 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT);
6184 hfmpi2c->PreviousState = FMPI2C_STATE_MASTER_BUSY_RX;
6192 FMPI2C_RESET_CR2(hfmpi2c);
6195 hfmpi2c->XferISR = NULL;
6196 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
6198 if (FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_AF) != RESET)
6201 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6204 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
6208 if ((hfmpi2c->State == HAL_FMPI2C_STATE_ABORT) && (FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_RXNE) != RESET))
6211 tmpreg = (uint8_t)hfmpi2c->Instance->RXDR;
6216 FMPI2C_Flush_TXDR(hfmpi2c);
6219 tmperror = hfmpi2c->ErrorCode;
6222 if ((hfmpi2c->State == HAL_FMPI2C_STATE_ABORT) || (tmperror != HAL_FMPI2C_ERROR_NONE))
6225 FMPI2C_ITError(hfmpi2c, hfmpi2c->ErrorCode);
6228 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX)
6230 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6231 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6233 if (hfmpi2c->Mode == HAL_FMPI2C_MODE_MEM)
6235 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6241#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6242 hfmpi2c->MemTxCpltCallback(hfmpi2c);
6244 HAL_FMPI2C_MemTxCpltCallback(hfmpi2c);
6249 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6255#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6256 hfmpi2c->MasterTxCpltCallback(hfmpi2c);
6258 HAL_FMPI2C_MasterTxCpltCallback(hfmpi2c);
6263 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
6265 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6266 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6268 if (hfmpi2c->Mode == HAL_FMPI2C_MODE_MEM)
6270 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6276#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6277 hfmpi2c->MemRxCpltCallback(hfmpi2c);
6279 HAL_FMPI2C_MemRxCpltCallback(hfmpi2c);
6284 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6290#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6291 hfmpi2c->MasterRxCpltCallback(hfmpi2c);
6293 HAL_FMPI2C_MasterRxCpltCallback(hfmpi2c);
6309static void FMPI2C_ITSlaveCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags)
6311 uint32_t tmpcr1value = READ_REG(hfmpi2c->Instance->CR1);
6312 uint32_t tmpITFlags = ITFlags;
6313 uint32_t tmpoptions = hfmpi2c->XferOptions;
6314 HAL_FMPI2C_StateTypeDef tmpstate = hfmpi2c->State;
6317 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
6320 if ((tmpstate == HAL_FMPI2C_STATE_BUSY_TX) || (tmpstate == HAL_FMPI2C_STATE_BUSY_TX_LISTEN))
6322 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_TX_IT);
6323 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_TX;
6325 else if ((tmpstate == HAL_FMPI2C_STATE_BUSY_RX) || (tmpstate == HAL_FMPI2C_STATE_BUSY_RX_LISTEN))
6327 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_RX_IT);
6328 hfmpi2c->PreviousState = FMPI2C_STATE_SLAVE_BUSY_RX;
6330 else if (tmpstate == HAL_FMPI2C_STATE_LISTEN)
6332 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_TX_IT | FMPI2C_XFER_RX_IT);
6333 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6341 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
6344 FMPI2C_RESET_CR2(hfmpi2c);
6347 FMPI2C_Flush_TXDR(hfmpi2c);
6350 if (FMPI2C_CHECK_IT_SOURCE(tmpcr1value, FMPI2C_CR1_TXDMAEN) != RESET)
6353 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
6355 if (hfmpi2c->hdmatx != NULL)
6357 hfmpi2c->XferCount = (uint16_t)FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmatx);
6360 else if (FMPI2C_CHECK_IT_SOURCE(tmpcr1value, FMPI2C_CR1_RXDMAEN) != RESET)
6363 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
6365 if (hfmpi2c->hdmarx != NULL)
6367 hfmpi2c->XferCount = (uint16_t)FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmarx);
6376 if (FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_RXNE) != RESET)
6379 tmpITFlags &= ~FMPI2C_FLAG_RXNE;
6382 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
6385 hfmpi2c->pBuffPtr++;
6387 if ((hfmpi2c->XferSize > 0U))
6389 hfmpi2c->XferSize--;
6390 hfmpi2c->XferCount--;
6395 if (hfmpi2c->XferCount != 0U)
6398 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
6401 if ((FMPI2C_CHECK_FLAG(tmpITFlags, FMPI2C_FLAG_AF) != RESET) && \
6402 (FMPI2C_CHECK_IT_SOURCE(tmpcr1value, FMPI2C_IT_NACKI) != RESET))
6408 if (hfmpi2c->XferCount == 0U)
6410 if ((hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN) && (tmpoptions == FMPI2C_FIRST_AND_LAST_FRAME))
6415 FMPI2C_ITListenCplt(hfmpi2c, tmpITFlags);
6417 else if ((hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != FMPI2C_NO_OPTION_FRAME))
6420 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6423 FMPI2C_Flush_TXDR(hfmpi2c);
6427 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
6432 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6439 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6442 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
6444 if ((tmpoptions == FMPI2C_FIRST_FRAME) || (tmpoptions == FMPI2C_NEXT_FRAME))
6447 FMPI2C_ITError(hfmpi2c, hfmpi2c->ErrorCode);
6452 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6453 hfmpi2c->XferISR = NULL;
6455 if (hfmpi2c->ErrorCode != HAL_FMPI2C_ERROR_NONE)
6458 FMPI2C_ITError(hfmpi2c, hfmpi2c->ErrorCode);
6461 if (hfmpi2c->State == HAL_FMPI2C_STATE_LISTEN)
6464 FMPI2C_ITListenCplt(hfmpi2c, tmpITFlags);
6467 else if (hfmpi2c->XferOptions != FMPI2C_NO_OPTION_FRAME)
6470 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
6472 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
6473 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6474 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6480#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6481 hfmpi2c->ListenCpltCallback(hfmpi2c);
6483 HAL_FMPI2C_ListenCpltCallback(hfmpi2c);
6487 else if (hfmpi2c->State == HAL_FMPI2C_STATE_BUSY_RX)
6489 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6490 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6496#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6497 hfmpi2c->SlaveRxCpltCallback(hfmpi2c);
6499 HAL_FMPI2C_SlaveRxCpltCallback(hfmpi2c);
6504 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6505 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6511#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6512 hfmpi2c->SlaveTxCpltCallback(hfmpi2c);
6514 HAL_FMPI2C_SlaveTxCpltCallback(hfmpi2c);
6525static void FMPI2C_ITListenCplt(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ITFlags)
6528 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
6529 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6530 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6531 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6532 hfmpi2c->XferISR = NULL;
6535 if (FMPI2C_CHECK_FLAG(ITFlags, FMPI2C_FLAG_RXNE) != RESET)
6538 *hfmpi2c->pBuffPtr = (uint8_t)hfmpi2c->Instance->RXDR;
6541 hfmpi2c->pBuffPtr++;
6543 if ((hfmpi2c->XferSize > 0U))
6545 hfmpi2c->XferSize--;
6546 hfmpi2c->XferCount--;
6549 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
6554 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_RX_IT | FMPI2C_XFER_TX_IT);
6557 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6563#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6564 hfmpi2c->ListenCpltCallback(hfmpi2c);
6566 HAL_FMPI2C_ListenCpltCallback(hfmpi2c);
6576static void FMPI2C_ITError(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t ErrorCode)
6578 HAL_FMPI2C_StateTypeDef tmpstate = hfmpi2c->State;
6580 uint32_t tmppreviousstate;
6583 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
6584 hfmpi2c->XferOptions = FMPI2C_NO_OPTION_FRAME;
6585 hfmpi2c->XferCount = 0U;
6588 hfmpi2c->ErrorCode |= ErrorCode;
6591 if ((tmpstate == HAL_FMPI2C_STATE_LISTEN) ||
6592 (tmpstate == HAL_FMPI2C_STATE_BUSY_TX_LISTEN) ||
6593 (tmpstate == HAL_FMPI2C_STATE_BUSY_RX_LISTEN))
6596 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_RX_IT | FMPI2C_XFER_TX_IT);
6599 hfmpi2c->State = HAL_FMPI2C_STATE_LISTEN;
6600 hfmpi2c->XferISR = FMPI2C_Slave_ISR_IT;
6605 FMPI2C_Disable_IRQ(hfmpi2c, FMPI2C_XFER_LISTEN_IT | FMPI2C_XFER_RX_IT | FMPI2C_XFER_TX_IT);
6608 FMPI2C_Flush_TXDR(hfmpi2c);
6612 if (hfmpi2c->State != HAL_FMPI2C_STATE_ABORT)
6615 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6618 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET)
6620 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)
6622 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
6623 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_AF;
6627 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
6631 hfmpi2c->XferISR = NULL;
6635 tmppreviousstate = hfmpi2c->PreviousState;
6637 if ((hfmpi2c->hdmatx != NULL) && ((tmppreviousstate == FMPI2C_STATE_MASTER_BUSY_TX) || \
6638 (tmppreviousstate == FMPI2C_STATE_SLAVE_BUSY_TX)))
6640 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_TXDMAEN) == FMPI2C_CR1_TXDMAEN)
6642 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
6649 hfmpi2c->hdmatx->XferAbortCallback = FMPI2C_DMAAbort;
6658 hfmpi2c->hdmatx->XferAbortCallback(hfmpi2c->hdmatx);
6663 FMPI2C_TreatErrorCallback(hfmpi2c);
6667 else if ((hfmpi2c->hdmarx != NULL) && ((tmppreviousstate == FMPI2C_STATE_MASTER_BUSY_RX) || \
6668 (tmppreviousstate == FMPI2C_STATE_SLAVE_BUSY_RX)))
6670 if ((hfmpi2c->Instance->CR1 & FMPI2C_CR1_RXDMAEN) == FMPI2C_CR1_RXDMAEN)
6672 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
6679 hfmpi2c->hdmarx->XferAbortCallback = FMPI2C_DMAAbort;
6688 hfmpi2c->hdmarx->XferAbortCallback(hfmpi2c->hdmarx);
6693 FMPI2C_TreatErrorCallback(hfmpi2c);
6698 FMPI2C_TreatErrorCallback(hfmpi2c);
6707static void FMPI2C_TreatErrorCallback(FMPI2C_HandleTypeDef *hfmpi2c)
6709 if (hfmpi2c->State == HAL_FMPI2C_STATE_ABORT)
6711 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
6712 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6718#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6719 hfmpi2c->AbortCpltCallback(hfmpi2c);
6721 HAL_FMPI2C_AbortCpltCallback(hfmpi2c);
6726 hfmpi2c->PreviousState = FMPI2C_STATE_NONE;
6732#if (USE_HAL_FMPI2C_REGISTER_CALLBACKS == 1)
6733 hfmpi2c->ErrorCallback(hfmpi2c);
6735 HAL_FMPI2C_ErrorCallback(hfmpi2c);
6745static void FMPI2C_Flush_TXDR(FMPI2C_HandleTypeDef *hfmpi2c)
6749 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) != RESET)
6751 hfmpi2c->Instance->TXDR = 0x00U;
6755 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXE) == RESET)
6757 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_TXE);
6769 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6772 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
6775 if (hfmpi2c->XferCount == 0U)
6778 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT);
6784 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
6787 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
6789 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
6793 hfmpi2c->XferSize = hfmpi2c->XferCount;
6797 if (
HAL_DMA_Start_IT(hfmpi2c->hdmatx, (uint32_t)hfmpi2c->pBuffPtr, (uint32_t)&hfmpi2c->Instance->TXDR,
6798 hfmpi2c->XferSize) !=
HAL_OK)
6801 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_DMA);
6806 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RELOAD_IT);
6820 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6821 uint32_t tmpoptions = hfmpi2c->XferOptions;
6823 if ((tmpoptions == FMPI2C_NEXT_FRAME) || (tmpoptions == FMPI2C_FIRST_FRAME))
6826 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_TXDMAEN;
6830 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
6849 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6852 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
6855 if (hfmpi2c->XferCount == 0U)
6858 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_CPLT_IT);
6864 hfmpi2c->pBuffPtr += hfmpi2c->XferSize;
6867 if (hfmpi2c->XferCount > MAX_NBYTE_SIZE)
6870 if (FMPI2C_GET_DIR(hfmpi2c) == FMPI2C_DIRECTION_RECEIVE)
6872 hfmpi2c->XferSize = 1U;
6876 hfmpi2c->XferSize = MAX_NBYTE_SIZE;
6881 hfmpi2c->XferSize = hfmpi2c->XferCount;
6885 if (
HAL_DMA_Start_IT(hfmpi2c->hdmarx, (uint32_t)&hfmpi2c->Instance->RXDR, (uint32_t)hfmpi2c->pBuffPtr,
6886 hfmpi2c->XferSize) !=
HAL_OK)
6889 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_DMA);
6894 FMPI2C_Enable_IRQ(hfmpi2c, FMPI2C_XFER_RELOAD_IT);
6908 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6909 uint32_t tmpoptions = hfmpi2c->XferOptions;
6911 if ((FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmarx) == 0U) && \
6912 (tmpoptions != FMPI2C_NO_OPTION_FRAME))
6915 hfmpi2c->Instance->CR1 &= ~FMPI2C_CR1_RXDMAEN;
6918 FMPI2C_ITSlaveSeqCplt(hfmpi2c);
6936 uint32_t treatdmaerror = 0U;
6938 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6940 if (hfmpi2c->hdmatx != NULL)
6942 if (FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmatx) == 0U)
6948 if (hfmpi2c->hdmarx != NULL)
6950 if (FMPI2C_GET_DMA_REMAIN_DATA(hfmpi2c->hdmarx) == 0U)
6960 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_NACK;
6963 FMPI2C_ITError(hfmpi2c, HAL_FMPI2C_ERROR_DMA);
6977 FMPI2C_HandleTypeDef *hfmpi2c = (FMPI2C_HandleTypeDef *)(((
DMA_HandleTypeDef *)hdma)->Parent);
6980 if (hfmpi2c->hdmatx != NULL)
6982 hfmpi2c->hdmatx->XferAbortCallback = NULL;
6984 if (hfmpi2c->hdmarx != NULL)
6986 hfmpi2c->hdmarx->XferAbortCallback = NULL;
6989 FMPI2C_TreatErrorCallback(hfmpi2c);
7004static HAL_StatusTypeDef FMPI2C_WaitOnFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Flag, FlagStatus Status,
7005 uint32_t Timeout, uint32_t Tickstart)
7007 while (__HAL_FMPI2C_GET_FLAG(hfmpi2c, Flag) == Status)
7010 if (FMPI2C_IsErrorOccurred(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
7018 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7020 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, Flag) == Status))
7022 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
7023 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7024 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
7044static HAL_StatusTypeDef FMPI2C_WaitOnTXISFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
7047 while (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == RESET)
7050 if (FMPI2C_IsErrorOccurred(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
7058 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7060 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_TXIS) == RESET))
7062 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
7063 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7064 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
7085static HAL_StatusTypeDef FMPI2C_WaitOnSTOPFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
7088 while (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET)
7091 if (FMPI2C_IsErrorOccurred(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
7097 if (((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7099 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET))
7101 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
7102 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7103 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
7123static HAL_StatusTypeDef FMPI2C_WaitOnRXNEFlagUntilTimeout(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout,
7128 while ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == RESET) && (status ==
HAL_OK))
7131 if (FMPI2C_IsErrorOccurred(hfmpi2c, Timeout, Tickstart) !=
HAL_OK)
7137 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == SET) && (status ==
HAL_OK))
7141 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == SET) && (hfmpi2c->XferSize > 0U))
7149 if (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_AF) == SET)
7151 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
7152 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_AF;
7155 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
7158 FMPI2C_RESET_CR2(hfmpi2c);
7160 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7161 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
7170 hfmpi2c->ErrorCode = HAL_FMPI2C_ERROR_NONE;
7175 if ((((
HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) && (status ==
HAL_OK))
7177 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_RXNE) == RESET))
7179 hfmpi2c->ErrorCode |= HAL_FMPI2C_ERROR_TIMEOUT;
7180 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7200static HAL_StatusTypeDef FMPI2C_IsErrorOccurred(FMPI2C_HandleTypeDef *hfmpi2c, uint32_t Timeout, uint32_t Tickstart)
7203 uint32_t itflag = hfmpi2c->Instance->ISR;
7204 uint32_t error_code = 0;
7205 uint32_t tickstart = Tickstart;
7207 HAL_FMPI2C_ModeTypeDef tmp2;
7212 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_AF);
7216 while ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET) && (status ==
HAL_OK))
7221 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
7223 tmp1 = (uint32_t)(hfmpi2c->Instance->CR2 & FMPI2C_CR2_STOP);
7224 tmp2 = hfmpi2c->Mode;
7227 if ((__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_BUSY) != RESET) && \
7228 (tmp1 != FMPI2C_CR2_STOP) && \
7229 (tmp2 != HAL_FMPI2C_MODE_SLAVE))
7232 hfmpi2c->Instance->CR2 |= FMPI2C_CR2_STOP;
7238 while (__HAL_FMPI2C_GET_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF) == RESET)
7241 if ((
HAL_GetTick() - tickstart) > FMPI2C_TIMEOUT_STOPF)
7243 error_code |= HAL_FMPI2C_ERROR_TIMEOUT;
7258 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_STOPF);
7261 error_code |= HAL_FMPI2C_ERROR_AF;
7267 itflag = hfmpi2c->Instance->ISR;
7273 error_code |= HAL_FMPI2C_ERROR_BERR;
7276 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_BERR);
7284 error_code |= HAL_FMPI2C_ERROR_OVR;
7287 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_OVR);
7295 error_code |= HAL_FMPI2C_ERROR_ARLO;
7298 __HAL_FMPI2C_CLEAR_FLAG(hfmpi2c, FMPI2C_FLAG_ARLO);
7306 FMPI2C_Flush_TXDR(hfmpi2c);
7309 FMPI2C_RESET_CR2(hfmpi2c);
7311 hfmpi2c->ErrorCode |= error_code;
7312 hfmpi2c->State = HAL_FMPI2C_STATE_READY;
7313 hfmpi2c->Mode = HAL_FMPI2C_MODE_NONE;
7341static void FMPI2C_TransferConfig(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode,
7345 assert_param(IS_FMPI2C_ALL_INSTANCE(hfmpi2c->Instance));
7350 uint32_t tmp = ((uint32_t)(((uint32_t)DevAddress & FMPI2C_CR2_SADD) | \
7351 (((uint32_t)Size << FMPI2C_CR2_NBYTES_Pos) & FMPI2C_CR2_NBYTES) | \
7352 (uint32_t)Mode | (uint32_t)Request) & (~0x80000000U));
7355 MODIFY_REG(hfmpi2c->Instance->CR2, \
7356 ((FMPI2C_CR2_SADD | FMPI2C_CR2_NBYTES | FMPI2C_CR2_RELOAD | FMPI2C_CR2_AUTOEND | \
7357 (FMPI2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - FMPI2C_CR2_RD_WRN_Pos))) | \
7358 FMPI2C_CR2_START | FMPI2C_CR2_STOP)), tmp);
7368static void FMPI2C_Enable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest)
7370 uint32_t tmpisr = 0U;
7372 if ((hfmpi2c->XferISR != FMPI2C_Master_ISR_DMA) && \
7373 (hfmpi2c->XferISR != FMPI2C_Slave_ISR_DMA) && \
7374 (hfmpi2c->XferISR != FMPI2C_Mem_ISR_DMA))
7376 if ((InterruptRequest & FMPI2C_XFER_LISTEN_IT) == FMPI2C_XFER_LISTEN_IT)
7379 tmpisr |= FMPI2C_IT_ADDRI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ERRI;
7382 if ((InterruptRequest & FMPI2C_XFER_TX_IT) == FMPI2C_XFER_TX_IT)
7385 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_TXI;
7388 if ((InterruptRequest & FMPI2C_XFER_RX_IT) == FMPI2C_XFER_RX_IT)
7391 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_RXI;
7394 if (InterruptRequest == FMPI2C_XFER_ERROR_IT)
7397 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_NACKI;
7400 if (InterruptRequest == FMPI2C_XFER_CPLT_IT)
7403 tmpisr |= FMPI2C_IT_STOPI;
7409 if ((InterruptRequest & FMPI2C_XFER_LISTEN_IT) == FMPI2C_XFER_LISTEN_IT)
7412 tmpisr |= FMPI2C_IT_ADDRI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ERRI;
7415 if ((InterruptRequest & FMPI2C_XFER_TX_IT) == FMPI2C_XFER_TX_IT)
7418 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_TXI;
7421 if ((InterruptRequest & FMPI2C_XFER_RX_IT) == FMPI2C_XFER_RX_IT)
7424 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_TCI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_RXI;
7427 if (InterruptRequest == FMPI2C_XFER_ERROR_IT)
7430 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_NACKI;
7433 if (InterruptRequest == FMPI2C_XFER_CPLT_IT)
7436 tmpisr |= (FMPI2C_IT_STOPI | FMPI2C_IT_TCI);
7439 if (InterruptRequest == FMPI2C_XFER_RELOAD_IT)
7442 tmpisr |= FMPI2C_IT_TCI;
7449 __HAL_FMPI2C_ENABLE_IT(hfmpi2c, tmpisr);
7459static void FMPI2C_Disable_IRQ(FMPI2C_HandleTypeDef *hfmpi2c, uint16_t InterruptRequest)
7461 uint32_t tmpisr = 0U;
7463 if ((InterruptRequest & FMPI2C_XFER_TX_IT) == FMPI2C_XFER_TX_IT)
7466 tmpisr |= FMPI2C_IT_TCI | FMPI2C_IT_TXI;
7468 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) != (uint32_t)HAL_FMPI2C_STATE_LISTEN)
7471 tmpisr |= FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ERRI;
7475 if ((InterruptRequest & FMPI2C_XFER_RX_IT) == FMPI2C_XFER_RX_IT)
7478 tmpisr |= FMPI2C_IT_TCI | FMPI2C_IT_RXI;
7480 if (((uint32_t)hfmpi2c->State & (uint32_t)HAL_FMPI2C_STATE_LISTEN) != (uint32_t)HAL_FMPI2C_STATE_LISTEN)
7483 tmpisr |= FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ERRI;
7487 if ((InterruptRequest & FMPI2C_XFER_LISTEN_IT) == FMPI2C_XFER_LISTEN_IT)
7490 tmpisr |= FMPI2C_IT_ADDRI | FMPI2C_IT_STOPI | FMPI2C_IT_NACKI | FMPI2C_IT_ERRI;
7493 if (InterruptRequest == FMPI2C_XFER_ERROR_IT)
7496 tmpisr |= FMPI2C_IT_ERRI | FMPI2C_IT_NACKI;
7499 if (InterruptRequest == FMPI2C_XFER_CPLT_IT)
7502 tmpisr |= FMPI2C_IT_STOPI;
7505 if (InterruptRequest == FMPI2C_XFER_RELOAD_IT)
7508 tmpisr |= FMPI2C_IT_TCI;
7514 __HAL_FMPI2C_DISABLE_IT(hfmpi2c, tmpisr);
7522static void FMPI2C_ConvertOtherXferOptions(FMPI2C_HandleTypeDef *hfmpi2c)
7527 if (hfmpi2c->XferOptions == FMPI2C_OTHER_FRAME)
7529 hfmpi2c->XferOptions = FMPI2C_FIRST_FRAME;
7535 else if (hfmpi2c->XferOptions == FMPI2C_OTHER_AND_LAST_FRAME)
7537 hfmpi2c->XferOptions = FMPI2C_FIRST_AND_LAST_FRAME;
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)
HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma)
struct __DMA_HandleTypeDef DMA_HandleTypeDef
DMA handle Structure definition.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
#define HAL_IS_BIT_SET(REG, BIT)
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)