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
213 static HAL_StatusTypeDef FMPSMBUS_WaitOnFlagUntilTimeout(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t Flag,
214 FlagStatus Status, uint32_t Timeout);
217 static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags);
218 static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags);
219 static void FMPSMBUS_ITErrorHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus);
222 static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
223 static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
226 static void FMPSMBUS_Flush_TXDR(FMPSMBUS_HandleTypeDef *hfmpsmbus);
229 static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size,
230 uint32_t Mode, uint32_t Request);
233 static 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)
314 hfmpsmbus->Lock = HAL_UNLOCKED;
316 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
325 if (hfmpsmbus->MspInitCallback == NULL)
331 hfmpsmbus->MspInitCallback(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)
438 hfmpsmbus->MspDeInitCallback(hfmpsmbus);
444 hfmpsmbus->ErrorCode = HAL_FMPSMBUS_ERROR_NONE;
445 hfmpsmbus->PreviousState = HAL_FMPSMBUS_STATE_RESET;
446 hfmpsmbus->State = HAL_FMPSMBUS_STATE_RESET;
449 __HAL_UNLOCK(hfmpsmbus);
498 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
499 assert_param(IS_FMPSMBUS_ANALOG_FILTER(AnalogFilter));
501 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
504 __HAL_LOCK(hfmpsmbus);
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;
522 __HAL_UNLOCK(hfmpsmbus);
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)
550 __HAL_LOCK(hfmpsmbus);
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;
574 __HAL_UNLOCK(hfmpsmbus);
584 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
610 HAL_StatusTypeDef status = HAL_OK;
612 if (pCallback == NULL)
615 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
620 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
625 hfmpsmbus->MasterTxCpltCallback = pCallback;
629 hfmpsmbus->MasterRxCpltCallback = pCallback;
633 hfmpsmbus->SlaveTxCpltCallback = pCallback;
637 hfmpsmbus->SlaveRxCpltCallback = pCallback;
641 hfmpsmbus->ListenCpltCallback = pCallback;
645 hfmpsmbus->ErrorCallback = pCallback;
649 hfmpsmbus->MspInitCallback = pCallback;
653 hfmpsmbus->MspDeInitCallback = pCallback;
658 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
665 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
670 hfmpsmbus->MspInitCallback = pCallback;
674 hfmpsmbus->MspDeInitCallback = pCallback;
679 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
689 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
722 HAL_StatusTypeDef status = HAL_OK;
724 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
762 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
769 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
783 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
793 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
813 HAL_StatusTypeDef status = HAL_OK;
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;
848 HAL_StatusTypeDef status = HAL_OK;
850 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
857 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
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)
938 __HAL_LOCK(hfmpsmbus);
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--;
1038 __HAL_UNLOCK(hfmpsmbus);
1043 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX);
1065 uint16_t Size, uint32_t XferOptions)
1070 assert_param(IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1072 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1075 __HAL_LOCK(hfmpsmbus);
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);
1137 __HAL_UNLOCK(hfmpsmbus);
1142 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX);
1163 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1166 __HAL_LOCK(hfmpsmbus);
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);
1191 __HAL_UNLOCK(hfmpsmbus);
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);
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);
1244 __HAL_LOCK(hfmpsmbus);
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);
1299 __HAL_UNLOCK(hfmpsmbus);
1305 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_TX | FMPSMBUS_IT_ADDR);
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);
1342 __HAL_LOCK(hfmpsmbus);
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);
1382 __HAL_UNLOCK(hfmpsmbus);
1388 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_RX | FMPSMBUS_IT_ADDR);
1406 hfmpsmbus->State = HAL_FMPSMBUS_STATE_LISTEN;
1409 FMPSMBUS_Enable_IRQ(hfmpsmbus, FMPSMBUS_IT_ADDR);
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);
1466 hfmpsmbus->Instance->CR1 &= ~FMPI2C_CR1_ALERTEN;
1469 FMPSMBUS_Disable_IRQ(hfmpsmbus, FMPSMBUS_IT_ALERT);
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)
1502 __HAL_LOCK(hfmpsmbus);
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))
1521 if (Timeout != HAL_MAX_DELAY)
1523 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1526 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1529 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_HALTIMEOUT;
1532 __HAL_UNLOCK(hfmpsmbus);
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;
1557 __HAL_UNLOCK(hfmpsmbus);
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;
1602 __HAL_UNLOCK(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);
1705 FMPSMBUS_ITErrorHandler(hfmpsmbus);
1780 uint16_t AddrMatchCode)
1784 UNUSED(TransferDirection);
1785 UNUSED(AddrMatchCode);
1852 return hfmpsmbus->State;
1863 return hfmpsmbus->ErrorCode;
1886 static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
1888 uint16_t DevAddress;
1891 __HAL_LOCK(hfmpsmbus);
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);
1906 __HAL_UNLOCK(hfmpsmbus);
1909 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1910 hfmpsmbus->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;
1940 __HAL_UNLOCK(hfmpsmbus);
1943 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
1946 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1947 hfmpsmbus->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;
1983 __HAL_UNLOCK(hfmpsmbus);
1986 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1987 hfmpsmbus->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;
2062 __HAL_UNLOCK(hfmpsmbus);
2065 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2066 hfmpsmbus->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;
2078 __HAL_UNLOCK(hfmpsmbus);
2081 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2082 hfmpsmbus->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;
2123 __HAL_UNLOCK(hfmpsmbus);
2126 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2127 hfmpsmbus->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;
2139 __HAL_UNLOCK(hfmpsmbus);
2142 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2143 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
2165 __HAL_UNLOCK(hfmpsmbus);
2176 static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
2178 uint8_t TransferDirection;
2179 uint16_t SlaveAddrCode;
2182 __HAL_LOCK(hfmpsmbus);
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);
2199 __HAL_UNLOCK(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);
2223 __HAL_UNLOCK(hfmpsmbus);
2226 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2227 hfmpsmbus->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);
2243 __HAL_UNLOCK(hfmpsmbus);
2246 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2247 hfmpsmbus->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);
2284 __HAL_UNLOCK(hfmpsmbus);
2287 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2288 hfmpsmbus->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);
2362 __HAL_UNLOCK(hfmpsmbus);
2365 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2366 hfmpsmbus->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;
2421 __HAL_UNLOCK(hfmpsmbus);
2424 #if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2425 hfmpsmbus->ListenCpltCallback(hfmpsmbus);
2433 __HAL_UNLOCK(hfmpsmbus);
2444 static 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);
2484 static 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);
2556 static 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);
2669 static 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)
2678 if (Timeout != HAL_MAX_DELAY)
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;
2689 __HAL_UNLOCK(hfmpsmbus);
2704 static 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);
2740 static 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));
2745 assert_param(IS_FMPSMBUS_TRANSFER_MODE(Mode));
2746 assert_param(IS_FMPSMBUS_TRANSFER_REQUEST(Request));
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));
2763 static 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;
HAL_StatusTypeDef HAL_FMPSMBUS_ConfigAnalogFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t AnalogFilter)
Configure Analog noise filter.
HAL_StatusTypeDef HAL_FMPSMBUS_RegisterCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, HAL_FMPSMBUS_CallbackIDTypeDef CallbackID, pFMPSMBUS_CallbackTypeDef pCallback)
Register a User FMPSMBUS Callback To be used instead of the weak predefined callback.
HAL_StatusTypeDef HAL_FMPSMBUS_ConfigDigitalFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t DigitalFilter)
Configure Digital noise filter.
HAL_StatusTypeDef HAL_FMPSMBUS_RegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, pFMPSMBUS_AddrCallbackTypeDef pCallback)
Register the Slave Address Match FMPSMBUS Callback To be used instead of the weak HAL_FMPSMBUS_AddrCa...
HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, HAL_FMPSMBUS_CallbackIDTypeDef CallbackID)
Unregister an FMPSMBUS Callback FMPSMBUS callback is redirected to the weak predefined callback.
void HAL_FMPSMBUS_MspInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Initialize the FMPSMBUS MSP.
HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
UnRegister the Slave Address Match FMPSMBUS Callback Info Ready FMPSMBUS Callback is redirected to th...
HAL_StatusTypeDef HAL_FMPSMBUS_Init(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Initialize the FMPSMBUS according to the specified parameters in the FMPSMBUS_InitTypeDef and initial...
HAL_StatusTypeDef HAL_FMPSMBUS_DeInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
DeInitialize the FMPSMBUS peripheral.
void HAL_FMPSMBUS_MspDeInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
DeInitialize the FMPSMBUS MSP.
HAL_StatusTypeDef HAL_FMPSMBUS_Slave_Transmit_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Transmit in slave/device FMPSMBUS mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_Master_Transmit_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Transmit in master/host FMPSMBUS mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_DisableListen_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Disable the Address listen mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_DisableAlert_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Disable the FMPSMBUS alert mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_Slave_Receive_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Receive in slave/device FMPSMBUS mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_IsDeviceReady(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
Check if target device is ready for communication.
HAL_StatusTypeDef HAL_FMPSMBUS_EnableListen_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Enable the Address listen mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_EnableAlert_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Enable the FMPSMBUS alert mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_Master_Receive_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Receive in master/host FMPSMBUS mode an amount of data in non-blocking mode with Interrupt.
HAL_StatusTypeDef HAL_FMPSMBUS_Master_Abort_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress)
Abort a master/host FMPSMBUS process communication with Interrupt.
uint32_t HAL_FMPSMBUS_GetError(const FMPSMBUS_HandleTypeDef *hfmpsmbus)
Return the FMPSMBUS error code.
uint32_t HAL_FMPSMBUS_GetState(const FMPSMBUS_HandleTypeDef *hfmpsmbus)
Return the FMPSMBUS handle state.
void HAL_FMPSMBUS_ListenCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Listen Complete callback.
void HAL_FMPSMBUS_MasterTxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Master Tx Transfer completed callback.
void HAL_FMPSMBUS_EV_IRQHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Handle FMPSMBUS event interrupt request.
void HAL_FMPSMBUS_ErrorCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
FMPSMBUS error callback.
void HAL_FMPSMBUS_ER_IRQHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Handle FMPSMBUS error interrupt request.
void HAL_FMPSMBUS_MasterRxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Master Rx Transfer completed callback.
void HAL_FMPSMBUS_AddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t TransferDirection, uint16_t AddrMatchCode)
Slave Address Match callback.
void HAL_FMPSMBUS_SlaveRxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Slave Rx Transfer completed callback.
void HAL_FMPSMBUS_SlaveTxCpltCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Slave Tx Transfer completed callback.
void(* pFMPSMBUS_AddrCallbackTypeDef)(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t TransferDirection, uint16_t AddrMatchCode)
HAL_FMPSMBUS_CallbackIDTypeDef
HAL FMPSMBUS Callback ID enumeration definition.
void(* pFMPSMBUS_CallbackTypeDef)(FMPSMBUS_HandleTypeDef *hfmpsmbus)
HAL FMPSMBUS Callback pointer definition.
@ HAL_FMPSMBUS_ERROR_CB_ID
@ HAL_FMPSMBUS_MASTER_RX_COMPLETE_CB_ID
@ HAL_FMPSMBUS_LISTEN_COMPLETE_CB_ID
@ HAL_FMPSMBUS_SLAVE_TX_COMPLETE_CB_ID
@ HAL_FMPSMBUS_MSPINIT_CB_ID
@ HAL_FMPSMBUS_MSPDEINIT_CB_ID
@ HAL_FMPSMBUS_SLAVE_RX_COMPLETE_CB_ID
@ HAL_FMPSMBUS_MASTER_TX_COMPLETE_CB_ID
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.