STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_fmpsmbus.c
Go to the documentation of this file.
1
172/* Includes ------------------------------------------------------------------*/
173#include "stm32f4xx_hal.h"
174
184#ifdef HAL_FMPSMBUS_MODULE_ENABLED
185
186#if defined(FMPI2C_CR1_PE)
187/* Private typedef -----------------------------------------------------------*/
188/* Private constants ---------------------------------------------------------*/
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
206/* Private macro -------------------------------------------------------------*/
207/* Private variables ---------------------------------------------------------*/
208/* Private function prototypes -----------------------------------------------*/
212/* Private functions to handle flags during polling transfer */
214 FlagStatus Status, uint32_t Timeout);
215
216/* Private functions for FMPSMBUS transfer IRQ handler */
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);
220
221/* Private functions to centralize the enable/disable of Interrupts */
222static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
223static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest);
224
225/* Private function to flush TXDR register */
226static void FMPSMBUS_Flush_TXDR(FMPSMBUS_HandleTypeDef *hfmpsmbus);
227
228/* Private function to handle start, restart or stop a transfer */
229static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size,
230 uint32_t Mode, uint32_t Request);
231
232/* Private function to Convert Specific options */
238/* Exported functions --------------------------------------------------------*/
239
291{
292 /* Check the FMPSMBUS handle allocation */
293 if (hfmpsmbus == NULL)
294 {
295 return HAL_ERROR;
296 }
297
298 /* Check the parameters */
299 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
310
311 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_RESET)
312 {
313 /* Allocate lock resource and initialize it */
314 hfmpsmbus->Lock = HAL_UNLOCKED;
315
316#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
317 hfmpsmbus->MasterTxCpltCallback = HAL_FMPSMBUS_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */
318 hfmpsmbus->MasterRxCpltCallback = HAL_FMPSMBUS_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */
319 hfmpsmbus->SlaveTxCpltCallback = HAL_FMPSMBUS_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */
320 hfmpsmbus->SlaveRxCpltCallback = HAL_FMPSMBUS_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */
321 hfmpsmbus->ListenCpltCallback = HAL_FMPSMBUS_ListenCpltCallback; /* Legacy weak ListenCpltCallback */
322 hfmpsmbus->ErrorCallback = HAL_FMPSMBUS_ErrorCallback; /* Legacy weak ErrorCallback */
323 hfmpsmbus->AddrCallback = HAL_FMPSMBUS_AddrCallback; /* Legacy weak AddrCallback */
324
325 if (hfmpsmbus->MspInitCallback == NULL)
326 {
327 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit; /* Legacy weak MspInit */
328 }
329
330 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
331 hfmpsmbus->MspInitCallback(hfmpsmbus);
332#else
333 /* Init the low level hardware : GPIO, CLOCK, NVIC */
334 HAL_FMPSMBUS_MspInit(hfmpsmbus);
335#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
336 }
337
338 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
339
340 /* Disable the selected FMPSMBUS peripheral */
341 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
342
343 /*---------------------------- FMPSMBUSx TIMINGR Configuration ------------------------*/
344 /* Configure FMPSMBUSx: Frequency range */
345 hfmpsmbus->Instance->TIMINGR = hfmpsmbus->Init.Timing & TIMING_CLEAR_MASK;
346
347 /*---------------------------- FMPSMBUSx TIMEOUTR Configuration ------------------------*/
348 /* Configure FMPSMBUSx: Bus Timeout */
349 hfmpsmbus->Instance->TIMEOUTR &= ~FMPI2C_TIMEOUTR_TIMOUTEN;
350 hfmpsmbus->Instance->TIMEOUTR &= ~FMPI2C_TIMEOUTR_TEXTEN;
351 hfmpsmbus->Instance->TIMEOUTR = hfmpsmbus->Init.SMBusTimeout;
352
353 /*---------------------------- FMPSMBUSx OAR1 Configuration -----------------------*/
354 /* Configure FMPSMBUSx: Own Address1 and ack own address1 mode */
355 hfmpsmbus->Instance->OAR1 &= ~FMPI2C_OAR1_OA1EN;
356
357 if (hfmpsmbus->Init.OwnAddress1 != 0UL)
358 {
360 {
361 hfmpsmbus->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | hfmpsmbus->Init.OwnAddress1);
362 }
363 else /* FMPSMBUS_ADDRESSINGMODE_10BIT */
364 {
365 hfmpsmbus->Instance->OAR1 = (FMPI2C_OAR1_OA1EN | FMPI2C_OAR1_OA1MODE | hfmpsmbus->Init.OwnAddress1);
366 }
367 }
368
369 /*---------------------------- FMPSMBUSx CR2 Configuration ------------------------*/
370 /* Configure FMPSMBUSx: Addressing Master mode */
372 {
373 hfmpsmbus->Instance->CR2 = (FMPI2C_CR2_ADD10);
374 }
375 /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process) */
376 /* AUTOEND and NACK bit will be manage during Transfer process */
377 hfmpsmbus->Instance->CR2 |= (FMPI2C_CR2_AUTOEND | FMPI2C_CR2_NACK);
378
379 /*---------------------------- FMPSMBUSx OAR2 Configuration -----------------------*/
380 /* Configure FMPSMBUSx: Dual mode and Own Address2 */
381 hfmpsmbus->Instance->OAR2 = (hfmpsmbus->Init.DualAddressMode | hfmpsmbus->Init.OwnAddress2 | \
382 (hfmpsmbus->Init.OwnAddress2Masks << 8U));
383
384 /*---------------------------- FMPSMBUSx CR1 Configuration ------------------------*/
385 /* Configure FMPSMBUSx: Generalcall and NoStretch mode */
386 hfmpsmbus->Instance->CR1 = (hfmpsmbus->Init.GeneralCallMode | hfmpsmbus->Init.NoStretchMode | \
387 hfmpsmbus->Init.PacketErrorCheckMode | hfmpsmbus->Init.PeripheralMode | \
388 hfmpsmbus->Init.AnalogFilter);
389
390 /* Enable Slave Byte Control only in case of Packet Error Check is enabled
391 and FMPSMBUS Peripheral is set in Slave mode */
392 if ((hfmpsmbus->Init.PacketErrorCheckMode == FMPSMBUS_PEC_ENABLE) && \
395 {
396 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
397 }
398
399 /* Enable the selected FMPSMBUS peripheral */
400 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
401
404 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
405
406 return HAL_OK;
407}
408
416{
417 /* Check the FMPSMBUS handle allocation */
418 if (hfmpsmbus == NULL)
419 {
420 return HAL_ERROR;
421 }
422
423 /* Check the parameters */
424 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
425
426 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
427
428 /* Disable the FMPSMBUS Peripheral Clock */
429 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
430
431#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
432 if (hfmpsmbus->MspDeInitCallback == NULL)
433 {
434 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit; /* Legacy weak MspDeInit */
435 }
436
437 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
438 hfmpsmbus->MspDeInitCallback(hfmpsmbus);
439#else
440 /* DeInit the low level hardware: GPIO, CLOCK, NVIC */
441 HAL_FMPSMBUS_MspDeInit(hfmpsmbus);
442#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
443
446 hfmpsmbus->State = HAL_FMPSMBUS_STATE_RESET;
447
448 /* Release Lock */
449 __HAL_UNLOCK(hfmpsmbus);
450
451 return HAL_OK;
452}
453
461{
462 /* Prevent unused argument(s) compilation warning */
463 UNUSED(hfmpsmbus);
464
465 /* NOTE : This function should not be modified, when the callback is needed,
466 the HAL_FMPSMBUS_MspInit could be implemented in the user file
467 */
468}
469
477{
478 /* Prevent unused argument(s) compilation warning */
479 UNUSED(hfmpsmbus);
480
481 /* NOTE : This function should not be modified, when the callback is needed,
482 the HAL_FMPSMBUS_MspDeInit could be implemented in the user file
483 */
484}
485
496{
497 /* Check the parameters */
498 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
500
501 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
502 {
503 /* Process Locked */
504 __HAL_LOCK(hfmpsmbus);
505
506 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
507
508 /* Disable the selected FMPSMBUS peripheral */
509 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
510
511 /* Reset ANOFF bit */
512 hfmpsmbus->Instance->CR1 &= ~(FMPI2C_CR1_ANFOFF);
513
514 /* Set analog filter bit*/
515 hfmpsmbus->Instance->CR1 |= AnalogFilter;
516
517 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
518
519 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
520
521 /* Process Unlocked */
522 __HAL_UNLOCK(hfmpsmbus);
523
524 return HAL_OK;
525 }
526 else
527 {
528 return HAL_BUSY;
529 }
530}
531
540{
541 uint32_t tmpreg;
542
543 /* Check the parameters */
544 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
546
547 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
548 {
549 /* Process Locked */
550 __HAL_LOCK(hfmpsmbus);
551
552 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
553
554 /* Disable the selected FMPSMBUS peripheral */
555 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
556
557 /* Get the old register value */
558 tmpreg = hfmpsmbus->Instance->CR1;
559
560 /* Reset FMPI2C DNF bits [11:8] */
561 tmpreg &= ~(FMPI2C_CR1_DNF);
562
563 /* Set FMPI2Cx DNF coefficient */
564 tmpreg |= DigitalFilter << FMPI2C_CR1_DNF_Pos;
565
566 /* Store the new register value */
567 hfmpsmbus->Instance->CR1 = tmpreg;
568
569 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
570
571 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
572
573 /* Process Unlocked */
574 __HAL_UNLOCK(hfmpsmbus);
575
576 return HAL_OK;
577 }
578 else
579 {
580 return HAL_BUSY;
581 }
582}
583
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)
609{
610 HAL_StatusTypeDef status = HAL_OK;
611
612 if (pCallback == NULL)
613 {
614 /* Update the error code */
615 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
616
617 return HAL_ERROR;
618 }
619
620 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
621 {
622 switch (CallbackID)
623 {
624 case HAL_FMPSMBUS_MASTER_TX_COMPLETE_CB_ID :
625 hfmpsmbus->MasterTxCpltCallback = pCallback;
626 break;
627
628 case HAL_FMPSMBUS_MASTER_RX_COMPLETE_CB_ID :
629 hfmpsmbus->MasterRxCpltCallback = pCallback;
630 break;
631
632 case HAL_FMPSMBUS_SLAVE_TX_COMPLETE_CB_ID :
633 hfmpsmbus->SlaveTxCpltCallback = pCallback;
634 break;
635
636 case HAL_FMPSMBUS_SLAVE_RX_COMPLETE_CB_ID :
637 hfmpsmbus->SlaveRxCpltCallback = pCallback;
638 break;
639
640 case HAL_FMPSMBUS_LISTEN_COMPLETE_CB_ID :
641 hfmpsmbus->ListenCpltCallback = pCallback;
642 break;
643
644 case HAL_FMPSMBUS_ERROR_CB_ID :
645 hfmpsmbus->ErrorCallback = pCallback;
646 break;
647
648 case HAL_FMPSMBUS_MSPINIT_CB_ID :
649 hfmpsmbus->MspInitCallback = pCallback;
650 break;
651
652 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
653 hfmpsmbus->MspDeInitCallback = pCallback;
654 break;
655
656 default :
657 /* Update the error code */
658 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
659
660 /* Return error status */
661 status = HAL_ERROR;
662 break;
663 }
664 }
665 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
666 {
667 switch (CallbackID)
668 {
669 case HAL_FMPSMBUS_MSPINIT_CB_ID :
670 hfmpsmbus->MspInitCallback = pCallback;
671 break;
672
673 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
674 hfmpsmbus->MspDeInitCallback = pCallback;
675 break;
676
677 default :
678 /* Update the error code */
679 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
680
681 /* Return error status */
682 status = HAL_ERROR;
683 break;
684 }
685 }
686 else
687 {
688 /* Update the error code */
689 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
690
691 /* Return error status */
692 status = HAL_ERROR;
693 }
694
695 return status;
696}
697
719HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus,
720 HAL_FMPSMBUS_CallbackIDTypeDef CallbackID)
721{
722 HAL_StatusTypeDef status = HAL_OK;
723
724 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
725 {
726 switch (CallbackID)
727 {
728 case HAL_FMPSMBUS_MASTER_TX_COMPLETE_CB_ID :
729 hfmpsmbus->MasterTxCpltCallback = HAL_FMPSMBUS_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */
730 break;
731
732 case HAL_FMPSMBUS_MASTER_RX_COMPLETE_CB_ID :
733 hfmpsmbus->MasterRxCpltCallback = HAL_FMPSMBUS_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */
734 break;
735
736 case HAL_FMPSMBUS_SLAVE_TX_COMPLETE_CB_ID :
737 hfmpsmbus->SlaveTxCpltCallback = HAL_FMPSMBUS_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback */
738 break;
739
740 case HAL_FMPSMBUS_SLAVE_RX_COMPLETE_CB_ID :
741 hfmpsmbus->SlaveRxCpltCallback = HAL_FMPSMBUS_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback */
742 break;
743
744 case HAL_FMPSMBUS_LISTEN_COMPLETE_CB_ID :
745 hfmpsmbus->ListenCpltCallback = HAL_FMPSMBUS_ListenCpltCallback; /* Legacy weak ListenCpltCallback */
746 break;
747
748 case HAL_FMPSMBUS_ERROR_CB_ID :
749 hfmpsmbus->ErrorCallback = HAL_FMPSMBUS_ErrorCallback; /* Legacy weak ErrorCallback */
750 break;
751
752 case HAL_FMPSMBUS_MSPINIT_CB_ID :
753 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit; /* Legacy weak MspInit */
754 break;
755
756 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
757 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit; /* Legacy weak MspDeInit */
758 break;
759
760 default :
761 /* Update the error code */
762 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
763
764 /* Return error status */
765 status = HAL_ERROR;
766 break;
767 }
768 }
769 else if (HAL_FMPSMBUS_STATE_RESET == hfmpsmbus->State)
770 {
771 switch (CallbackID)
772 {
773 case HAL_FMPSMBUS_MSPINIT_CB_ID :
774 hfmpsmbus->MspInitCallback = HAL_FMPSMBUS_MspInit; /* Legacy weak MspInit */
775 break;
776
777 case HAL_FMPSMBUS_MSPDEINIT_CB_ID :
778 hfmpsmbus->MspDeInitCallback = HAL_FMPSMBUS_MspDeInit; /* Legacy weak MspDeInit */
779 break;
780
781 default :
782 /* Update the error code */
783 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
784
785 /* Return error status */
786 status = HAL_ERROR;
787 break;
788 }
789 }
790 else
791 {
792 /* Update the error code */
793 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
794
795 /* Return error status */
796 status = HAL_ERROR;
797 }
798
799 return status;
800}
801
810HAL_StatusTypeDef HAL_FMPSMBUS_RegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus,
811 pFMPSMBUS_AddrCallbackTypeDef pCallback)
812{
813 HAL_StatusTypeDef status = HAL_OK;
814
815 if (pCallback == NULL)
816 {
817 /* Update the error code */
818 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
819
820 return HAL_ERROR;
821 }
822
823 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
824 {
825 hfmpsmbus->AddrCallback = pCallback;
826 }
827 else
828 {
829 /* Update the error code */
830 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
831
832 /* Return error status */
833 status = HAL_ERROR;
834 }
835
836 return status;
837}
838
846HAL_StatusTypeDef HAL_FMPSMBUS_UnRegisterAddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus)
847{
848 HAL_StatusTypeDef status = HAL_OK;
849
850 if (HAL_FMPSMBUS_STATE_READY == hfmpsmbus->State)
851 {
852 hfmpsmbus->AddrCallback = HAL_FMPSMBUS_AddrCallback; /* Legacy weak AddrCallback */
853 }
854 else
855 {
856 /* Update the error code */
857 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_INVALID_CALLBACK;
858
859 /* Return error status */
860 status = HAL_ERROR;
861 }
862
863 return status;
864}
865
866#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
867
927 uint8_t *pData, uint16_t Size, uint32_t XferOptions)
928{
929 uint32_t tmp;
930 uint32_t sizetoxfer;
931
932 /* Check the parameters */
934
935 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
936 {
937 /* Process Locked */
938 __HAL_LOCK(hfmpsmbus);
939
942 /* Prepare transfer parameters */
943 hfmpsmbus->pBuffPtr = pData;
944 hfmpsmbus->XferCount = Size;
945 hfmpsmbus->XferOptions = XferOptions;
946
947 /* In case of Quick command, remove autoend mode */
948 /* Manage the stop generation by software */
949 if (hfmpsmbus->pBuffPtr == NULL)
950 {
951 hfmpsmbus->XferOptions &= ~FMPSMBUS_AUTOEND_MODE;
952 }
953
954 if (Size > MAX_NBYTE_SIZE)
955 {
956 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
957 }
958 else
959 {
960 hfmpsmbus->XferSize = Size;
961 }
962
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) ||
968 {
969 if (hfmpsmbus->pBuffPtr != NULL)
970 {
971 /* Preload TX register */
972 /* Write data to TXDR */
973 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
974
975 /* Increment Buffer pointer */
976 hfmpsmbus->pBuffPtr++;
977
978 hfmpsmbus->XferCount--;
979 hfmpsmbus->XferSize--;
980 }
981 else
982 {
983 return HAL_ERROR;
984 }
985 }
986
987 /* Send Slave Address */
988 /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */
989 if ((sizetoxfer < hfmpsmbus->XferCount) && (sizetoxfer == MAX_NBYTE_SIZE))
990 {
991 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer,
994 }
995 else
996 {
997 /* If transfer direction not change, do not generate Restart Condition */
998 /* Mean Previous state is same as current state */
999
1000 /* Store current volatile XferOptions, misra rule */
1001 tmp = hfmpsmbus->XferOptions;
1002
1003 if ((hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX) && \
1005 {
1006 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer, hfmpsmbus->XferOptions,
1008 }
1009 /* Else transfer direction change, so generate Restart with new transfer direction */
1010 else
1011 {
1012 /* Convert OTHER_xxx XferOptions if any */
1014
1015 /* Handle Transfer */
1016 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)sizetoxfer,
1017 hfmpsmbus->XferOptions,
1019 }
1020
1021 /* If PEC mode is enable, size to transmit manage by SW part should be Size-1 byte, corresponding to PEC byte */
1022 /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */
1023 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
1024 {
1025 if (hfmpsmbus->XferSize > 0U)
1026 {
1027 hfmpsmbus->XferSize--;
1028 hfmpsmbus->XferCount--;
1029 }
1030 else
1031 {
1032 return HAL_ERROR;
1033 }
1034 }
1035 }
1036
1037 /* Process Unlocked */
1038 __HAL_UNLOCK(hfmpsmbus);
1039
1040 /* Note : The FMPSMBUS interrupts must be enabled after unlocking current process
1041 to avoid the risk of FMPSMBUS interrupt handle execution before current
1042 process unlock */
1044
1045 return HAL_OK;
1046 }
1047 else
1048 {
1049 return HAL_BUSY;
1050 }
1051}
1052
1064HAL_StatusTypeDef HAL_FMPSMBUS_Master_Receive_IT(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t *pData,
1065 uint16_t Size, uint32_t XferOptions)
1066{
1067 uint32_t tmp;
1068
1069 /* Check the parameters */
1071
1072 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1073 {
1074 /* Process Locked */
1075 __HAL_LOCK(hfmpsmbus);
1076
1079
1080 /* Prepare transfer parameters */
1081 hfmpsmbus->pBuffPtr = pData;
1082 hfmpsmbus->XferCount = Size;
1083 hfmpsmbus->XferOptions = XferOptions;
1084
1085 /* In case of Quick command, remove autoend mode */
1086 /* Manage the stop generation by software */
1087 if (hfmpsmbus->pBuffPtr == NULL)
1088 {
1089 hfmpsmbus->XferOptions &= ~FMPSMBUS_AUTOEND_MODE;
1090 }
1091
1092 if (Size > MAX_NBYTE_SIZE)
1093 {
1094 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
1095 }
1096 else
1097 {
1098 hfmpsmbus->XferSize = Size;
1099 }
1100
1101 /* Send Slave Address */
1102 /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */
1103 if ((hfmpsmbus->XferSize < hfmpsmbus->XferCount) && (hfmpsmbus->XferSize == MAX_NBYTE_SIZE))
1104 {
1105 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize,
1108 }
1109 else
1110 {
1111 /* If transfer direction not change, do not generate Restart Condition */
1112 /* Mean Previous state is same as current state */
1113
1114 /* Store current volatile XferOptions, Misra rule */
1115 tmp = hfmpsmbus->XferOptions;
1116
1117 if ((hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX) && \
1119 {
1120 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1122 }
1123 /* Else transfer direction change, so generate Restart with new transfer direction */
1124 else
1125 {
1126 /* Convert OTHER_xxx XferOptions if any */
1128
1129 /* Handle Transfer */
1130 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize,
1131 hfmpsmbus->XferOptions,
1133 }
1134 }
1135
1136 /* Process Unlocked */
1137 __HAL_UNLOCK(hfmpsmbus);
1138
1139 /* Note : The FMPSMBUS interrupts must be enabled after unlocking current process
1140 to avoid the risk of FMPSMBUS interrupt handle execution before current
1141 process unlock */
1143
1144 return HAL_OK;
1145 }
1146 else
1147 {
1148 return HAL_BUSY;
1149 }
1150}
1151
1162{
1163 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1164 {
1165 /* Process Locked */
1166 __HAL_LOCK(hfmpsmbus);
1167
1168 /* Keep the same state as previous */
1169 /* to perform as well the call of the corresponding end of transfer callback */
1171 {
1173 }
1174 else if (hfmpsmbus->PreviousState == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1175 {
1177 }
1178 else
1179 {
1180 /* Wrong usage of abort function */
1181 /* This function should be used only in case of abort monitored by master device */
1182 return HAL_ERROR;
1183 }
1185
1186 /* Set NBYTES to 1 to generate a dummy read on FMPSMBUS peripheral */
1187 /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */
1189
1190 /* Process Unlocked */
1191 __HAL_UNLOCK(hfmpsmbus);
1192
1193 /* Note : The FMPSMBUS interrupts must be enabled after unlocking current process
1194 to avoid the risk of FMPSMBUS interrupt handle execution before current
1195 process unlock */
1196 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1197 {
1199 }
1200 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1201 {
1203 }
1204 else
1205 {
1206 /* Nothing to do */
1207 }
1208
1209 return HAL_OK;
1210 }
1211 else
1212 {
1213 return HAL_BUSY;
1214 }
1215}
1216
1227 uint32_t XferOptions)
1228{
1229 /* Check the parameters */
1231
1233 {
1234 if ((pData == NULL) || (Size == 0UL))
1235 {
1237 return HAL_ERROR;
1238 }
1239
1240 /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
1242
1243 /* Process Locked */
1244 __HAL_LOCK(hfmpsmbus);
1245
1248
1249 /* Set SBC bit to manage Acknowledge at each bit */
1250 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
1251
1252 /* Enable Address Acknowledge */
1253 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1254
1255 /* Prepare transfer parameters */
1256 hfmpsmbus->pBuffPtr = pData;
1257 hfmpsmbus->XferCount = Size;
1258 hfmpsmbus->XferOptions = XferOptions;
1259
1260 /* Convert OTHER_xxx XferOptions if any */
1262
1263 if (Size > MAX_NBYTE_SIZE)
1264 {
1265 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
1266 }
1267 else
1268 {
1269 hfmpsmbus->XferSize = Size;
1270 }
1271
1272 /* Set NBYTES to write and reload if size > MAX_NBYTE_SIZE and generate RESTART */
1273 if ((hfmpsmbus->XferSize < hfmpsmbus->XferCount) && (hfmpsmbus->XferSize == MAX_NBYTE_SIZE))
1274 {
1275 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize,
1278 }
1279 else
1280 {
1281 /* Set NBYTE to transmit */
1282 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1284
1285 /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */
1286 /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */
1287 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
1288 {
1289 hfmpsmbus->XferSize--;
1290 hfmpsmbus->XferCount--;
1291 }
1292 }
1293
1294 /* Clear ADDR flag after prepare the transfer parameters */
1295 /* This action will generate an acknowledge to the HOST */
1297
1298 /* Process Unlocked */
1299 __HAL_UNLOCK(hfmpsmbus);
1300
1301 /* Note : The FMPSMBUS interrupts must be enabled after unlocking current process
1302 to avoid the risk of FMPSMBUS interrupt handle execution before current
1303 process unlock */
1304 /* REnable ADDR interrupt */
1306
1307 return HAL_OK;
1308 }
1309 else
1310 {
1311 return HAL_BUSY;
1312 }
1313}
1314
1325 uint32_t XferOptions)
1326{
1327 /* Check the parameters */
1329
1331 {
1332 if ((pData == NULL) || (Size == 0UL))
1333 {
1335 return HAL_ERROR;
1336 }
1337
1338 /* Disable Interrupts, to prevent preemption during treatment in case of multicall */
1340
1341 /* Process Locked */
1342 __HAL_LOCK(hfmpsmbus);
1343
1346
1347 /* Set SBC bit to manage Acknowledge at each bit */
1348 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_SBC;
1349
1350 /* Enable Address Acknowledge */
1351 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
1352
1353 /* Prepare transfer parameters */
1354 hfmpsmbus->pBuffPtr = pData;
1355 hfmpsmbus->XferSize = Size;
1356 hfmpsmbus->XferCount = Size;
1357 hfmpsmbus->XferOptions = XferOptions;
1358
1359 /* Convert OTHER_xxx XferOptions if any */
1361
1362 /* Set NBYTE to receive */
1363 /* If XferSize equal "1", or XferSize equal "2" with PEC requested (mean 1 data byte + 1 PEC byte */
1364 /* no need to set RELOAD bit mode, a ACK will be automatically generated in that case */
1365 /* else need to set RELOAD bit mode to generate an automatic ACK at each byte Received */
1366 /* This RELOAD bit will be reset for last BYTE to be receive in FMPSMBUS_Slave_ISR */
1367 if (((FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL) && (hfmpsmbus->XferSize == 2U)) || (hfmpsmbus->XferSize == 1U))
1368 {
1369 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
1371 }
1372 else
1373 {
1375 }
1376
1377 /* Clear ADDR flag after prepare the transfer parameters */
1378 /* This action will generate an acknowledge to the HOST */
1380
1381 /* Process Unlocked */
1382 __HAL_UNLOCK(hfmpsmbus);
1383
1384 /* Note : The FMPSMBUS interrupts must be enabled after unlocking current process
1385 to avoid the risk of FMPSMBUS interrupt handle execution before current
1386 process unlock */
1387 /* REnable ADDR interrupt */
1389
1390 return HAL_OK;
1391 }
1392 else
1393 {
1394 return HAL_BUSY;
1395 }
1396}
1397
1405{
1406 hfmpsmbus->State = HAL_FMPSMBUS_STATE_LISTEN;
1407
1408 /* Enable the Address Match interrupt */
1410
1411 return HAL_OK;
1412}
1413
1421{
1422 /* Disable Address listen mode only if a transfer is not ongoing */
1423 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_LISTEN)
1424 {
1425 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1426
1427 /* Disable the Address Match interrupt */
1429
1430 return HAL_OK;
1431 }
1432 else
1433 {
1434 return HAL_BUSY;
1435 }
1436}
1437
1445{
1446 /* Enable SMBus alert */
1447 hfmpsmbus->Instance->CR1 |= FMPI2C_CR1_ALERTEN;
1448
1449 /* Clear ALERT flag */
1451
1452 /* Enable Alert Interrupt */
1454
1455 return HAL_OK;
1456}
1464{
1465 /* Enable SMBus alert */
1466 hfmpsmbus->Instance->CR1 &= ~FMPI2C_CR1_ALERTEN;
1467
1468 /* Disable Alert Interrupt */
1470
1471 return HAL_OK;
1472}
1473
1484HAL_StatusTypeDef HAL_FMPSMBUS_IsDeviceReady(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint32_t Trials,
1485 uint32_t Timeout)
1486{
1487 uint32_t tickstart;
1488
1489 __IO uint32_t FMPSMBUS_Trials = 0UL;
1490
1491 FlagStatus tmp1;
1492 FlagStatus tmp2;
1493
1494 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_READY)
1495 {
1496 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_BUSY) != RESET)
1497 {
1498 return HAL_BUSY;
1499 }
1500
1501 /* Process Locked */
1502 __HAL_LOCK(hfmpsmbus);
1503
1504 hfmpsmbus->State = HAL_FMPSMBUS_STATE_BUSY;
1506
1507 do
1508 {
1509 /* Generate Start */
1510 hfmpsmbus->Instance->CR2 = FMPSMBUS_GENERATE_START(hfmpsmbus->Init.AddressingMode, DevAddress);
1511
1512 /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
1513 /* Wait until STOPF flag is set or a NACK flag is set*/
1514 tickstart = HAL_GetTick();
1515
1517 tmp2 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1518
1519 while ((tmp1 == RESET) && (tmp2 == RESET))
1520 {
1521 if (Timeout != HAL_MAX_DELAY)
1522 {
1523 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1524 {
1525 /* Device is ready */
1526 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1527
1528 /* Update FMPSMBUS error code */
1530
1531 /* Process Unlocked */
1532 __HAL_UNLOCK(hfmpsmbus);
1533 return HAL_ERROR;
1534 }
1535 }
1536
1538 tmp2 = __HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF);
1539 }
1540
1541 /* Check if the NACKF flag has not been set */
1542 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_AF) == RESET)
1543 {
1544 /* Wait until STOPF flag is reset */
1545 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1546 {
1547 return HAL_ERROR;
1548 }
1549
1550 /* Clear STOP Flag */
1552
1553 /* Device is ready */
1554 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1555
1556 /* Process Unlocked */
1557 __HAL_UNLOCK(hfmpsmbus);
1558
1559 return HAL_OK;
1560 }
1561 else
1562 {
1563 /* Wait until STOPF flag is reset */
1564 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1565 {
1566 return HAL_ERROR;
1567 }
1568
1569 /* Clear NACK Flag */
1571
1572 /* Clear STOP Flag, auto generated with autoend*/
1574 }
1575
1576 /* Check if the maximum allowed number of trials has been reached */
1577 if (FMPSMBUS_Trials == Trials)
1578 {
1579 /* Generate Stop */
1580 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_STOP;
1581
1582 /* Wait until STOPF flag is reset */
1583 if (FMPSMBUS_WaitOnFlagUntilTimeout(hfmpsmbus, FMPSMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1584 {
1585 return HAL_ERROR;
1586 }
1587
1588 /* Clear STOP Flag */
1590 }
1591
1592 /* Increment Trials */
1593 FMPSMBUS_Trials++;
1594 } while (FMPSMBUS_Trials < Trials);
1595
1596 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1597
1598 /* Update FMPSMBUS error code */
1600
1601 /* Process Unlocked */
1602 __HAL_UNLOCK(hfmpsmbus);
1603
1604 return HAL_ERROR;
1605 }
1606 else
1607 {
1608 return HAL_BUSY;
1609 }
1610}
1626{
1627 /* Use a local variable to store the current ISR flags */
1628 /* This action will avoid a wrong treatment due to ISR flags change during interrupt handler */
1629 uint32_t tmpisrvalue = READ_REG(hfmpsmbus->Instance->ISR);
1630 uint32_t tmpcr1value = READ_REG(hfmpsmbus->Instance->CR1);
1631
1632 /* FMPSMBUS in mode Transmitter ---------------------------------------------------*/
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)))
1640 {
1641 /* Slave mode selected */
1643 {
1644 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1645 }
1646 /* Master mode selected */
1648 {
1649 (void)FMPSMBUS_Master_ISR(hfmpsmbus, tmpisrvalue);
1650 }
1651 else
1652 {
1653 /* Nothing to do */
1654 }
1655 }
1656
1657 /* FMPSMBUS in mode Receiver ----------------------------------------------------*/
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)))
1665 {
1666 /* Slave mode selected */
1668 {
1669 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1670 }
1671 /* Master mode selected */
1673 {
1674 (void)FMPSMBUS_Master_ISR(hfmpsmbus, tmpisrvalue);
1675 }
1676 else
1677 {
1678 /* Nothing to do */
1679 }
1680 }
1681
1682 /* FMPSMBUS in mode Listener Only --------------------------------------------------*/
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)))
1689 {
1691 {
1692 (void)FMPSMBUS_Slave_ISR(hfmpsmbus, tmpisrvalue);
1693 }
1694 }
1695}
1696
1707
1715{
1716 /* Prevent unused argument(s) compilation warning */
1717 UNUSED(hfmpsmbus);
1718
1719 /* NOTE : This function should not be modified, when the callback is needed,
1720 the HAL_FMPSMBUS_MasterTxCpltCallback() could be implemented in the user file
1721 */
1722}
1723
1731{
1732 /* Prevent unused argument(s) compilation warning */
1733 UNUSED(hfmpsmbus);
1734
1735 /* NOTE : This function should not be modified, when the callback is needed,
1736 the HAL_FMPSMBUS_MasterRxCpltCallback() could be implemented in the user file
1737 */
1738}
1739
1746{
1747 /* Prevent unused argument(s) compilation warning */
1748 UNUSED(hfmpsmbus);
1749
1750 /* NOTE : This function should not be modified, when the callback is needed,
1751 the HAL_FMPSMBUS_SlaveTxCpltCallback() could be implemented in the user file
1752 */
1753}
1754
1762{
1763 /* Prevent unused argument(s) compilation warning */
1764 UNUSED(hfmpsmbus);
1765
1766 /* NOTE : This function should not be modified, when the callback is needed,
1767 the HAL_FMPSMBUS_SlaveRxCpltCallback() could be implemented in the user file
1768 */
1769}
1770
1779__weak void HAL_FMPSMBUS_AddrCallback(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint8_t TransferDirection,
1780 uint16_t AddrMatchCode)
1781{
1782 /* Prevent unused argument(s) compilation warning */
1783 UNUSED(hfmpsmbus);
1784 UNUSED(TransferDirection);
1785 UNUSED(AddrMatchCode);
1786
1787 /* NOTE : This function should not be modified, when the callback is needed,
1788 the HAL_FMPSMBUS_AddrCallback() could be implemented in the user file
1789 */
1790}
1791
1799{
1800 /* Prevent unused argument(s) compilation warning */
1801 UNUSED(hfmpsmbus);
1802
1803 /* NOTE : This function should not be modified, when the callback is needed,
1804 the HAL_FMPSMBUS_ListenCpltCallback() could be implemented in the user file
1805 */
1806}
1807
1815{
1816 /* Prevent unused argument(s) compilation warning */
1817 UNUSED(hfmpsmbus);
1818
1819 /* NOTE : This function should not be modified, when the callback is needed,
1820 the HAL_FMPSMBUS_ErrorCallback() could be implemented in the user file
1821 */
1822}
1823
1850{
1851 /* Return FMPSMBUS handle state */
1852 return hfmpsmbus->State;
1853}
1854
1862{
1863 return hfmpsmbus->ErrorCode;
1864}
1865
1886static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
1887{
1888 uint16_t DevAddress;
1889
1890 /* Process Locked */
1891 __HAL_LOCK(hfmpsmbus);
1892
1893 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_AF) != RESET)
1894 {
1895 /* Clear NACK Flag */
1897
1898 /* Set corresponding Error Code */
1899 /* No need to generate STOP, it is automatically done */
1900 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ACKF;
1901
1902 /* Flush TX register */
1903 FMPSMBUS_Flush_TXDR(hfmpsmbus);
1904
1905 /* Process Unlocked */
1906 __HAL_UNLOCK(hfmpsmbus);
1907
1908 /* Call the Error callback to inform upper layer */
1909#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1910 hfmpsmbus->ErrorCallback(hfmpsmbus);
1911#else
1912 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
1913#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
1914 }
1915 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_STOPF) != RESET)
1916 {
1917 /* Check and treat errors if errors occurs during STOP process */
1918 FMPSMBUS_ITErrorHandler(hfmpsmbus);
1919
1920 /* Call the corresponding callback to inform upper layer of End of Transfer */
1921 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
1922 {
1923 /* Disable Interrupt */
1925
1926 /* Clear STOP Flag */
1928
1929 /* Clear Configuration Register 2 */
1930 FMPSMBUS_RESET_CR2(hfmpsmbus);
1931
1932 /* Flush remaining data in Fifo register in case of error occurs before TXEmpty */
1933 /* Disable the selected FMPSMBUS peripheral */
1934 __HAL_FMPSMBUS_DISABLE(hfmpsmbus);
1935
1937 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1938
1939 /* Process Unlocked */
1940 __HAL_UNLOCK(hfmpsmbus);
1941
1942 /* Re-enable the selected FMPSMBUS peripheral */
1943 __HAL_FMPSMBUS_ENABLE(hfmpsmbus);
1944
1945 /* Call the corresponding callback to inform upper layer of End of Transfer */
1946#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1947 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
1948#else
1950#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
1951 }
1952 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
1953 {
1954 /* Store Last receive data if any */
1955 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET)
1956 {
1957 /* Read data from RXDR */
1958 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
1959
1960 /* Increment Buffer pointer */
1961 hfmpsmbus->pBuffPtr++;
1962
1963 if ((hfmpsmbus->XferSize > 0U))
1964 {
1965 hfmpsmbus->XferSize--;
1966 hfmpsmbus->XferCount--;
1967 }
1968 }
1969
1970 /* Disable Interrupt */
1972
1973 /* Clear STOP Flag */
1975
1976 /* Clear Configuration Register 2 */
1977 FMPSMBUS_RESET_CR2(hfmpsmbus);
1978
1980 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
1981
1982 /* Process Unlocked */
1983 __HAL_UNLOCK(hfmpsmbus);
1984
1985 /* Call the corresponding callback to inform upper layer of End of Transfer */
1986#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
1987 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
1988#else
1990#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
1991 }
1992 else
1993 {
1994 /* Nothing to do */
1995 }
1996 }
1997 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET)
1998 {
1999 /* Read data from RXDR */
2000 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2001
2002 /* Increment Buffer pointer */
2003 hfmpsmbus->pBuffPtr++;
2004
2005 /* Increment Size counter */
2006 hfmpsmbus->XferSize--;
2007 hfmpsmbus->XferCount--;
2008 }
2009 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TXIS) != RESET)
2010 {
2011 /* Write data to TXDR */
2012 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
2013
2014 /* Increment Buffer pointer */
2015 hfmpsmbus->pBuffPtr++;
2016
2017 /* Increment Size counter */
2018 hfmpsmbus->XferSize--;
2019 hfmpsmbus->XferCount--;
2020 }
2021 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TCR) != RESET)
2022 {
2023 if ((hfmpsmbus->XferCount != 0U) && (hfmpsmbus->XferSize == 0U))
2024 {
2025 DevAddress = (uint16_t)(hfmpsmbus->Instance->CR2 & FMPI2C_CR2_SADD);
2026
2027 if (hfmpsmbus->XferCount > MAX_NBYTE_SIZE)
2028 {
2029 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, MAX_NBYTE_SIZE,
2032 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
2033 }
2034 else
2035 {
2036 hfmpsmbus->XferSize = hfmpsmbus->XferCount;
2037 FMPSMBUS_TransferConfig(hfmpsmbus, DevAddress, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
2039 /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */
2040 /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */
2041 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
2042 {
2043 hfmpsmbus->XferSize--;
2044 hfmpsmbus->XferCount--;
2045 }
2046 }
2047 }
2048 else if ((hfmpsmbus->XferCount == 0U) && (hfmpsmbus->XferSize == 0U))
2049 {
2050 /* Call TxCpltCallback() if no stop mode is set */
2052 {
2053 /* Call the corresponding callback to inform upper layer of End of Transfer */
2054 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
2055 {
2056 /* Disable Interrupt */
2058 hfmpsmbus->PreviousState = hfmpsmbus->State;
2059 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2060
2061 /* Process Unlocked */
2062 __HAL_UNLOCK(hfmpsmbus);
2063
2064 /* Call the corresponding callback to inform upper layer of End of Transfer */
2065#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2066 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
2067#else
2069#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2070 }
2071 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
2072 {
2074 hfmpsmbus->PreviousState = hfmpsmbus->State;
2075 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2076
2077 /* Process Unlocked */
2078 __HAL_UNLOCK(hfmpsmbus);
2079
2080 /* Call the corresponding callback to inform upper layer of End of Transfer */
2081#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2082 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
2083#else
2085#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2086 }
2087 else
2088 {
2089 /* Nothing to do */
2090 }
2091 }
2092 }
2093 else
2094 {
2095 /* Nothing to do */
2096 }
2097 }
2098 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TC) != RESET)
2099 {
2100 if (hfmpsmbus->XferCount == 0U)
2101 {
2102 /* Specific use case for Quick command */
2103 if (hfmpsmbus->pBuffPtr == NULL)
2104 {
2105 /* Generate a Stop command */
2106 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_STOP;
2107 }
2108 /* Call TxCpltCallback() if no stop mode is set */
2109 else if (FMPSMBUS_GET_STOP_MODE(hfmpsmbus) != FMPSMBUS_AUTOEND_MODE)
2110 {
2111 /* No Generate Stop, to permit restart mode */
2112 /* The stop will be done at the end of transfer, when FMPSMBUS_AUTOEND_MODE enable */
2113
2114 /* Call the corresponding callback to inform upper layer of End of Transfer */
2115 if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_TX)
2116 {
2117 /* Disable Interrupt */
2119 hfmpsmbus->PreviousState = hfmpsmbus->State;
2120 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2121
2122 /* Process Unlocked */
2123 __HAL_UNLOCK(hfmpsmbus);
2124
2125 /* Call the corresponding callback to inform upper layer of End of Transfer */
2126#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2127 hfmpsmbus->MasterTxCpltCallback(hfmpsmbus);
2128#else
2130#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2131 }
2132 else if (hfmpsmbus->State == HAL_FMPSMBUS_STATE_MASTER_BUSY_RX)
2133 {
2135 hfmpsmbus->PreviousState = hfmpsmbus->State;
2136 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2137
2138 /* Process Unlocked */
2139 __HAL_UNLOCK(hfmpsmbus);
2140
2141 /* Call the corresponding callback to inform upper layer of End of Transfer */
2142#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2143 hfmpsmbus->MasterRxCpltCallback(hfmpsmbus);
2144#else
2146#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2147 }
2148 else
2149 {
2150 /* Nothing to do */
2151 }
2152 }
2153 else
2154 {
2155 /* Nothing to do */
2156 }
2157 }
2158 }
2159 else
2160 {
2161 /* Nothing to do */
2162 }
2163
2164 /* Process Unlocked */
2165 __HAL_UNLOCK(hfmpsmbus);
2166
2167 return HAL_OK;
2168}
2176static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
2177{
2178 uint8_t TransferDirection;
2179 uint16_t SlaveAddrCode;
2180
2181 /* Process Locked */
2182 __HAL_LOCK(hfmpsmbus);
2183
2184 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_AF) != RESET)
2185 {
2186 /* Check that FMPSMBUS transfer finished */
2187 /* if yes, normal usecase, a NACK is sent by the HOST when Transfer is finished */
2188 /* Mean XferCount == 0*/
2189 /* So clear Flag NACKF only */
2190 if (hfmpsmbus->XferCount == 0U)
2191 {
2192 /* Clear NACK Flag */
2194
2195 /* Flush TX register */
2196 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2197
2198 /* Process Unlocked */
2199 __HAL_UNLOCK(hfmpsmbus);
2200 }
2201 else
2202 {
2203 /* if no, error usecase, a Non-Acknowledge of last Data is generated by the HOST*/
2204 /* Clear NACK Flag */
2206
2207 /* Set HAL State to "Idle" State, mean to LISTEN state */
2208 /* So reset Slave Busy state */
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);
2212
2213 /* Disable RX/TX Interrupts, keep only ADDR Interrupt */
2215
2216 /* Set ErrorCode corresponding to a Non-Acknowledge */
2217 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ACKF;
2218
2219 /* Flush TX register */
2220 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2221
2222 /* Process Unlocked */
2223 __HAL_UNLOCK(hfmpsmbus);
2224
2225 /* Call the Error callback to inform upper layer */
2226#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2227 hfmpsmbus->ErrorCallback(hfmpsmbus);
2228#else
2229 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
2230#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2231 }
2232 }
2233 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_ADDR) != RESET)
2234 {
2235 TransferDirection = (uint8_t)(FMPSMBUS_GET_DIR(hfmpsmbus));
2236 SlaveAddrCode = (uint16_t)(FMPSMBUS_GET_ADDR_MATCH(hfmpsmbus));
2237
2238 /* Disable ADDR interrupt to prevent multiple ADDRInterrupt*/
2239 /* Other ADDRInterrupt will be treat in next Listen usecase */
2241
2242 /* Process Unlocked */
2243 __HAL_UNLOCK(hfmpsmbus);
2244
2245 /* Call Slave Addr callback */
2246#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2247 hfmpsmbus->AddrCallback(hfmpsmbus, TransferDirection, SlaveAddrCode);
2248#else
2249 HAL_FMPSMBUS_AddrCallback(hfmpsmbus, TransferDirection, SlaveAddrCode);
2250#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2251 }
2252 else if ((FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_RXNE) != RESET) ||
2253 (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TCR) != RESET))
2254 {
2256 {
2257 /* Read data from RXDR */
2258 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2259
2260 /* Increment Buffer pointer */
2261 hfmpsmbus->pBuffPtr++;
2262
2263 hfmpsmbus->XferSize--;
2264 hfmpsmbus->XferCount--;
2265
2266 if (hfmpsmbus->XferCount == 1U)
2267 {
2268 /* Receive last Byte, can be PEC byte in case of PEC BYTE enabled */
2269 /* or only the last Byte of Transfer */
2270 /* So reset the RELOAD bit mode */
2271 hfmpsmbus->XferOptions &= ~FMPSMBUS_RELOAD_MODE;
2272 FMPSMBUS_TransferConfig(hfmpsmbus, 0, 1, hfmpsmbus->XferOptions, FMPSMBUS_NO_STARTSTOP);
2273 }
2274 else if (hfmpsmbus->XferCount == 0U)
2275 {
2276 /* Last Byte is received, disable Interrupt */
2278
2279 /* Remove HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX, keep only HAL_FMPSMBUS_STATE_LISTEN */
2280 hfmpsmbus->PreviousState = hfmpsmbus->State;
2281 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX);
2282
2283 /* Process Unlocked */
2284 __HAL_UNLOCK(hfmpsmbus);
2285
2286 /* Call the corresponding callback to inform upper layer of End of Transfer */
2287#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2288 hfmpsmbus->SlaveRxCpltCallback(hfmpsmbus);
2289#else
2291#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2292 }
2293 else
2294 {
2295 /* Set Reload for next Bytes */
2296 FMPSMBUS_TransferConfig(hfmpsmbus, 0, 1,
2299
2300 /* Ack last Byte Read */
2301 hfmpsmbus->Instance->CR2 &= ~FMPI2C_CR2_NACK;
2302 }
2303 }
2305 {
2306 if ((hfmpsmbus->XferCount != 0U) && (hfmpsmbus->XferSize == 0U))
2307 {
2308 if (hfmpsmbus->XferCount > MAX_NBYTE_SIZE)
2309 {
2313 hfmpsmbus->XferSize = MAX_NBYTE_SIZE;
2314 }
2315 else
2316 {
2317 hfmpsmbus->XferSize = hfmpsmbus->XferCount;
2318 FMPSMBUS_TransferConfig(hfmpsmbus, 0, (uint8_t)hfmpsmbus->XferSize, hfmpsmbus->XferOptions,
2320 /* If PEC mode is enable, size to transmit should be Size-1 byte, corresponding to PEC byte */
2321 /* PEC byte is automatically sent by HW block, no need to manage it in Transmit process */
2322 if (FMPSMBUS_GET_PEC_MODE(hfmpsmbus) != 0UL)
2323 {
2324 hfmpsmbus->XferSize--;
2325 hfmpsmbus->XferCount--;
2326 }
2327 }
2328 }
2329 }
2330 else
2331 {
2332 /* Nothing to do */
2333 }
2334 }
2335 else if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_TXIS) != RESET)
2336 {
2337 /* Write data to TXDR only if XferCount not reach "0" */
2338 /* A TXIS flag can be set, during STOP treatment */
2339 /* Check if all Data have already been sent */
2340 /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */
2341 if (hfmpsmbus->XferCount > 0U)
2342 {
2343 /* Write data to TXDR */
2344 hfmpsmbus->Instance->TXDR = *hfmpsmbus->pBuffPtr;
2345
2346 /* Increment Buffer pointer */
2347 hfmpsmbus->pBuffPtr++;
2348
2349 hfmpsmbus->XferCount--;
2350 hfmpsmbus->XferSize--;
2351 }
2352
2353 if (hfmpsmbus->XferCount == 0U)
2354 {
2355 /* Last Byte is Transmitted */
2356 /* Remove HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX, keep only HAL_FMPSMBUS_STATE_LISTEN */
2358 hfmpsmbus->PreviousState = hfmpsmbus->State;
2359 hfmpsmbus->State &= ~((uint32_t)HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX);
2360
2361 /* Process Unlocked */
2362 __HAL_UNLOCK(hfmpsmbus);
2363
2364 /* Call the corresponding callback to inform upper layer of End of Transfer */
2365#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2366 hfmpsmbus->SlaveTxCpltCallback(hfmpsmbus);
2367#else
2369#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2370 }
2371 }
2372 else
2373 {
2374 /* Nothing to do */
2375 }
2376
2377 /* Check if STOPF is set */
2378 if (FMPSMBUS_CHECK_FLAG(StatusFlags, FMPSMBUS_FLAG_STOPF) != RESET)
2379 {
2381 {
2382 /* Store Last receive data if any */
2383 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_RXNE) != RESET)
2384 {
2385 /* Read data from RXDR */
2386 *hfmpsmbus->pBuffPtr = (uint8_t)(hfmpsmbus->Instance->RXDR);
2387
2388 /* Increment Buffer pointer */
2389 hfmpsmbus->pBuffPtr++;
2390
2391 if ((hfmpsmbus->XferSize > 0U))
2392 {
2393 hfmpsmbus->XferSize--;
2394 hfmpsmbus->XferCount--;
2395 }
2396 }
2397
2398 /* Disable RX and TX Interrupts */
2400
2401 /* Disable ADDR Interrupt */
2403
2404 /* Disable Address Acknowledge */
2405 hfmpsmbus->Instance->CR2 |= FMPI2C_CR2_NACK;
2406
2407 /* Clear Configuration Register 2 */
2408 FMPSMBUS_RESET_CR2(hfmpsmbus);
2409
2410 /* Clear STOP Flag */
2412
2413 /* Clear ADDR flag */
2415
2416 hfmpsmbus->XferOptions = 0;
2417 hfmpsmbus->PreviousState = hfmpsmbus->State;
2418 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2419
2420 /* Process Unlocked */
2421 __HAL_UNLOCK(hfmpsmbus);
2422
2423 /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */
2424#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2425 hfmpsmbus->ListenCpltCallback(hfmpsmbus);
2426#else
2428#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2429 }
2430 }
2431
2432 /* Process Unlocked */
2433 __HAL_UNLOCK(hfmpsmbus);
2434
2435 return HAL_OK;
2436}
2444static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
2445{
2446 uint32_t tmpisr = 0UL;
2447
2448 if ((InterruptRequest & FMPSMBUS_IT_ALERT) == FMPSMBUS_IT_ALERT)
2449 {
2450 /* Enable ERR interrupt */
2451 tmpisr |= FMPSMBUS_IT_ERRI;
2452 }
2453
2454 if ((InterruptRequest & FMPSMBUS_IT_ADDR) == FMPSMBUS_IT_ADDR)
2455 {
2456 /* Enable ADDR, STOP interrupt */
2458 }
2459
2460 if ((InterruptRequest & FMPSMBUS_IT_TX) == FMPSMBUS_IT_TX)
2461 {
2462 /* Enable ERR, TC, STOP, NACK, RXI interrupt */
2464 }
2465
2466 if ((InterruptRequest & FMPSMBUS_IT_RX) == FMPSMBUS_IT_RX)
2467 {
2468 /* Enable ERR, TC, STOP, NACK, TXI interrupt */
2470 }
2471
2472 /* Enable interrupts only at the end */
2473 /* to avoid the risk of FMPSMBUS interrupt handle execution before */
2474 /* all interrupts requested done */
2475 __HAL_FMPSMBUS_ENABLE_IT(hfmpsmbus, tmpisr);
2476}
2484static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
2485{
2486 uint32_t tmpisr = 0UL;
2487 uint32_t tmpstate = hfmpsmbus->State;
2488
2489 if ((tmpstate == HAL_FMPSMBUS_STATE_READY) && ((InterruptRequest & FMPSMBUS_IT_ALERT) == FMPSMBUS_IT_ALERT))
2490 {
2491 /* Disable ERR interrupt */
2492 tmpisr |= FMPSMBUS_IT_ERRI;
2493 }
2494
2495 if ((InterruptRequest & FMPSMBUS_IT_TX) == FMPSMBUS_IT_TX)
2496 {
2497 /* Disable TC, STOP, NACK and TXI interrupt */
2498 tmpisr |= FMPSMBUS_IT_TCI | FMPSMBUS_IT_TXI;
2499
2500 if ((FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2502 {
2503 /* Disable ERR interrupt */
2504 tmpisr |= FMPSMBUS_IT_ERRI;
2505 }
2506
2508 {
2509 /* Disable STOP and NACK interrupt */
2511 }
2512 }
2513
2514 if ((InterruptRequest & FMPSMBUS_IT_RX) == FMPSMBUS_IT_RX)
2515 {
2516 /* Disable TC, STOP, NACK and RXI interrupt */
2517 tmpisr |= FMPSMBUS_IT_TCI | FMPSMBUS_IT_RXI;
2518
2519 if ((FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2521 {
2522 /* Disable ERR interrupt */
2523 tmpisr |= FMPSMBUS_IT_ERRI;
2524 }
2525
2527 {
2528 /* Disable STOP and NACK interrupt */
2530 }
2531 }
2532
2533 if ((InterruptRequest & FMPSMBUS_IT_ADDR) == FMPSMBUS_IT_ADDR)
2534 {
2535 /* Disable ADDR, STOP and NACK interrupt */
2537
2538 if (FMPSMBUS_GET_ALERT_ENABLED(hfmpsmbus) == 0UL)
2539 {
2540 /* Disable ERR interrupt */
2541 tmpisr |= FMPSMBUS_IT_ERRI;
2542 }
2543 }
2544
2545 /* Disable interrupts only at the end */
2546 /* to avoid a breaking situation like at "t" time */
2547 /* all disable interrupts request are not done */
2548 __HAL_FMPSMBUS_DISABLE_IT(hfmpsmbus, tmpisr);
2549}
2550
2557{
2558 uint32_t itflags = READ_REG(hfmpsmbus->Instance->ISR);
2559 uint32_t itsources = READ_REG(hfmpsmbus->Instance->CR1);
2560 uint32_t tmpstate;
2561 uint32_t tmperror;
2562
2563 /* FMPSMBUS Bus error interrupt occurred ------------------------------------*/
2564 if (((itflags & FMPSMBUS_FLAG_BERR) == FMPSMBUS_FLAG_BERR) && \
2565 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2566 {
2567 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_BERR;
2568
2569 /* Clear BERR flag */
2571 }
2572
2573 /* FMPSMBUS Over-Run/Under-Run interrupt occurred ----------------------------------------*/
2574 if (((itflags & FMPSMBUS_FLAG_OVR) == FMPSMBUS_FLAG_OVR) && \
2575 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2576 {
2577 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_OVR;
2578
2579 /* Clear OVR flag */
2581 }
2582
2583 /* FMPSMBUS Arbitration Loss error interrupt occurred ------------------------------------*/
2584 if (((itflags & FMPSMBUS_FLAG_ARLO) == FMPSMBUS_FLAG_ARLO) && \
2585 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2586 {
2587 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ARLO;
2588
2589 /* Clear ARLO flag */
2591 }
2592
2593 /* FMPSMBUS Timeout error interrupt occurred ---------------------------------------------*/
2594 if (((itflags & FMPSMBUS_FLAG_TIMEOUT) == FMPSMBUS_FLAG_TIMEOUT) && \
2595 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2596 {
2598
2599 /* Clear TIMEOUT flag */
2601 }
2602
2603 /* FMPSMBUS Alert error interrupt occurred -----------------------------------------------*/
2604 if (((itflags & FMPSMBUS_FLAG_ALERT) == FMPSMBUS_FLAG_ALERT) && \
2605 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2606 {
2607 hfmpsmbus->ErrorCode |= HAL_FMPSMBUS_ERROR_ALERT;
2608
2609 /* Clear ALERT flag */
2611 }
2612
2613 /* FMPSMBUS Packet Error Check error interrupt occurred ----------------------------------*/
2614 if (((itflags & FMPSMBUS_FLAG_PECERR) == FMPSMBUS_FLAG_PECERR) && \
2615 ((itsources & FMPSMBUS_IT_ERRI) == FMPSMBUS_IT_ERRI))
2616 {
2618
2619 /* Clear PEC error flag */
2621 }
2622
2623 if (hfmpsmbus->ErrorCode != HAL_FMPSMBUS_ERROR_NONE)
2624 {
2625 /* Flush TX register */
2626 FMPSMBUS_Flush_TXDR(hfmpsmbus);
2627 }
2628
2629 /* Store current volatile hfmpsmbus->ErrorCode, misra rule */
2630 tmperror = hfmpsmbus->ErrorCode;
2631
2632 /* Call the Error Callback in case of Error detected */
2633 if ((tmperror != HAL_FMPSMBUS_ERROR_NONE) && (tmperror != HAL_FMPSMBUS_ERROR_ACKF))
2634 {
2635 /* Do not Reset the HAL state in case of ALERT error */
2637 {
2638 /* Store current volatile hfmpsmbus->State, misra rule */
2639 tmpstate = hfmpsmbus->State;
2640
2643 {
2644 /* Reset only HAL_FMPSMBUS_STATE_SLAVE_BUSY_XX */
2645 /* keep HAL_FMPSMBUS_STATE_LISTEN if set */
2647 hfmpsmbus->State = HAL_FMPSMBUS_STATE_LISTEN;
2648 }
2649 }
2650
2651 /* Call the Error callback to inform upper layer */
2652#if (USE_HAL_FMPSMBUS_REGISTER_CALLBACKS == 1)
2653 hfmpsmbus->ErrorCallback(hfmpsmbus);
2654#else
2655 HAL_FMPSMBUS_ErrorCallback(hfmpsmbus);
2656#endif /* USE_HAL_FMPSMBUS_REGISTER_CALLBACKS */
2657 }
2658}
2659
2670 FlagStatus Status, uint32_t Timeout)
2671{
2672 uint32_t tickstart = HAL_GetTick();
2673
2674 /* Wait until flag is set */
2675 while ((FlagStatus)(__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, Flag)) == Status)
2676 {
2677 /* Check for the Timeout */
2678 if (Timeout != HAL_MAX_DELAY)
2679 {
2680 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
2681 {
2682 hfmpsmbus->PreviousState = hfmpsmbus->State;
2683 hfmpsmbus->State = HAL_FMPSMBUS_STATE_READY;
2684
2685 /* Update FMPSMBUS error code */
2687
2688 /* Process Unlocked */
2689 __HAL_UNLOCK(hfmpsmbus);
2690
2691 return HAL_ERROR;
2692 }
2693 }
2694 }
2695
2696 return HAL_OK;
2697}
2698
2705{
2706 /* If a pending TXIS flag is set */
2707 /* Write a dummy data in TXDR to clear it */
2708 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TXIS) != RESET)
2709 {
2710 hfmpsmbus->Instance->TXDR = 0x00U;
2711 }
2712
2713 /* Flush TX register if not empty */
2714 if (__HAL_FMPSMBUS_GET_FLAG(hfmpsmbus, FMPSMBUS_FLAG_TXE) == RESET)
2715 {
2717 }
2718}
2719
2740static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size,
2741 uint32_t Mode, uint32_t Request)
2742{
2743 /* Check the parameters */
2744 assert_param(IS_FMPSMBUS_ALL_INSTANCE(hfmpsmbus->Instance));
2747
2748 /* update CR2 register */
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));
2756}
2757
2764{
2765 /* if user set XferOptions to FMPSMBUS_OTHER_FRAME_NO_PEC */
2766 /* it request implicitly to generate a restart condition */
2767 /* set XferOptions to FMPSMBUS_FIRST_FRAME */
2768 if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_FRAME_NO_PEC)
2769 {
2770 hfmpsmbus->XferOptions = FMPSMBUS_FIRST_FRAME;
2771 }
2772 /* else if user set XferOptions to FMPSMBUS_OTHER_FRAME_WITH_PEC */
2773 /* it request implicitly to generate a restart condition */
2774 /* set XferOptions to FMPSMBUS_FIRST_FRAME | FMPSMBUS_SENDPEC_MODE */
2775 else if (hfmpsmbus->XferOptions == FMPSMBUS_OTHER_FRAME_WITH_PEC)
2776 {
2778 }
2779 /* else if user set XferOptions to FMPSMBUS_OTHER_AND_LAST_FRAME_NO_PEC */
2780 /* it request implicitly to generate a restart condition */
2781 /* then generate a stop condition at the end of transfer */
2782 /* set XferOptions to FMPSMBUS_FIRST_AND_LAST_FRAME_NO_PEC */
2784 {
2786 }
2787 /* else if user set XferOptions to FMPSMBUS_OTHER_AND_LAST_FRAME_WITH_PEC */
2788 /* it request implicitly to generate a restart condition */
2789 /* then generate a stop condition at the end of transfer */
2790 /* set XferOptions to FMPSMBUS_FIRST_AND_LAST_FRAME_WITH_PEC */
2792 {
2794 }
2795 else
2796 {
2797 /* Nothing to do */
2798 }
2799}
2804#endif /* FMPI2C_CR1_PE */
2805#endif /* HAL_FMPSMBUS_MODULE_ENABLED */
#define HAL_FMPSMBUS_ERROR_OVR
#define HAL_FMPSMBUS_ERROR_HALTIMEOUT
#define HAL_FMPSMBUS_ERROR_ALERT
#define HAL_FMPSMBUS_ERROR_BERR
#define HAL_FMPSMBUS_ERROR_PECERR
#define HAL_FMPSMBUS_ERROR_ACKF
#define HAL_FMPSMBUS_ERROR_BUSTIMEOUT
#define HAL_FMPSMBUS_ERROR_NONE
#define HAL_FMPSMBUS_ERROR_ARLO
#define HAL_FMPSMBUS_ERROR_INVALID_PARAM
HAL_StatusTypeDef HAL_FMPSMBUS_ConfigAnalogFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t AnalogFilter)
Configure Analog noise filter.
HAL_StatusTypeDef HAL_FMPSMBUS_ConfigDigitalFilter(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t DigitalFilter)
Configure Digital noise filter.
void HAL_FMPSMBUS_MspInit(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Initialize the FMPSMBUS MSP.
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.
#define __HAL_FMPSMBUS_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disable the specified FMPSMBUS interrupts.
#define __HAL_FMPSMBUS_DISABLE(__HANDLE__)
Disable the specified FMPSMBUS peripheral.
#define __HAL_FMPSMBUS_ENABLE(__HANDLE__)
Enable the specified FMPSMBUS peripheral.
#define __HAL_FMPSMBUS_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clear the FMPSMBUS pending flags which are cleared by writing 1 in a specific bit.
#define __HAL_FMPSMBUS_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enable the specified FMPSMBUS interrupts.
#define __HAL_FMPSMBUS_GET_FLAG(__HANDLE__, __FLAG__)
#define FMPSMBUS_FLAG_TIMEOUT
#define FMPSMBUS_FLAG_TXIS
#define FMPSMBUS_FLAG_RXNE
#define FMPSMBUS_FLAG_ARLO
#define FMPSMBUS_FLAG_ADDR
#define FMPSMBUS_FLAG_TC
#define FMPSMBUS_FLAG_ALERT
#define FMPSMBUS_FLAG_STOPF
#define FMPSMBUS_FLAG_TXE
#define FMPSMBUS_FLAG_BUSY
#define FMPSMBUS_FLAG_AF
#define FMPSMBUS_FLAG_TCR
#define FMPSMBUS_FLAG_OVR
#define FMPSMBUS_FLAG_PECERR
#define FMPSMBUS_FLAG_BERR
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.
#define FMPSMBUS_IT_TX
#define FMPSMBUS_IT_NACKI
#define FMPSMBUS_IT_ADDR
#define FMPSMBUS_IT_ERRI
#define FMPSMBUS_IT_TXI
#define FMPSMBUS_IT_TCI
#define FMPSMBUS_IT_STOPI
#define FMPSMBUS_IT_ALERT
#define FMPSMBUS_IT_RX
#define FMPSMBUS_IT_RXI
#define FMPSMBUS_IT_ADDRI
#define TIMING_CLEAR_MASK
#define MAX_NBYTE_SIZE
static HAL_StatusTypeDef FMPSMBUS_WaitOnFlagUntilTimeout(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
Handle FMPSMBUS Communication Timeout.
static void FMPSMBUS_ConvertOtherXferOptions(FMPSMBUS_HandleTypeDef *hfmpsmbus)
Convert FMPSMBUSx OTHER_xxx XferOptions to functional XferOptions.
static void FMPSMBUS_Flush_TXDR(FMPSMBUS_HandleTypeDef *hfmpsmbus)
FMPSMBUS Tx data register flush process.
static void FMPSMBUS_Disable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
Manage the disabling of Interrupts.
static void FMPSMBUS_Enable_IRQ(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t InterruptRequest)
Manage the enabling of Interrupts.
static void FMPSMBUS_TransferConfig(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)
Handle FMPSMBUSx communication when starting transfer or during transfer (TC or TCR flag are set).
static HAL_StatusTypeDef FMPSMBUS_Master_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
Interrupt Sub-Routine which handle the Interrupt Flags Master Mode.
static void FMPSMBUS_ITErrorHandler(FMPSMBUS_HandleTypeDef *hfmpsmbus)
FMPSMBUS interrupts error handler.
static HAL_StatusTypeDef FMPSMBUS_Slave_ISR(FMPSMBUS_HandleTypeDef *hfmpsmbus, uint32_t StatusFlags)
Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode.
#define IS_FMPSMBUS_DUAL_ADDRESS(ADDRESS)
#define IS_FMPSMBUS_ADDRESSING_MODE(MODE)
#define FMPSMBUS_GET_ALERT_ENABLED(__HANDLE__)
#define FMPSMBUS_RESET_CR2(__HANDLE__)
#define IS_FMPSMBUS_DIGITAL_FILTER(FILTER)
#define IS_FMPSMBUS_PERIPHERAL_MODE(MODE)
#define IS_FMPSMBUS_TRANSFER_MODE(MODE)
#define IS_FMPSMBUS_OWN_ADDRESS2_MASK(MASK)
#define IS_FMPSMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST)
#define FMPSMBUS_GET_DIR(__HANDLE__)
#define IS_FMPSMBUS_GENERAL_CALL(CALL)
#define IS_FMPSMBUS_TRANSFER_REQUEST(REQUEST)
#define IS_FMPSMBUS_OWN_ADDRESS2(ADDRESS2)
#define FMPSMBUS_GENERATE_START(__ADDMODE__, __ADDRESS__)
#define IS_FMPSMBUS_PEC(PEC)
#define FMPSMBUS_CHECK_IT_SOURCE(__CR1__, __IT__)
#define FMPSMBUS_GET_PEC_MODE(__HANDLE__)
#define IS_FMPSMBUS_ANALOG_FILTER(FILTER)
#define FMPSMBUS_GET_STOP_MODE(__HANDLE__)
#define FMPSMBUS_GET_ADDR_MATCH(__HANDLE__)
#define IS_FMPSMBUS_OWN_ADDRESS1(ADDRESS1)
#define IS_FMPSMBUS_TRANSFER_OPTIONS_REQUEST(REQUEST)
#define FMPSMBUS_CHECK_FLAG(__ISR__, __FLAG__)
#define IS_FMPSMBUS_NO_STRETCH(STRETCH)
#define FMPSMBUS_SENDPEC_MODE
#define FMPSMBUS_RELOAD_MODE
#define FMPSMBUS_AUTOEND_MODE
#define FMPSMBUS_NO_STARTSTOP
#define FMPSMBUS_GENERATE_START_WRITE
#define FMPSMBUS_GENERATE_START_READ
#define FMPSMBUS_OTHER_AND_LAST_FRAME_NO_PEC
#define FMPSMBUS_OTHER_AND_LAST_FRAME_WITH_PEC
#define FMPSMBUS_OTHER_FRAME_NO_PEC
#define FMPSMBUS_FIRST_FRAME
#define FMPSMBUS_FIRST_AND_LAST_FRAME_NO_PEC
#define FMPSMBUS_OTHER_FRAME_WITH_PEC
#define FMPSMBUS_FIRST_FRAME_WITH_PEC
#define FMPSMBUS_FIRST_AND_LAST_FRAME_WITH_PEC
#define FMPSMBUS_ADDRESSINGMODE_7BIT
#define FMPSMBUS_ADDRESSINGMODE_10BIT
#define FMPSMBUS_PEC_ENABLE
#define FMPSMBUS_PERIPHERAL_MODE_FMPSMBUS_SLAVE_ARP
#define FMPSMBUS_PERIPHERAL_MODE_FMPSMBUS_SLAVE
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define HAL_FMPSMBUS_STATE_MASTER_BUSY_RX
#define HAL_FMPSMBUS_STATE_LISTEN
#define HAL_FMPSMBUS_STATE_SLAVE_BUSY_TX
#define HAL_FMPSMBUS_STATE_SLAVE_BUSY_RX
#define HAL_FMPSMBUS_STATE_MASTER_BUSY_TX
#define HAL_FMPSMBUS_STATE_READY
#define HAL_FMPSMBUS_STATE_BUSY
#define HAL_FMPSMBUS_STATE_RESET
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_ERROR
@ HAL_OK
@ HAL_BUSY
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
#define HAL_MAX_DELAY
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)