184#ifdef HAL_FMPSMBUS_MODULE_ENABLED
186#if defined(FMPI2C_CR1_PE)
192#define TIMING_CLEAR_MASK (0xF0FFFFFFUL)
193#define HAL_TIMEOUT_ADDR (10000U)
194#define HAL_TIMEOUT_BUSY (25U)
195#define HAL_TIMEOUT_DIR (25U)
196#define HAL_TIMEOUT_RXNE (25U)
197#define HAL_TIMEOUT_STOPF (25U)
198#define HAL_TIMEOUT_TC (25U)
199#define HAL_TIMEOUT_TCR (25U)
200#define HAL_TIMEOUT_TXIS (25U)
201#define MAX_NBYTE_SIZE 255U
213static HAL_StatusTypeDef FMPSMBUS_WaitOnFlagUntilTimeout(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t Flag,
214 FlagStatus Status, uint32_t Timeout);
217static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags);
218static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags);
219static void FMPSMBUS_ITErrorHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus);
222static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
223static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
226static void FMPSMBUS_Flush_TXDR(FMPSMBUS_HandleTypeDef *hfmpsmbus);
229static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size,
230 uint32_t Mode, uint32_t Request);
233static void FMPSMBUS_ConvertOtherXferOptions(FMPSMBUS_HandleTypeDef *hfmpsmbus);
293 if (hfmpsmbus == NULL)
299 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
300 assert_param(IS_FMPSMBUS_ANALOG_FILTER(hfmpsmbus->Init.AnalogFilter));
301 assert_param(IS_FMPSMBUS_OWN_ADDRESS1(hfmpsmbus->Init.OwnAddress1));
302 assert_param(IS_FMPSMBUS_ADDRESSING_MODE(hfmpsmbus->Init.AddressingMode));
303 assert_param(IS_FMPSMBUS_DUAL_ADDRESS(hfmpsmbus->Init.DualAddressMode));
304 assert_param(IS_FMPSMBUS_OWN_ADDRESS2(hfmpsmbus->Init.OwnAddress2));
305 assert_param(IS_FMPSMBUS_OWN_ADDRESS2_MASK(hfmpsmbus->Init.OwnAddress2Masks));
306 assert_param(IS_FMPSMBUS_GENERAL_CALL(hfmpsmbus->Init.GeneralCallMode));
307 assert_param(IS_FMPSMBUS_NO_STRETCH(hfmpsmbus->Init.NoStretchMode));
308 assert_param(IS_FMPSMBUS_PEC(hfmpsmbus->Init.PacketErrorCheckMode));
309 assert_param(IS_FMPSMBUS_PERIPHERAL_MODE(hfmpsmbus->Init.PeripheralMode));
311 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_RESET)
316#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
317 hfmpsmbus->MasterTxCpltCallback = HAL_FMPSMBUS_MasterTxCpltCallback;
318 hfmpsmbus->MasterRxCpltCallback = HAL_FMPSMBUS_MasterRxCpltCallback;
319 hfmpsmbus->SlaveTxCpltCallback = HAL_FMPSMBUS_SlaveTxCpltCallback;
320 hfmpsmbus->SlaveRxCpltCallback = HAL_FMPSMBUS_SlaveRxCpltCallback;
321 hfmpsmbus->ListenCpltCallback = HAL_FMPSMBUS_ListenCpltCallback;
322 hfmpsmbus->ErrorCallback = HAL_FMPSMBUS_ErrorCallback;
323 hfmpsmbus->AddrCallback = HAL_FMPSMBUS_AddrCallback;
325 if (hfmpsmbus->MspInitCallback == NULL)
327 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit;
331 hfmpsmbus->MspInitCallback(hfmpsmbus);
334 HAL_FMPSMBUS_MspInit(hfmpsmbus);
338 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
341 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
345 hfmpsmbus->Instance->TIMINGR = hfmpsmbus->Init.Timing & TIMING_CLEAR_MASK;
349 hfmpsmbus->Instance->TIMEOUTR &= ~FMPI2C_TIMEOUTR_TIMOUTEN;
350 hfmpsmbus->Instance->TIMEOUTR &= ~FMPI2C_TIMEOUTR_TEXTEN;
351 hfmpsmbus->Instance->TIMEOUTR = hfmpsmbus->Init.SMBusTimeout;
355 hfmpsmbus->Instance->OAR1 &= ~FMPI2C_OAR1_OA1EN;
357 if (hfmpsmbus->Init.OwnAddress1 != 0UL)
359 if (hfmpsmbus->Init.AddressingMode == FMPSMBUS_ADDRESSINGMODE_7BIT)
361 hfmpsmbus->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | hfmpsmbus->Init.OwnAddress1);
365 hfmpsmbus->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | FMPI2C_OAR1_OA1MODE | hfmpsmbus->Init.OwnAddress1);
371 if (hfmpsmbus->Init.AddressingMode == FMPSMBUS_ADDRESSINGMODE_10BIT)
373 hfmpsmbus->Instance->CR2 = (FMPI2C_CR2_ADD10);
377 hfmpsmbus->Instance->CR2 |= (FMPI2C_CR2_AUTOEND | FMPI2C_CR2_NACK);
381 hfmpsmbus->Instance->OAR2 = (hfmpsmbus->Init.DualAddressMode | hfmpsmbus->Init.OwnAddress2 | \
382 (hfmpsmbus->Init.OwnAddress2Masks << 8U));
386 hfmpsmbus->Instance->CR1 = (hfmpsmbus->Init.GeneralCallMode | hfmpsmbus->Init.NoStretchMode | \
387 hfmpsmbus->Init.PacketErrorCheckMode | hfmpsmbus->Init.PeripheralMode | \
388 hfmpsmbus->Init.AnalogFilter);
392 if ((hfmpsmbus->Init.PacketErrorCheckMode == FMPSMBUS_PEC_ENABLE) && \
393 ((hfmpsmbus->Init.PeripheralMode == FMPSMBUS_PERIPHERAL_MODE_FMPSMBUS_SLAVE) || \
394 (hfmpsmbus->Init.PeripheralMode == FMPSMBUS_PERIPHERAL_MODE_FMPSMBUS_SLAVE_ARP)))
396 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
400 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
402 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
403 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_READY;
404 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
418 if (hfmpsmbus == NULL)
424 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
426 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
429 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
431#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
432 if (hfmpsmbus->MspDeInitCallback == NULL)
434 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit;
438 hfmpsmbus->MspDeInitCallback(hfmpsmbus);
441 HAL_FMPSMBUS_MspDeInit(hfmpsmbus);
444 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
445 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_RESET;
446 hfmpsmbus->State = HAL_FMPSMBUS_STATE_RESET;
460__weak
void HAL_FMPSMBUS_MspInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
476__weak
void HAL_FMPSMBUS_MspDeInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
495HAL_StatusTypeDef HAL_FMPSMBUS_ConfigAnalogFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t AnalogFilter)
498 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
501 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
506 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
509 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
512 hfmpsmbus->Instance->CR1 &= ~(FMPI2C_CR1_ANFOFF);
515 hfmpsmbus->Instance->CR1 |= AnalogFilter;
517 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
519 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
539HAL_StatusTypeDef HAL_FMPSMBUS_ConfigDigitalFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t DigitalFilter)
544 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
545 assert_param(IS_FMPSMBUS_DIGITAL_FILTER(DigitalFilter));
547 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
552 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
555 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
558 tmpreg = hfmpsmbus->Instance->CR1;
561 tmpreg &= ~(FMPI2C_CR1_DNF);
564 tmpreg |= DigitalFilter << FMPI2C_CR1_DNF_Pos;
567 hfmpsmbus->Instance->CR1 = tmpreg;
569 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
571 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
584#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
606HAL_StatusTypeDef HAL_FMPSMBUS_RegisterCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus,
607 HAL_FMPSMBUS_CallbackIDTypeDef CallbackID,
608 pFMPSMBUS_CallbackTypeDef pCallback)
612 if (pCallback == NULL)
615 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
620 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
624 case HAL_FMPSMBUS_MASTER_TX_COMPLETE_CB_ID :
625 hfmpsmbus->MasterTxCpltCallback = pCallback;
628 case HAL_FMPSMBUS_MASTER_RX_COMPLETE_CB_ID :
629 hfmpsmbus->MasterRxCpltCallback = pCallback;
632 case HAL_FMPSMBUS_SLAVE_TX_COMPLETE_CB_ID :
633 hfmpsmbus->SlaveTxCpltCallback = pCallback;
636 case HAL_FMPSMBUS_SLAVE_RX_COMPLETE_CB_ID :
637 hfmpsmbus->SlaveRxCpltCallback = pCallback;
640 case HAL_FMPSMBUS_LISTEN_COMPLETE_CB_ID :
641 hfmpsmbus->ListenCpltCallback = pCallback;
644 case HAL_FMPSMBUS_ERROR_CB_ID :
645 hfmpsmbus->ErrorCallback = pCallback;
648 case HAL_FMPSMBUS_MSPINIT_CB_ID :
649 hfmpsmbus->MspInitCallback = pCallback;
652 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
653 hfmpsmbus->MspDeInitCallback = pCallback;
658 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
665 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
669 case HAL_FMPSMBUS_MSPINIT_CB_ID :
670 hfmpsmbus->MspInitCallback = pCallback;
673 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
674 hfmpsmbus->MspDeInitCallback = pCallback;
679 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
689 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
719HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus,
720 HAL_FMPSMBUS_CallbackIDTypeDef CallbackID)
724 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
728 case HAL_FMPSMBUS_MASTER_TX_COMPLETE_CB_ID :
729 hfmpsmbus->MasterTxCpltCallback = HAL_FMPSMBUS_MasterTxCpltCallback;
732 case HAL_FMPSMBUS_MASTER_RX_COMPLETE_CB_ID :
733 hfmpsmbus->MasterRxCpltCallback = HAL_FMPSMBUS_MasterRxCpltCallback;
736 case HAL_FMPSMBUS_SLAVE_TX_COMPLETE_CB_ID :
737 hfmpsmbus->SlaveTxCpltCallback = HAL_FMPSMBUS_SlaveTxCpltCallback;
740 case HAL_FMPSMBUS_SLAVE_RX_COMPLETE_CB_ID :
741 hfmpsmbus->SlaveRxCpltCallback = HAL_FMPSMBUS_SlaveRxCpltCallback;
744 case HAL_FMPSMBUS_LISTEN_COMPLETE_CB_ID :
745 hfmpsmbus->ListenCpltCallback = HAL_FMPSMBUS_ListenCpltCallback;
748 case HAL_FMPSMBUS_ERROR_CB_ID :
749 hfmpsmbus->ErrorCallback = HAL_FMPSMBUS_ErrorCallback;
752 case HAL_FMPSMBUS_MSPINIT_CB_ID :
753 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit;
756 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
757 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit;
762 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
769 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
773 case HAL_FMPSMBUS_MSPINIT_CB_ID :
774 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit;
777 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
778 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit;
783 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
793 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
810HAL_StatusTypeDef HAL_FMPSMBUS_RegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus,
811 pFMPSMBUS_AddrCallbackTypeDef pCallback)
815 if (pCallback == NULL)
818 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
823 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
825 hfmpsmbus->AddrCallback = pCallback;
830 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
846HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
850 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
852 hfmpsmbus->AddrCallback = HAL_FMPSMBUS_AddrCallback;
857 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
926HAL_StatusTypeDef HAL_FMPSMBUS_Master_Transmit_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress,
927 uint8_t *pData, uint16_t Size, uint32_t XferOptions)
933 assert_param(IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
935 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
940 hfmpsmbus->State = HAL_FMPSMBUS_STATE_MASTER_BUSY_TX;
941 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
943 hfmpsmbus->pBuffPtr = pData;
944 hfmpsmbus->XferCount = Size;
945 hfmpsmbus->XferOptions = XferOptions;
949 if (hfmpsmbus->pBuffPtr == NULL)
951 hfmpsmbus->XferOptions &= ~FMPSMBUS_AUTOEND_MODE;
954 if (Size > MAX_NBYTE_SIZE)
956 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
960 hfmpsmbus->XferSize = Size;
963 sizetoxfer = hfmpsmbus->XferSize;
964 if ((sizetoxfer > 0U) && ((XferOptions == FMPSMBUS_FIRST_FRAME) ||
965 (XferOptions == FMPSMBUS_FIRST_AND_LAST_FRAME_NO_PEC) ||
966 (XferOptions == FMPSMBUS_FIRST_FRAME_WITH_PEC) ||
967 (XferOptions == FMPSMBUS_FIRST_AND_LAST_FRAME_WITH_PEC)))
969 if (hfmpsmbus->pBuffPtr != NULL)
973 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
976 hfmpsmbus->pBuffPtr++;
978 hfmpsmbus->XferCount--;
979 hfmpsmbus->XferSize--;
989 if ((sizetoxfer < hfmpsmbus->XferCount) && (sizetoxfer == MAX_NBYTE_SIZE))
991 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer,
992 FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE),
993 FMPSMBUS_GENERATE_START_WRITE);
1001 tmp = hfmpsmbus->XferOptions;
1003 if ((hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX) && \
1004 (IS_FMPSMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0))
1006 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer, hfmpsmbus->XferOptions,
1007 FMPSMBUS_NO_STARTSTOP);
1013 FMPSMBUS_ConvertOtherXferOptions(hfmpsmbus);
1016 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer,
1017 hfmpsmbus->XferOptions,
1018 FMPSMBUS_GENERATE_START_WRITE);
1023 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
1025 if (hfmpsmbus->XferSize > 0U)
1027 hfmpsmbus->XferSize--;
1028 hfmpsmbus->XferCount--;
1043 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
1064HAL_StatusTypeDef HAL_FMPSMBUS_Master_Receive_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t *pData,
1065 uint16_t Size, uint32_t XferOptions)
1070 assert_param(IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1072 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1077 hfmpsmbus->State = HAL_FMPSMBUS_STATE_MASTER_BUSY_RX;
1078 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
1081 hfmpsmbus->pBuffPtr = pData;
1082 hfmpsmbus->XferCount = Size;
1083 hfmpsmbus->XferOptions = XferOptions;
1087 if (hfmpsmbus->pBuffPtr == NULL)
1089 hfmpsmbus->XferOptions &= ~FMPSMBUS_AUTOEND_MODE;
1092 if (Size > MAX_NBYTE_SIZE)
1094 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
1098 hfmpsmbus->XferSize = Size;
1103 if ((hfmpsmbus->XferSize < hfmpsmbus->XferCount) && (hfmpsmbus->XferSize == MAX_NBYTE_SIZE))
1105 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize,
1106 FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE),
1107 FMPSMBUS_GENERATE_START_READ);
1115 tmp = hfmpsmbus->XferOptions;
1117 if ((hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX) && \
1118 (IS_FMPSMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0))
1120 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1121 FMPSMBUS_NO_STARTSTOP);
1127 FMPSMBUS_ConvertOtherXferOptions(hfmpsmbus);
1130 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize,
1131 hfmpsmbus->XferOptions,
1132 FMPSMBUS_GENERATE_START_READ);
1142 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
1161HAL_StatusTypeDef HAL_FMPSMBUS_Master_Abort_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress)
1163 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1170 if (hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1172 hfmpsmbus->State = HAL_FMPSMBUS_STATE_MASTER_BUSY_TX;
1174 else if (hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1176 hfmpsmbus->State = HAL_FMPSMBUS_STATE_MASTER_BUSY_RX;
1184 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
1188 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, 1, FMPSMBUS_AUTOEND_MODE, FMPSMBUS_NO_STARTSTOP);
1196 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1198 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
1200 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1202 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
1226HAL_StatusTypeDef HAL_FMPSMBUS_Slave_Transmit_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t *pData, uint16_t Size,
1227 uint32_t XferOptions)
1230 assert_param(IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1232 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_LISTEN) == HAL_FMPSMBUS_STATE_LISTEN)
1234 if ((pData == NULL) || (Size == 0UL))
1236 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_INVALID_PARAM;
1241 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR | FMPSMBUS_IT_TX);
1246 hfmpsmbus->State = (HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX | HAL_FMPSMBUS_STATE_LISTEN);
1247 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
1250 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
1253 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1256 hfmpsmbus->pBuffPtr = pData;
1257 hfmpsmbus->XferCount = Size;
1258 hfmpsmbus->XferOptions = XferOptions;
1261 FMPSMBUS_ConvertOtherXferOptions(hfmpsmbus);
1263 if (Size > MAX_NBYTE_SIZE)
1265 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
1269 hfmpsmbus->XferSize = Size;
1273 if ((hfmpsmbus->XferSize < hfmpsmbus->XferCount) && (hfmpsmbus->XferSize == MAX_NBYTE_SIZE))
1275 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize,
1276 FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE),
1277 FMPSMBUS_NO_STARTSTOP);
1282 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1283 FMPSMBUS_NO_STARTSTOP);
1287 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
1289 hfmpsmbus->XferSize--;
1290 hfmpsmbus->XferCount--;
1296 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ADDR);
1305 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX | FMPSMBUS_IT_ADDR);
1324HAL_StatusTypeDef HAL_FMPSMBUS_Slave_Receive_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t *pData, uint16_t Size,
1325 uint32_t XferOptions)
1328 assert_param(IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1330 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_LISTEN) == HAL_FMPSMBUS_STATE_LISTEN)
1332 if ((pData == NULL) || (Size == 0UL))
1334 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_INVALID_PARAM;
1339 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR | FMPSMBUS_IT_RX);
1344 hfmpsmbus->State = (HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX | HAL_FMPSMBUS_STATE_LISTEN);
1345 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
1348 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
1351 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1354 hfmpsmbus->pBuffPtr = pData;
1355 hfmpsmbus->XferSize = Size;
1356 hfmpsmbus->XferCount = Size;
1357 hfmpsmbus->XferOptions = XferOptions;
1360 FMPSMBUS_ConvertOtherXferOptions(hfmpsmbus);
1367 if (((FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL) && (hfmpsmbus->XferSize == 2U)) || (hfmpsmbus->XferSize == 1U))
1369 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1370 FMPSMBUS_NO_STARTSTOP);
1374 FMPSMBUS_TransferConfig(hfmpsmbus, 0, 1, hfmpsmbus->XferOptions | FMPSMBUS_RELOAD_MODE, FMPSMBUS_NO_STARTSTOP);
1379 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ADDR);
1388 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX | FMPSMBUS_IT_ADDR);
1404HAL_StatusTypeDef HAL_FMPSMBUS_EnableListen_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1406 hfmpsmbus->State = HAL_FMPSMBUS_STATE_LISTEN;
1409 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR);
1420HAL_StatusTypeDef HAL_FMPSMBUS_DisableListen_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1423 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_LISTEN)
1425 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1428 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR);
1447 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_ALERTEN;
1450 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ALERT);
1453 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_ALERT);
1463HAL_StatusTypeDef HAL_FMPSMBUS_DisableAlert_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1466 hfmpsmbus->Instance->CR1 &= ~FMPI2C_CR1_ALERTEN;
1469 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ALERT);
1484HAL_StatusTypeDef HAL_FMPSMBUS_IsDeviceReady(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint32_t Trials,
1489 __IO uint32_t FMPSMBUS_Trials = 0UL;
1494 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1496 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_BUSY) != RESET)
1504 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
1505 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
1510 hfmpsmbus->Instance->CR2 = FMPSMBUS_GENERATE_START(hfmpsmbus->Init.AddressingMode, DevAddress);
1516 tmp1 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1517 tmp2 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1519 while ((tmp1 == RESET) && (tmp2 == RESET))
1523 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1526 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1529 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_HALTIMEOUT;
1537 tmp1 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1538 tmp2 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1542 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF) == RESET)
1545 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) !=
HAL_OK)
1551 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1554 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1564 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) !=
HAL_OK)
1570 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1573 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1577 if (FMPSMBUS_Trials == Trials)
1580 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_STOP;
1583 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) !=
HAL_OK)
1589 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1594 }
while (FMPSMBUS_Trials < Trials);
1596 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1599 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_HALTIMEOUT;
1625void HAL_FMPSMBUS_EV_IRQHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1629 uint32_t tmpisrvalue = READ_REG(hfmpsmbus->Instance->ISR);
1630 uint32_t tmpcr1value = READ_REG(hfmpsmbus->Instance->CR1);
1633 if ((FMPSMBUS_CHECK_IT_SOURCE(tmpcr1value, (FMPSMBUS_IT_TCI | FMPSMBUS_IT_STOPI |
1634 FMPSMBUS_IT_NACKI | FMPSMBUS_IT_TXI)) != RESET) &&
1635 ((FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_TXIS) != RESET) ||
1636 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_TCR) != RESET) ||
1637 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_TC) != RESET) ||
1638 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_STOPF) != RESET) ||
1639 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_AF) != RESET)))
1642 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX)
1644 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1647 else if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_MASTER_BUSY_TX) == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1649 (void)FMPSMBUS_Master_ISR(hfmpsmbus, tmpisrvalue);
1658 if ((FMPSMBUS_CHECK_IT_SOURCE(tmpcr1value, (FMPSMBUS_IT_TCI | FMPSMBUS_IT_STOPI |
1659 FMPSMBUS_IT_NACKI | FMPSMBUS_IT_RXI)) != RESET) &&
1660 ((FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_RXNE) != RESET) ||
1661 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_TCR) != RESET) ||
1662 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_TC) != RESET) ||
1663 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_STOPF) != RESET) ||
1664 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_AF) != RESET)))
1667 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX)
1669 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1672 else if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_MASTER_BUSY_RX) == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1674 (void)FMPSMBUS_Master_ISR(hfmpsmbus, tmpisrvalue);
1683 if (((FMPSMBUS_CHECK_IT_SOURCE(tmpcr1value, FMPSMBUS_IT_ADDRI) != RESET) ||
1684 (FMPSMBUS_CHECK_IT_SOURCE(tmpcr1value, FMPSMBUS_IT_STOPI) != RESET) ||
1685 (FMPSMBUS_CHECK_IT_SOURCE(tmpcr1value, FMPSMBUS_IT_NACKI) != RESET)) &&
1686 ((FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_ADDR) != RESET) ||
1687 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_STOPF) != RESET) ||
1688 (FMPSMBUS_CHECK_FLAG(tmpisrvalue, FMPSMBUS_FLAG_AF) != RESET)))
1690 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_LISTEN) == HAL_FMPSMBUS_STATE_LISTEN)
1692 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1703void HAL_FMPSMBUS_ER_IRQHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1705 FMPSMBUS_ITErrorHandler(hfmpsmbus);
1714__weak
void HAL_FMPSMBUS_MasterTxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1730__weak
void HAL_FMPSMBUS_MasterRxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1745__weak
void HAL_FMPSMBUS_SlaveTxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1761__weak
void HAL_FMPSMBUS_SlaveRxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1779__weak
void HAL_FMPSMBUS_AddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t TransferDirection,
1780 uint16_t AddrMatchCode)
1784 UNUSED(TransferDirection);
1785 UNUSED(AddrMatchCode);
1798__weak
void HAL_FMPSMBUS_ListenCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1814__weak
void HAL_FMPSMBUS_ErrorCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
1849uint32_t HAL_FMPSMBUS_GetState(
const FMPSMBUS_HandleTypeDef *hfmpsmbus)
1852 return hfmpsmbus->State;
1861uint32_t HAL_FMPSMBUS_GetError(
const FMPSMBUS_HandleTypeDef *hfmpsmbus)
1863 return hfmpsmbus->ErrorCode;
1886static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
1888 uint16_t DevAddress;
1893 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_AF) != RESET)
1896 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1900 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ACKF;
1903 FMPSMBUS_Flush_TXDR(hfmpsmbus);
1909#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1910 hfmpsmbus->ErrorCallback(hfmpsmbus);
1912 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
1915 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_STOPF) != RESET)
1918 FMPSMBUS_ITErrorHandler(hfmpsmbus);
1921 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1924 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
1927 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1930 FMPSMBUS_RESET_CR2(hfmpsmbus);
1934 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
1936 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_READY;
1937 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1943 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
1946#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1947 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
1949 HAL_FMPSMBUS_MasterTxCpltCallback(hfmpsmbus);
1952 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1955 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET)
1958 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
1961 hfmpsmbus->pBuffPtr++;
1963 if ((hfmpsmbus->XferSize > 0U))
1965 hfmpsmbus->XferSize--;
1966 hfmpsmbus->XferCount--;
1971 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
1974 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
1977 FMPSMBUS_RESET_CR2(hfmpsmbus);
1979 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_READY;
1980 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1986#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1987 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
1989 HAL_FMPSMBUS_MasterRxCpltCallback(hfmpsmbus);
1997 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET)
2000 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2003 hfmpsmbus->pBuffPtr++;
2006 hfmpsmbus->XferSize--;
2007 hfmpsmbus->XferCount--;
2009 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TXIS) != RESET)
2012 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
2015 hfmpsmbus->pBuffPtr++;
2018 hfmpsmbus->XferSize--;
2019 hfmpsmbus->XferCount--;
2021 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TCR) != RESET)
2023 if ((hfmpsmbus->XferCount != 0U) && (hfmpsmbus->XferSize == 0U))
2025 DevAddress = (uint16_t)(hfmpsmbus->Instance->CR2 & FMPI2C_CR2_SADD);
2027 if (hfmpsmbus->XferCount > MAX_NBYTE_SIZE)
2029 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, MAX_NBYTE_SIZE,
2030 (FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE)),
2031 FMPSMBUS_NO_STARTSTOP);
2032 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
2036 hfmpsmbus->XferSize = hfmpsmbus->XferCount;
2037 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
2038 FMPSMBUS_NO_STARTSTOP);
2041 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
2043 hfmpsmbus->XferSize--;
2044 hfmpsmbus->XferCount--;
2048 else if ((hfmpsmbus->XferCount == 0U) && (hfmpsmbus->XferSize == 0U))
2051 if (FMPSMBUS_GET_STOP_MODE(hfmpsmbus) != FMPSMBUS_AUTOEND_MODE)
2054 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
2057 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
2058 hfmpsmbus->PreviousState = hfmpsmbus->State;
2059 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2065#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2066 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
2068 HAL_FMPSMBUS_MasterTxCpltCallback(hfmpsmbus);
2071 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
2073 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
2074 hfmpsmbus->PreviousState = hfmpsmbus->State;
2075 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2081#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2082 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
2084 HAL_FMPSMBUS_MasterRxCpltCallback(hfmpsmbus);
2098 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TC) != RESET)
2100 if (hfmpsmbus->XferCount == 0U)
2103 if (hfmpsmbus->pBuffPtr == NULL)
2106 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_STOP;
2109 else if (FMPSMBUS_GET_STOP_MODE(hfmpsmbus) != FMPSMBUS_AUTOEND_MODE)
2115 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
2118 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
2119 hfmpsmbus->PreviousState = hfmpsmbus->State;
2120 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2126#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2127 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
2129 HAL_FMPSMBUS_MasterTxCpltCallback(hfmpsmbus);
2132 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
2134 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
2135 hfmpsmbus->PreviousState = hfmpsmbus->State;
2136 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2142#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2143 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
2145 HAL_FMPSMBUS_MasterRxCpltCallback(hfmpsmbus);
2176static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
2178 uint8_t TransferDirection;
2179 uint16_t SlaveAddrCode;
2184 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_AF) != RESET)
2190 if (hfmpsmbus->XferCount == 0U)
2193 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
2196 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2205 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
2209 hfmpsmbus->PreviousState = hfmpsmbus->State;
2210 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX);
2211 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX);
2214 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX | FMPSMBUS_IT_TX);
2217 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ACKF;
2220 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2226#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2227 hfmpsmbus->ErrorCallback(hfmpsmbus);
2229 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
2233 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_ADDR) != RESET)
2235 TransferDirection = (uint8_t)(FMPSMBUS_GET_DIR(hfmpsmbus));
2236 SlaveAddrCode = (uint16_t)(FMPSMBUS_GET_ADDR_MATCH(hfmpsmbus));
2240 __HAL_FMPSMBUS_DISABLE_IT(hfmpsmbus, FMPSMBUS_IT_ADDRI);
2246#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2247 hfmpsmbus->AddrCallback(hfmpsmbus, TransferDirection, SlaveAddrCode);
2249 HAL_FMPSMBUS_AddrCallback(hfmpsmbus, TransferDirection, SlaveAddrCode);
2252 else if ((FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET) ||
2253 (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TCR) != RESET))
2255 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX)
2258 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2261 hfmpsmbus->pBuffPtr++;
2263 hfmpsmbus->XferSize--;
2264 hfmpsmbus->XferCount--;
2266 if (hfmpsmbus->XferCount == 1U)
2271 hfmpsmbus->XferOptions &= ~FMPSMBUS_RELOAD_MODE;
2272 FMPSMBUS_TransferConfig(hfmpsmbus, 0, 1, hfmpsmbus->XferOptions, FMPSMBUS_NO_STARTSTOP);
2274 else if (hfmpsmbus->XferCount == 0U)
2277 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
2280 hfmpsmbus->PreviousState = hfmpsmbus->State;
2281 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX);
2287#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2288 hfmpsmbus->SlaveRxCpltCallback(hfmpsmbus);
2290 HAL_FMPSMBUS_SlaveRxCpltCallback(hfmpsmbus);
2296 FMPSMBUS_TransferConfig(hfmpsmbus, 0, 1,
2297 FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE),
2298 FMPSMBUS_NO_STARTSTOP);
2301 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
2304 else if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX)
2306 if ((hfmpsmbus->XferCount != 0U) && (hfmpsmbus->XferSize == 0U))
2308 if (hfmpsmbus->XferCount > MAX_NBYTE_SIZE)
2310 FMPSMBUS_TransferConfig(hfmpsmbus, 0, MAX_NBYTE_SIZE,
2311 (FMPSMBUS_RELOAD_MODE | (hfmpsmbus->XferOptions & FMPSMBUS_SENDPEC_MODE)),
2312 FMPSMBUS_NO_STARTSTOP);
2313 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
2317 hfmpsmbus->XferSize = hfmpsmbus->XferCount;
2318 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
2319 FMPSMBUS_NO_STARTSTOP);
2322 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
2324 hfmpsmbus->XferSize--;
2325 hfmpsmbus->XferCount--;
2335 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TXIS) != RESET)
2341 if (hfmpsmbus->XferCount > 0U)
2344 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
2347 hfmpsmbus->pBuffPtr++;
2349 hfmpsmbus->XferCount--;
2350 hfmpsmbus->XferSize--;
2353 if (hfmpsmbus->XferCount == 0U)
2357 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
2358 hfmpsmbus->PreviousState = hfmpsmbus->State;
2359 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX);
2365#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2366 hfmpsmbus->SlaveTxCpltCallback(hfmpsmbus);
2368 HAL_FMPSMBUS_SlaveTxCpltCallback(hfmpsmbus);
2378 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_STOPF) != RESET)
2380 if ((hfmpsmbus->State & HAL_FMPSMBUS_STATE_LISTEN) == HAL_FMPSMBUS_STATE_LISTEN)
2383 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_RXNE) != RESET)
2386 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2389 hfmpsmbus->pBuffPtr++;
2391 if ((hfmpsmbus->XferSize > 0U))
2393 hfmpsmbus->XferSize--;
2394 hfmpsmbus->XferCount--;
2399 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX | FMPSMBUS_IT_TX);
2402 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR);
2405 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_NACK;
2408 FMPSMBUS_RESET_CR2(hfmpsmbus);
2411 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_STOPF);
2414 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ADDR);
2416 hfmpsmbus->XferOptions = 0;
2417 hfmpsmbus->PreviousState = hfmpsmbus->State;
2418 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2424#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2425 hfmpsmbus->ListenCpltCallback(hfmpsmbus);
2427 HAL_FMPSMBUS_ListenCpltCallback(hfmpsmbus);
2444static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
2446 uint32_t tmpisr = 0UL;
2448 if ((InterruptRequest & FMPSMBUS_IT_ALERT) == FMPSMBUS_IT_ALERT)
2451 tmpisr |= FMPSMBUS_IT_ERRI;
2454 if ((InterruptRequest & FMPSMBUS_IT_ADDR) == FMPSMBUS_IT_ADDR)
2457 tmpisr |= FMPSMBUS_IT_ADDRI | FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI | FMPSMBUS_IT_ERRI;
2460 if ((InterruptRequest & FMPSMBUS_IT_TX) == FMPSMBUS_IT_TX)
2463 tmpisr |= FMPSMBUS_IT_ERRI | FMPSMBUS_IT_TCI | FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI | FMPSMBUS_IT_TXI;
2466 if ((InterruptRequest & FMPSMBUS_IT_RX) == FMPSMBUS_IT_RX)
2469 tmpisr |= FMPSMBUS_IT_ERRI | FMPSMBUS_IT_TCI | FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI | FMPSMBUS_IT_RXI;
2475 __HAL_FMPSMBUS_ENABLE_IT(hfmpsmbus, tmpisr);
2484static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
2486 uint32_t tmpisr = 0UL;
2487 uint32_t tmpstate = hfmpsmbus->State;
2489 if ((tmpstate == HAL_FMPSMBUS_STATE_READY) && ((InterruptRequest & FMPSMBUS_IT_ALERT) == FMPSMBUS_IT_ALERT))
2492 tmpisr |= FMPSMBUS_IT_ERRI;
2495 if ((InterruptRequest & FMPSMBUS_IT_TX) == FMPSMBUS_IT_TX)
2498 tmpisr |= FMPSMBUS_IT_TCI | FMPSMBUS_IT_TXI;
2500 if ((FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2501 && ((tmpstate & HAL_FMPSMBUS_STATE_LISTEN) != HAL_FMPSMBUS_STATE_LISTEN))
2504 tmpisr |= FMPSMBUS_IT_ERRI;
2507 if ((tmpstate & HAL_FMPSMBUS_STATE_LISTEN) != HAL_FMPSMBUS_STATE_LISTEN)
2510 tmpisr |= FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI;
2514 if ((InterruptRequest & FMPSMBUS_IT_RX) == FMPSMBUS_IT_RX)
2517 tmpisr |= FMPSMBUS_IT_TCI | FMPSMBUS_IT_RXI;
2519 if ((FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2520 && ((tmpstate & HAL_FMPSMBUS_STATE_LISTEN) != HAL_FMPSMBUS_STATE_LISTEN))
2523 tmpisr |= FMPSMBUS_IT_ERRI;
2526 if ((tmpstate & HAL_FMPSMBUS_STATE_LISTEN) != HAL_FMPSMBUS_STATE_LISTEN)
2529 tmpisr |= FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI;
2533 if ((InterruptRequest & FMPSMBUS_IT_ADDR) == FMPSMBUS_IT_ADDR)
2536 tmpisr |= FMPSMBUS_IT_ADDRI | FMPSMBUS_IT_STOPI | FMPSMBUS_IT_NACKI;
2538 if (FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2541 tmpisr |= FMPSMBUS_IT_ERRI;
2548 __HAL_FMPSMBUS_DISABLE_IT(hfmpsmbus, tmpisr);
2556static void FMPSMBUS_ITErrorHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
2558 uint32_t itflags = READ_REG(hfmpsmbus->Instance->ISR);
2559 uint32_t itsources = READ_REG(hfmpsmbus->Instance->CR1);
2564 if (((itflags & FMPSMBUS_FLAG_BERR) == FMPSMBUS_FLAG_BERR) && \
2565 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2567 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_BERR;
2570 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_BERR);
2574 if (((itflags & FMPSMBUS_FLAG_OVR) == FMPSMBUS_FLAG_OVR) && \
2575 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2577 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_OVR;
2580 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_OVR);
2584 if (((itflags & FMPSMBUS_FLAG_ARLO) == FMPSMBUS_FLAG_ARLO) && \
2585 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2587 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ARLO;
2590 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ARLO);
2594 if (((itflags & FMPSMBUS_FLAG_TIMEOUT) == FMPSMBUS_FLAG_TIMEOUT) && \
2595 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2597 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_BUSTIMEOUT;
2600 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TIMEOUT);
2604 if (((itflags & FMPSMBUS_FLAG_ALERT) == FMPSMBUS_FLAG_ALERT) && \
2605 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2607 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ALERT;
2610 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_ALERT);
2614 if (((itflags & FMPSMBUS_FLAG_PECERR) == FMPSMBUS_FLAG_PECERR) && \
2615 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2617 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_PECERR;
2620 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_PECERR);
2623 if (hfmpsmbus->ErrorCode != HAL_FMPSMBUS_ERROR_NONE)
2626 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2630 tmperror = hfmpsmbus->ErrorCode;
2633 if ((tmperror != HAL_FMPSMBUS_ERROR_NONE) && (tmperror != HAL_FMPSMBUS_ERROR_ACKF))
2636 if ((tmperror & HAL_FMPSMBUS_ERROR_ALERT) != HAL_FMPSMBUS_ERROR_ALERT)
2639 tmpstate = hfmpsmbus->State;
2641 if (((tmpstate & HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX)
2642 || ((tmpstate & HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX) == HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX))
2646 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_READY;
2647 hfmpsmbus->State = HAL_FMPSMBUS_STATE_LISTEN;
2652#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2653 hfmpsmbus->ErrorCallback(hfmpsmbus);
2655 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
2669static HAL_StatusTypeDef FMPSMBUS_WaitOnFlagUntilTimeout(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t Flag,
2670 FlagStatus Status, uint32_t Timeout)
2675 while ((FlagStatus)(__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, Flag)) == Status)
2680 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
2682 hfmpsmbus->PreviousState = hfmpsmbus->State;
2683 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2686 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_HALTIMEOUT;
2704static void FMPSMBUS_Flush_TXDR(FMPSMBUS_HandleTypeDef *hfmpsmbus)
2708 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TXIS) != RESET)
2710 hfmpsmbus->Instance->TXDR = 0x00U;
2714 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TXE) == RESET)
2716 __HAL_FMPSMBUS_CLEAR_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TXE);
2740static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size,
2741 uint32_t Mode, uint32_t Request)
2744 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
2749 MODIFY_REG(hfmpsmbus->Instance->CR2,
2750 ((FMPI2C_CR2_SADD | FMPI2C_CR2_NBYTES | FMPI2C_CR2_RELOAD | FMPI2C_CR2_AUTOEND | \
2751 (FMPI2C_CR2_RD_WRN & (uint32_t)(Request >> (31UL - FMPI2C_CR2_RD_WRN_Pos))) | \
2752 FMPI2C_CR2_START | FMPI2C_CR2_STOP | FMPI2C_CR2_PECBYTE)), \
2753 (uint32_t)(((uint32_t)DevAddress & FMPI2C_CR2_SADD) | \
2754 (((uint32_t)Size << FMPI2C_CR2_NBYTES_Pos) & FMPI2C_CR2_NBYTES) | \
2755 (uint32_t)Mode | (uint32_t)Request));
2763static void FMPSMBUS_ConvertOtherXferOptions(FMPSMBUS_HandleTypeDef *hfmpsmbus)
2768 if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_FRAME_NO_PEC)
2770 hfmpsmbus->XferOptions = FMPSMBUS_FIRST_FRAME;
2775 else if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_FRAME_WITH_PEC)
2777 hfmpsmbus->XferOptions = FMPSMBUS_FIRST_FRAME | FMPSMBUS_SENDPEC_MODE;
2783 else if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_AND_LAST_FRAME_NO_PEC)
2785 hfmpsmbus->XferOptions = FMPSMBUS_FIRST_AND_LAST_FRAME_NO_PEC;
2791 else if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_AND_LAST_FRAME_WITH_PEC)
2793 hfmpsmbus->XferOptions = FMPSMBUS_FIRST_AND_LAST_FRAME_WITH_PEC;
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.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)