File indexing completed on 2025-05-11 08:23:09
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 #include "stm32h7xx_hal.h"
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 #ifdef HAL_SMBUS_MODULE_ENABLED
0186
0187
0188
0189
0190
0191
0192
0193 #define TIMING_CLEAR_MASK (0xF0FFFFFFUL)
0194 #define HAL_TIMEOUT_ADDR (10000U)
0195 #define HAL_TIMEOUT_BUSY (25U)
0196 #define HAL_TIMEOUT_DIR (25U)
0197 #define HAL_TIMEOUT_RXNE (25U)
0198 #define HAL_TIMEOUT_STOPF (25U)
0199 #define HAL_TIMEOUT_TC (25U)
0200 #define HAL_TIMEOUT_TCR (25U)
0201 #define HAL_TIMEOUT_TXIS (25U)
0202 #define MAX_NBYTE_SIZE 255U
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(SMBUS_HandleTypeDef *hsmbus, uint32_t Flag,
0215 FlagStatus Status, uint32_t Timeout);
0216
0217
0218 static HAL_StatusTypeDef SMBUS_Master_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags);
0219 static HAL_StatusTypeDef SMBUS_Slave_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags);
0220 static void SMBUS_ITErrorHandler(SMBUS_HandleTypeDef *hsmbus);
0221
0222
0223 static void SMBUS_Enable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest);
0224 static void SMBUS_Disable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest);
0225
0226
0227 static void SMBUS_Flush_TXDR(SMBUS_HandleTypeDef *hsmbus);
0228
0229
0230 static void SMBUS_TransferConfig(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t Size,
0231 uint32_t Mode, uint32_t Request);
0232
0233
0234 static void SMBUS_ConvertOtherXferOptions(SMBUS_HandleTypeDef *hsmbus);
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293 HAL_StatusTypeDef HAL_SMBUS_Init(SMBUS_HandleTypeDef *hsmbus)
0294 {
0295
0296 if (hsmbus == NULL)
0297 {
0298 return HAL_ERROR;
0299 }
0300
0301
0302 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance));
0303 assert_param(IS_SMBUS_ANALOG_FILTER(hsmbus->Init.AnalogFilter));
0304 assert_param(IS_SMBUS_OWN_ADDRESS1(hsmbus->Init.OwnAddress1));
0305 assert_param(IS_SMBUS_ADDRESSING_MODE(hsmbus->Init.AddressingMode));
0306 assert_param(IS_SMBUS_DUAL_ADDRESS(hsmbus->Init.DualAddressMode));
0307 assert_param(IS_SMBUS_OWN_ADDRESS2(hsmbus->Init.OwnAddress2));
0308 assert_param(IS_SMBUS_OWN_ADDRESS2_MASK(hsmbus->Init.OwnAddress2Masks));
0309 assert_param(IS_SMBUS_GENERAL_CALL(hsmbus->Init.GeneralCallMode));
0310 assert_param(IS_SMBUS_NO_STRETCH(hsmbus->Init.NoStretchMode));
0311 assert_param(IS_SMBUS_PEC(hsmbus->Init.PacketErrorCheckMode));
0312 assert_param(IS_SMBUS_PERIPHERAL_MODE(hsmbus->Init.PeripheralMode));
0313
0314 if (hsmbus->State == HAL_SMBUS_STATE_RESET)
0315 {
0316
0317 hsmbus->Lock = HAL_UNLOCKED;
0318
0319 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
0320 hsmbus->MasterTxCpltCallback = HAL_SMBUS_MasterTxCpltCallback;
0321 hsmbus->MasterRxCpltCallback = HAL_SMBUS_MasterRxCpltCallback;
0322 hsmbus->SlaveTxCpltCallback = HAL_SMBUS_SlaveTxCpltCallback;
0323 hsmbus->SlaveRxCpltCallback = HAL_SMBUS_SlaveRxCpltCallback;
0324 hsmbus->ListenCpltCallback = HAL_SMBUS_ListenCpltCallback;
0325 hsmbus->ErrorCallback = HAL_SMBUS_ErrorCallback;
0326 hsmbus->AddrCallback = HAL_SMBUS_AddrCallback;
0327
0328 if (hsmbus->MspInitCallback == NULL)
0329 {
0330 hsmbus->MspInitCallback = HAL_SMBUS_MspInit;
0331 }
0332
0333
0334 hsmbus->MspInitCallback(hsmbus);
0335 #else
0336
0337 HAL_SMBUS_MspInit(hsmbus);
0338 #endif
0339 }
0340
0341 hsmbus->State = HAL_SMBUS_STATE_BUSY;
0342
0343
0344 __HAL_SMBUS_DISABLE(hsmbus);
0345
0346
0347
0348 hsmbus->Instance->TIMINGR = hsmbus->Init.Timing & TIMING_CLEAR_MASK;
0349
0350
0351
0352 hsmbus->Instance->TIMEOUTR &= ~I2C_TIMEOUTR_TIMOUTEN;
0353 hsmbus->Instance->TIMEOUTR &= ~I2C_TIMEOUTR_TEXTEN;
0354 hsmbus->Instance->TIMEOUTR = hsmbus->Init.SMBusTimeout;
0355
0356
0357
0358 hsmbus->Instance->OAR1 &= ~I2C_OAR1_OA1EN;
0359
0360 if (hsmbus->Init.OwnAddress1 != 0UL)
0361 {
0362 if (hsmbus->Init.AddressingMode == SMBUS_ADDRESSINGMODE_7BIT)
0363 {
0364 hsmbus->Instance->OAR1 = (I2C_OAR1_OA1EN | hsmbus->Init.OwnAddress1);
0365 }
0366 else
0367 {
0368 hsmbus->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hsmbus->Init.OwnAddress1);
0369 }
0370 }
0371
0372
0373
0374 if (hsmbus->Init.AddressingMode == SMBUS_ADDRESSINGMODE_10BIT)
0375 {
0376 hsmbus->Instance->CR2 = (I2C_CR2_ADD10);
0377 }
0378
0379
0380 hsmbus->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);
0381
0382
0383
0384 hsmbus->Instance->OAR2 = (hsmbus->Init.DualAddressMode | hsmbus->Init.OwnAddress2 | \
0385 (hsmbus->Init.OwnAddress2Masks << 8U));
0386
0387
0388
0389 hsmbus->Instance->CR1 = (hsmbus->Init.GeneralCallMode | hsmbus->Init.NoStretchMode | \
0390 hsmbus->Init.PacketErrorCheckMode | hsmbus->Init.PeripheralMode | \
0391 hsmbus->Init.AnalogFilter);
0392
0393
0394
0395 if ((hsmbus->Init.PacketErrorCheckMode == SMBUS_PEC_ENABLE) && \
0396 ((hsmbus->Init.PeripheralMode == SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE) || \
0397 (hsmbus->Init.PeripheralMode == SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE_ARP)))
0398 {
0399 hsmbus->Instance->CR1 |= I2C_CR1_SBC;
0400 }
0401
0402
0403 __HAL_SMBUS_ENABLE(hsmbus);
0404
0405 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
0406 hsmbus->PreviousState = HAL_SMBUS_STATE_READY;
0407 hsmbus->State = HAL_SMBUS_STATE_READY;
0408
0409 return HAL_OK;
0410 }
0411
0412
0413
0414
0415
0416
0417
0418 HAL_StatusTypeDef HAL_SMBUS_DeInit(SMBUS_HandleTypeDef *hsmbus)
0419 {
0420
0421 if (hsmbus == NULL)
0422 {
0423 return HAL_ERROR;
0424 }
0425
0426
0427 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance));
0428
0429 hsmbus->State = HAL_SMBUS_STATE_BUSY;
0430
0431
0432 __HAL_SMBUS_DISABLE(hsmbus);
0433
0434 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
0435 if (hsmbus->MspDeInitCallback == NULL)
0436 {
0437 hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit;
0438 }
0439
0440
0441 hsmbus->MspDeInitCallback(hsmbus);
0442 #else
0443
0444 HAL_SMBUS_MspDeInit(hsmbus);
0445 #endif
0446
0447 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
0448 hsmbus->PreviousState = HAL_SMBUS_STATE_RESET;
0449 hsmbus->State = HAL_SMBUS_STATE_RESET;
0450
0451
0452 __HAL_UNLOCK(hsmbus);
0453
0454 return HAL_OK;
0455 }
0456
0457
0458
0459
0460
0461
0462
0463 __weak void HAL_SMBUS_MspInit(SMBUS_HandleTypeDef *hsmbus)
0464 {
0465
0466 UNUSED(hsmbus);
0467
0468
0469
0470
0471 }
0472
0473
0474
0475
0476
0477
0478
0479 __weak void HAL_SMBUS_MspDeInit(SMBUS_HandleTypeDef *hsmbus)
0480 {
0481
0482 UNUSED(hsmbus);
0483
0484
0485
0486
0487 }
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498 HAL_StatusTypeDef HAL_SMBUS_ConfigAnalogFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t AnalogFilter)
0499 {
0500
0501 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance));
0502 assert_param(IS_SMBUS_ANALOG_FILTER(AnalogFilter));
0503
0504 if (hsmbus->State == HAL_SMBUS_STATE_READY)
0505 {
0506
0507 __HAL_LOCK(hsmbus);
0508
0509 hsmbus->State = HAL_SMBUS_STATE_BUSY;
0510
0511
0512 __HAL_SMBUS_DISABLE(hsmbus);
0513
0514
0515 hsmbus->Instance->CR1 &= ~(I2C_CR1_ANFOFF);
0516
0517
0518 hsmbus->Instance->CR1 |= AnalogFilter;
0519
0520 __HAL_SMBUS_ENABLE(hsmbus);
0521
0522 hsmbus->State = HAL_SMBUS_STATE_READY;
0523
0524
0525 __HAL_UNLOCK(hsmbus);
0526
0527 return HAL_OK;
0528 }
0529 else
0530 {
0531 return HAL_BUSY;
0532 }
0533 }
0534
0535
0536
0537
0538
0539
0540
0541
0542 HAL_StatusTypeDef HAL_SMBUS_ConfigDigitalFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t DigitalFilter)
0543 {
0544 uint32_t tmpreg;
0545
0546
0547 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance));
0548 assert_param(IS_SMBUS_DIGITAL_FILTER(DigitalFilter));
0549
0550 if (hsmbus->State == HAL_SMBUS_STATE_READY)
0551 {
0552
0553 __HAL_LOCK(hsmbus);
0554
0555 hsmbus->State = HAL_SMBUS_STATE_BUSY;
0556
0557
0558 __HAL_SMBUS_DISABLE(hsmbus);
0559
0560
0561 tmpreg = hsmbus->Instance->CR1;
0562
0563
0564 tmpreg &= ~(I2C_CR1_DNF);
0565
0566
0567 tmpreg |= DigitalFilter << I2C_CR1_DNF_Pos;
0568
0569
0570 hsmbus->Instance->CR1 = tmpreg;
0571
0572 __HAL_SMBUS_ENABLE(hsmbus);
0573
0574 hsmbus->State = HAL_SMBUS_STATE_READY;
0575
0576
0577 __HAL_UNLOCK(hsmbus);
0578
0579 return HAL_OK;
0580 }
0581 else
0582 {
0583 return HAL_BUSY;
0584 }
0585 }
0586
0587 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609 HAL_StatusTypeDef HAL_SMBUS_RegisterCallback(SMBUS_HandleTypeDef *hsmbus,
0610 HAL_SMBUS_CallbackIDTypeDef CallbackID,
0611 pSMBUS_CallbackTypeDef pCallback)
0612 {
0613 HAL_StatusTypeDef status = HAL_OK;
0614
0615 if (pCallback == NULL)
0616 {
0617
0618 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0619
0620 return HAL_ERROR;
0621 }
0622
0623 if (HAL_SMBUS_STATE_READY == hsmbus->State)
0624 {
0625 switch (CallbackID)
0626 {
0627 case HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID :
0628 hsmbus->MasterTxCpltCallback = pCallback;
0629 break;
0630
0631 case HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID :
0632 hsmbus->MasterRxCpltCallback = pCallback;
0633 break;
0634
0635 case HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID :
0636 hsmbus->SlaveTxCpltCallback = pCallback;
0637 break;
0638
0639 case HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID :
0640 hsmbus->SlaveRxCpltCallback = pCallback;
0641 break;
0642
0643 case HAL_SMBUS_LISTEN_COMPLETE_CB_ID :
0644 hsmbus->ListenCpltCallback = pCallback;
0645 break;
0646
0647 case HAL_SMBUS_ERROR_CB_ID :
0648 hsmbus->ErrorCallback = pCallback;
0649 break;
0650
0651 case HAL_SMBUS_MSPINIT_CB_ID :
0652 hsmbus->MspInitCallback = pCallback;
0653 break;
0654
0655 case HAL_SMBUS_MSPDEINIT_CB_ID :
0656 hsmbus->MspDeInitCallback = pCallback;
0657 break;
0658
0659 default :
0660
0661 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0662
0663
0664 status = HAL_ERROR;
0665 break;
0666 }
0667 }
0668 else if (HAL_SMBUS_STATE_RESET == hsmbus->State)
0669 {
0670 switch (CallbackID)
0671 {
0672 case HAL_SMBUS_MSPINIT_CB_ID :
0673 hsmbus->MspInitCallback = pCallback;
0674 break;
0675
0676 case HAL_SMBUS_MSPDEINIT_CB_ID :
0677 hsmbus->MspDeInitCallback = pCallback;
0678 break;
0679
0680 default :
0681
0682 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0683
0684
0685 status = HAL_ERROR;
0686 break;
0687 }
0688 }
0689 else
0690 {
0691
0692 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0693
0694
0695 status = HAL_ERROR;
0696 }
0697
0698 return status;
0699 }
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722 HAL_StatusTypeDef HAL_SMBUS_UnRegisterCallback(SMBUS_HandleTypeDef *hsmbus,
0723 HAL_SMBUS_CallbackIDTypeDef CallbackID)
0724 {
0725 HAL_StatusTypeDef status = HAL_OK;
0726
0727 if (HAL_SMBUS_STATE_READY == hsmbus->State)
0728 {
0729 switch (CallbackID)
0730 {
0731 case HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID :
0732 hsmbus->MasterTxCpltCallback = HAL_SMBUS_MasterTxCpltCallback;
0733 break;
0734
0735 case HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID :
0736 hsmbus->MasterRxCpltCallback = HAL_SMBUS_MasterRxCpltCallback;
0737 break;
0738
0739 case HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID :
0740 hsmbus->SlaveTxCpltCallback = HAL_SMBUS_SlaveTxCpltCallback;
0741 break;
0742
0743 case HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID :
0744 hsmbus->SlaveRxCpltCallback = HAL_SMBUS_SlaveRxCpltCallback;
0745 break;
0746
0747 case HAL_SMBUS_LISTEN_COMPLETE_CB_ID :
0748 hsmbus->ListenCpltCallback = HAL_SMBUS_ListenCpltCallback;
0749 break;
0750
0751 case HAL_SMBUS_ERROR_CB_ID :
0752 hsmbus->ErrorCallback = HAL_SMBUS_ErrorCallback;
0753 break;
0754
0755 case HAL_SMBUS_MSPINIT_CB_ID :
0756 hsmbus->MspInitCallback = HAL_SMBUS_MspInit;
0757 break;
0758
0759 case HAL_SMBUS_MSPDEINIT_CB_ID :
0760 hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit;
0761 break;
0762
0763 default :
0764
0765 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0766
0767
0768 status = HAL_ERROR;
0769 break;
0770 }
0771 }
0772 else if (HAL_SMBUS_STATE_RESET == hsmbus->State)
0773 {
0774 switch (CallbackID)
0775 {
0776 case HAL_SMBUS_MSPINIT_CB_ID :
0777 hsmbus->MspInitCallback = HAL_SMBUS_MspInit;
0778 break;
0779
0780 case HAL_SMBUS_MSPDEINIT_CB_ID :
0781 hsmbus->MspDeInitCallback = HAL_SMBUS_MspDeInit;
0782 break;
0783
0784 default :
0785
0786 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0787
0788
0789 status = HAL_ERROR;
0790 break;
0791 }
0792 }
0793 else
0794 {
0795
0796 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0797
0798
0799 status = HAL_ERROR;
0800 }
0801
0802 return status;
0803 }
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813 HAL_StatusTypeDef HAL_SMBUS_RegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus,
0814 pSMBUS_AddrCallbackTypeDef pCallback)
0815 {
0816 HAL_StatusTypeDef status = HAL_OK;
0817
0818 if (pCallback == NULL)
0819 {
0820
0821 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0822
0823 return HAL_ERROR;
0824 }
0825
0826 if (HAL_SMBUS_STATE_READY == hsmbus->State)
0827 {
0828 hsmbus->AddrCallback = pCallback;
0829 }
0830 else
0831 {
0832
0833 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0834
0835
0836 status = HAL_ERROR;
0837 }
0838
0839 return status;
0840 }
0841
0842
0843
0844
0845
0846
0847
0848
0849 HAL_StatusTypeDef HAL_SMBUS_UnRegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus)
0850 {
0851 HAL_StatusTypeDef status = HAL_OK;
0852
0853 if (HAL_SMBUS_STATE_READY == hsmbus->State)
0854 {
0855 hsmbus->AddrCallback = HAL_SMBUS_AddrCallback;
0856 }
0857 else
0858 {
0859
0860 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
0861
0862
0863 status = HAL_ERROR;
0864 }
0865
0866 return status;
0867 }
0868
0869 #endif
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930 HAL_StatusTypeDef HAL_SMBUS_Master_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress,
0931 uint8_t *pData, uint16_t Size, uint32_t XferOptions)
0932 {
0933 uint32_t tmp;
0934 uint32_t sizetoxfer;
0935
0936
0937 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
0938
0939 if (hsmbus->State == HAL_SMBUS_STATE_READY)
0940 {
0941
0942 __HAL_LOCK(hsmbus);
0943
0944 hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_TX;
0945 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
0946
0947 hsmbus->pBuffPtr = pData;
0948 hsmbus->XferCount = Size;
0949 hsmbus->XferOptions = XferOptions;
0950
0951
0952
0953 if (hsmbus->pBuffPtr == NULL)
0954 {
0955 hsmbus->XferOptions &= ~SMBUS_AUTOEND_MODE;
0956 }
0957
0958 if (Size > MAX_NBYTE_SIZE)
0959 {
0960 hsmbus->XferSize = MAX_NBYTE_SIZE;
0961 }
0962 else
0963 {
0964 hsmbus->XferSize = Size;
0965 }
0966
0967 sizetoxfer = hsmbus->XferSize;
0968 if ((sizetoxfer > 0U) && ((XferOptions == SMBUS_FIRST_FRAME) ||
0969 (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_NO_PEC) ||
0970 (XferOptions == SMBUS_FIRST_FRAME_WITH_PEC) ||
0971 (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC)))
0972 {
0973 if (hsmbus->pBuffPtr != NULL)
0974 {
0975
0976
0977 hsmbus->Instance->TXDR = *hsmbus->pBuffPtr;
0978
0979
0980 hsmbus->pBuffPtr++;
0981
0982 hsmbus->XferCount--;
0983 hsmbus->XferSize--;
0984 }
0985 else
0986 {
0987 return HAL_ERROR;
0988 }
0989 }
0990
0991
0992
0993 if ((sizetoxfer < hsmbus->XferCount) && (sizetoxfer == MAX_NBYTE_SIZE))
0994 {
0995 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)sizetoxfer,
0996 SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE),
0997 SMBUS_GENERATE_START_WRITE);
0998 }
0999 else
1000 {
1001
1002
1003
1004
1005 tmp = hsmbus->XferOptions;
1006
1007 if ((hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_TX) && \
1008 (IS_SMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0))
1009 {
1010 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)sizetoxfer, hsmbus->XferOptions,
1011 SMBUS_NO_STARTSTOP);
1012 }
1013
1014 else
1015 {
1016
1017 SMBUS_ConvertOtherXferOptions(hsmbus);
1018
1019
1020 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)sizetoxfer,
1021 hsmbus->XferOptions,
1022 SMBUS_GENERATE_START_WRITE);
1023 }
1024
1025
1026
1027 if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL)
1028 {
1029 if (hsmbus->XferSize > 0U)
1030 {
1031 hsmbus->XferSize--;
1032 hsmbus->XferCount--;
1033 }
1034 else
1035 {
1036 return HAL_ERROR;
1037 }
1038 }
1039 }
1040
1041
1042 __HAL_UNLOCK(hsmbus);
1043
1044
1045
1046
1047 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX);
1048
1049 return HAL_OK;
1050 }
1051 else
1052 {
1053 return HAL_BUSY;
1054 }
1055 }
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068 HAL_StatusTypeDef HAL_SMBUS_Master_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t *pData,
1069 uint16_t Size, uint32_t XferOptions)
1070 {
1071 uint32_t tmp;
1072
1073
1074 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1075
1076 if (hsmbus->State == HAL_SMBUS_STATE_READY)
1077 {
1078
1079 __HAL_LOCK(hsmbus);
1080
1081 hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_RX;
1082 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
1083
1084
1085 hsmbus->pBuffPtr = pData;
1086 hsmbus->XferCount = Size;
1087 hsmbus->XferOptions = XferOptions;
1088
1089
1090
1091 if (hsmbus->pBuffPtr == NULL)
1092 {
1093 hsmbus->XferOptions &= ~SMBUS_AUTOEND_MODE;
1094 }
1095
1096 if (Size > MAX_NBYTE_SIZE)
1097 {
1098 hsmbus->XferSize = MAX_NBYTE_SIZE;
1099 }
1100 else
1101 {
1102 hsmbus->XferSize = Size;
1103 }
1104
1105
1106
1107 if ((hsmbus->XferSize < hsmbus->XferCount) && (hsmbus->XferSize == MAX_NBYTE_SIZE))
1108 {
1109 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize,
1110 SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE),
1111 SMBUS_GENERATE_START_READ);
1112 }
1113 else
1114 {
1115
1116
1117
1118
1119 tmp = hsmbus->XferOptions;
1120
1121 if ((hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_RX) && \
1122 (IS_SMBUS_TRANSFER_OTHER_OPTIONS_REQUEST(tmp) == 0))
1123 {
1124 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions,
1125 SMBUS_NO_STARTSTOP);
1126 }
1127
1128 else
1129 {
1130
1131 SMBUS_ConvertOtherXferOptions(hsmbus);
1132
1133
1134 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize,
1135 hsmbus->XferOptions,
1136 SMBUS_GENERATE_START_READ);
1137 }
1138 }
1139
1140
1141 __HAL_UNLOCK(hsmbus);
1142
1143
1144
1145
1146 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX);
1147
1148 return HAL_OK;
1149 }
1150 else
1151 {
1152 return HAL_BUSY;
1153 }
1154 }
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165 HAL_StatusTypeDef HAL_SMBUS_Master_Abort_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress)
1166 {
1167 if (hsmbus->State == HAL_SMBUS_STATE_READY)
1168 {
1169
1170 __HAL_LOCK(hsmbus);
1171
1172
1173
1174 if (hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_TX)
1175 {
1176 hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_TX;
1177 }
1178 else if (hsmbus->PreviousState == HAL_SMBUS_STATE_MASTER_BUSY_RX)
1179 {
1180 hsmbus->State = HAL_SMBUS_STATE_MASTER_BUSY_RX;
1181 }
1182 else
1183 {
1184
1185
1186 return HAL_ERROR;
1187 }
1188 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
1189
1190
1191
1192 SMBUS_TransferConfig(hsmbus, DevAddress, 1, SMBUS_AUTOEND_MODE, SMBUS_NO_STARTSTOP);
1193
1194
1195 __HAL_UNLOCK(hsmbus);
1196
1197
1198
1199
1200 if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX)
1201 {
1202 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX);
1203 }
1204 else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX)
1205 {
1206 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX);
1207 }
1208 else
1209 {
1210
1211 }
1212
1213 return HAL_OK;
1214 }
1215 else
1216 {
1217 return HAL_BUSY;
1218 }
1219 }
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230 HAL_StatusTypeDef HAL_SMBUS_Slave_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size,
1231 uint32_t XferOptions)
1232 {
1233
1234 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1235
1236 if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN)
1237 {
1238 if ((pData == NULL) || (Size == 0UL))
1239 {
1240 hsmbus->ErrorCode = HAL_SMBUS_ERROR_INVALID_PARAM;
1241 return HAL_ERROR;
1242 }
1243
1244
1245 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR | SMBUS_IT_TX);
1246
1247
1248 __HAL_LOCK(hsmbus);
1249
1250 hsmbus->State = (HAL_SMBUS_STATE_SLAVE_BUSY_TX | HAL_SMBUS_STATE_LISTEN);
1251 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
1252
1253
1254 hsmbus->Instance->CR1 |= I2C_CR1_SBC;
1255
1256
1257 hsmbus->Instance->CR2 &= ~I2C_CR2_NACK;
1258
1259
1260 hsmbus->pBuffPtr = pData;
1261 hsmbus->XferCount = Size;
1262 hsmbus->XferOptions = XferOptions;
1263
1264
1265 SMBUS_ConvertOtherXferOptions(hsmbus);
1266
1267 if (Size > MAX_NBYTE_SIZE)
1268 {
1269 hsmbus->XferSize = MAX_NBYTE_SIZE;
1270 }
1271 else
1272 {
1273 hsmbus->XferSize = Size;
1274 }
1275
1276
1277 if ((hsmbus->XferSize < hsmbus->XferCount) && (hsmbus->XferSize == MAX_NBYTE_SIZE))
1278 {
1279 SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize,
1280 SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE),
1281 SMBUS_NO_STARTSTOP);
1282 }
1283 else
1284 {
1285
1286 SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions,
1287 SMBUS_NO_STARTSTOP);
1288
1289
1290
1291 if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL)
1292 {
1293 hsmbus->XferSize--;
1294 hsmbus->XferCount--;
1295 }
1296 }
1297
1298
1299
1300 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR);
1301
1302
1303 __HAL_UNLOCK(hsmbus);
1304
1305
1306
1307
1308
1309 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_TX | SMBUS_IT_ADDR);
1310
1311 return HAL_OK;
1312 }
1313 else
1314 {
1315 return HAL_BUSY;
1316 }
1317 }
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328 HAL_StatusTypeDef HAL_SMBUS_Slave_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size,
1329 uint32_t XferOptions)
1330 {
1331
1332 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1333
1334 if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN)
1335 {
1336 if ((pData == NULL) || (Size == 0UL))
1337 {
1338 hsmbus->ErrorCode = HAL_SMBUS_ERROR_INVALID_PARAM;
1339 return HAL_ERROR;
1340 }
1341
1342
1343 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR | SMBUS_IT_RX);
1344
1345
1346 __HAL_LOCK(hsmbus);
1347
1348 hsmbus->State = (HAL_SMBUS_STATE_SLAVE_BUSY_RX | HAL_SMBUS_STATE_LISTEN);
1349 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
1350
1351
1352 hsmbus->Instance->CR1 |= I2C_CR1_SBC;
1353
1354
1355 hsmbus->Instance->CR2 &= ~I2C_CR2_NACK;
1356
1357
1358 hsmbus->pBuffPtr = pData;
1359 hsmbus->XferSize = Size;
1360 hsmbus->XferCount = Size;
1361 hsmbus->XferOptions = XferOptions;
1362
1363
1364 SMBUS_ConvertOtherXferOptions(hsmbus);
1365
1366
1367
1368
1369
1370
1371 if (((SMBUS_GET_PEC_MODE(hsmbus) != 0UL) && (hsmbus->XferSize == 2U)) || (hsmbus->XferSize == 1U))
1372 {
1373 SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions,
1374 SMBUS_NO_STARTSTOP);
1375 }
1376 else
1377 {
1378 SMBUS_TransferConfig(hsmbus, 0, 1, hsmbus->XferOptions | SMBUS_RELOAD_MODE, SMBUS_NO_STARTSTOP);
1379 }
1380
1381
1382
1383 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR);
1384
1385
1386 __HAL_UNLOCK(hsmbus);
1387
1388
1389
1390
1391
1392 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_ADDR);
1393
1394 return HAL_OK;
1395 }
1396 else
1397 {
1398 return HAL_BUSY;
1399 }
1400 }
1401
1402
1403
1404
1405
1406
1407
1408 HAL_StatusTypeDef HAL_SMBUS_EnableListen_IT(SMBUS_HandleTypeDef *hsmbus)
1409 {
1410 hsmbus->State = HAL_SMBUS_STATE_LISTEN;
1411
1412
1413 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_ADDR);
1414
1415 return HAL_OK;
1416 }
1417
1418
1419
1420
1421
1422
1423
1424 HAL_StatusTypeDef HAL_SMBUS_DisableListen_IT(SMBUS_HandleTypeDef *hsmbus)
1425 {
1426
1427 if (hsmbus->State == HAL_SMBUS_STATE_LISTEN)
1428 {
1429 hsmbus->State = HAL_SMBUS_STATE_READY;
1430
1431
1432 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR);
1433
1434 return HAL_OK;
1435 }
1436 else
1437 {
1438 return HAL_BUSY;
1439 }
1440 }
1441
1442
1443
1444
1445
1446
1447
1448 HAL_StatusTypeDef HAL_SMBUS_EnableAlert_IT(SMBUS_HandleTypeDef *hsmbus)
1449 {
1450
1451 hsmbus->Instance->CR1 |= I2C_CR1_ALERTEN;
1452
1453
1454 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ALERT);
1455
1456
1457 SMBUS_Enable_IRQ(hsmbus, SMBUS_IT_ALERT);
1458
1459 return HAL_OK;
1460 }
1461
1462
1463
1464
1465
1466
1467 HAL_StatusTypeDef HAL_SMBUS_DisableAlert_IT(SMBUS_HandleTypeDef *hsmbus)
1468 {
1469
1470 hsmbus->Instance->CR1 &= ~I2C_CR1_ALERTEN;
1471
1472
1473 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ALERT);
1474
1475 return HAL_OK;
1476 }
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488 HAL_StatusTypeDef HAL_SMBUS_IsDeviceReady(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint32_t Trials,
1489 uint32_t Timeout)
1490 {
1491 uint32_t tickstart;
1492
1493 __IO uint32_t SMBUS_Trials = 0UL;
1494
1495 FlagStatus tmp1;
1496 FlagStatus tmp2;
1497
1498 if (hsmbus->State == HAL_SMBUS_STATE_READY)
1499 {
1500 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_BUSY) != RESET)
1501 {
1502 return HAL_BUSY;
1503 }
1504
1505
1506 __HAL_LOCK(hsmbus);
1507
1508 hsmbus->State = HAL_SMBUS_STATE_BUSY;
1509 hsmbus->ErrorCode = HAL_SMBUS_ERROR_NONE;
1510
1511 do
1512 {
1513
1514 hsmbus->Instance->CR2 = SMBUS_GENERATE_START(hsmbus->Init.AddressingMode, DevAddress);
1515
1516
1517
1518 tickstart = HAL_GetTick();
1519
1520 tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1521 tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF);
1522
1523 while ((tmp1 == RESET) && (tmp2 == RESET))
1524 {
1525 if (Timeout != HAL_MAX_DELAY)
1526 {
1527 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
1528 {
1529
1530 hsmbus->State = HAL_SMBUS_STATE_READY;
1531
1532
1533 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT;
1534
1535
1536 __HAL_UNLOCK(hsmbus);
1537 return HAL_ERROR;
1538 }
1539 }
1540
1541 tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1542 tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF);
1543 }
1544
1545
1546 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF) == RESET)
1547 {
1548
1549 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1550 {
1551 return HAL_ERROR;
1552 }
1553
1554
1555 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1556
1557
1558 hsmbus->State = HAL_SMBUS_STATE_READY;
1559
1560
1561 __HAL_UNLOCK(hsmbus);
1562
1563 return HAL_OK;
1564 }
1565 else
1566 {
1567
1568 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1569 {
1570 return HAL_ERROR;
1571 }
1572
1573
1574 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
1575
1576
1577 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1578 }
1579
1580
1581 if (SMBUS_Trials == Trials)
1582 {
1583
1584 hsmbus->Instance->CR2 |= I2C_CR2_STOP;
1585
1586
1587 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_STOPF, RESET, Timeout) != HAL_OK)
1588 {
1589 return HAL_ERROR;
1590 }
1591
1592
1593 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1594 }
1595
1596
1597 SMBUS_Trials++;
1598 } while (SMBUS_Trials < Trials);
1599
1600 hsmbus->State = HAL_SMBUS_STATE_READY;
1601
1602
1603 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT;
1604
1605
1606 __HAL_UNLOCK(hsmbus);
1607
1608 return HAL_ERROR;
1609 }
1610 else
1611 {
1612 return HAL_BUSY;
1613 }
1614 }
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630 void HAL_SMBUS_EV_IRQHandler(SMBUS_HandleTypeDef *hsmbus)
1631 {
1632
1633
1634 uint32_t tmpisrvalue = READ_REG(hsmbus->Instance->ISR);
1635 uint32_t tmpcr1value = READ_REG(hsmbus->Instance->CR1);
1636
1637
1638 if ((SMBUS_CHECK_IT_SOURCE(tmpcr1value, (SMBUS_IT_TCI | SMBUS_IT_STOPI |
1639 SMBUS_IT_NACKI | SMBUS_IT_TXI)) != RESET) &&
1640 ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TXIS) != RESET) ||
1641 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TCR) != RESET) ||
1642 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TC) != RESET) ||
1643 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) ||
1644 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET)))
1645 {
1646
1647 if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX)
1648 {
1649 (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue);
1650 }
1651
1652 else if ((hsmbus->State & HAL_SMBUS_STATE_MASTER_BUSY_TX) == HAL_SMBUS_STATE_MASTER_BUSY_TX)
1653 {
1654 (void)SMBUS_Master_ISR(hsmbus, tmpisrvalue);
1655 }
1656 else
1657 {
1658
1659 }
1660 }
1661
1662
1663 if ((SMBUS_CHECK_IT_SOURCE(tmpcr1value, (SMBUS_IT_TCI | SMBUS_IT_STOPI |
1664 SMBUS_IT_NACKI | SMBUS_IT_RXI)) != RESET) &&
1665 ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_RXNE) != RESET) ||
1666 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TCR) != RESET) ||
1667 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_TC) != RESET) ||
1668 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) ||
1669 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET)))
1670 {
1671
1672 if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX)
1673 {
1674 (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue);
1675 }
1676
1677 else if ((hsmbus->State & HAL_SMBUS_STATE_MASTER_BUSY_RX) == HAL_SMBUS_STATE_MASTER_BUSY_RX)
1678 {
1679 (void)SMBUS_Master_ISR(hsmbus, tmpisrvalue);
1680 }
1681 else
1682 {
1683
1684 }
1685 }
1686
1687
1688 if (((SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_ADDRI) != RESET) ||
1689 (SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_STOPI) != RESET) ||
1690 (SMBUS_CHECK_IT_SOURCE(tmpcr1value, SMBUS_IT_NACKI) != RESET)) &&
1691 ((SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_ADDR) != RESET) ||
1692 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_STOPF) != RESET) ||
1693 (SMBUS_CHECK_FLAG(tmpisrvalue, SMBUS_FLAG_AF) != RESET)))
1694 {
1695 if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN)
1696 {
1697 (void)SMBUS_Slave_ISR(hsmbus, tmpisrvalue);
1698 }
1699 }
1700 }
1701
1702
1703
1704
1705
1706
1707
1708 void HAL_SMBUS_ER_IRQHandler(SMBUS_HandleTypeDef *hsmbus)
1709 {
1710 SMBUS_ITErrorHandler(hsmbus);
1711 }
1712
1713
1714
1715
1716
1717
1718
1719 __weak void HAL_SMBUS_MasterTxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
1720 {
1721
1722 UNUSED(hsmbus);
1723
1724
1725
1726
1727 }
1728
1729
1730
1731
1732
1733
1734
1735 __weak void HAL_SMBUS_MasterRxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
1736 {
1737
1738 UNUSED(hsmbus);
1739
1740
1741
1742
1743 }
1744
1745
1746
1747
1748
1749
1750 __weak void HAL_SMBUS_SlaveTxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
1751 {
1752
1753 UNUSED(hsmbus);
1754
1755
1756
1757
1758 }
1759
1760
1761
1762
1763
1764
1765
1766 __weak void HAL_SMBUS_SlaveRxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
1767 {
1768
1769 UNUSED(hsmbus);
1770
1771
1772
1773
1774 }
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784 __weak void HAL_SMBUS_AddrCallback(SMBUS_HandleTypeDef *hsmbus, uint8_t TransferDirection,
1785 uint16_t AddrMatchCode)
1786 {
1787
1788 UNUSED(hsmbus);
1789 UNUSED(TransferDirection);
1790 UNUSED(AddrMatchCode);
1791
1792
1793
1794
1795 }
1796
1797
1798
1799
1800
1801
1802
1803 __weak void HAL_SMBUS_ListenCpltCallback(SMBUS_HandleTypeDef *hsmbus)
1804 {
1805
1806 UNUSED(hsmbus);
1807
1808
1809
1810
1811 }
1812
1813
1814
1815
1816
1817
1818
1819 __weak void HAL_SMBUS_ErrorCallback(SMBUS_HandleTypeDef *hsmbus)
1820 {
1821
1822 UNUSED(hsmbus);
1823
1824
1825
1826
1827 }
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855 uint32_t HAL_SMBUS_GetState(const SMBUS_HandleTypeDef *hsmbus)
1856 {
1857
1858 return hsmbus->State;
1859 }
1860
1861
1862
1863
1864
1865
1866
1867 uint32_t HAL_SMBUS_GetError(const SMBUS_HandleTypeDef *hsmbus)
1868 {
1869 return hsmbus->ErrorCode;
1870 }
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892 static HAL_StatusTypeDef SMBUS_Master_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags)
1893 {
1894 uint16_t DevAddress;
1895
1896
1897 __HAL_LOCK(hsmbus);
1898
1899 if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_AF) != RESET)
1900 {
1901
1902 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
1903
1904
1905
1906 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ACKF;
1907
1908
1909 SMBUS_Flush_TXDR(hsmbus);
1910
1911
1912 __HAL_UNLOCK(hsmbus);
1913
1914
1915 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
1916 hsmbus->ErrorCallback(hsmbus);
1917 #else
1918 HAL_SMBUS_ErrorCallback(hsmbus);
1919 #endif
1920 }
1921 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_STOPF) != RESET)
1922 {
1923
1924 SMBUS_ITErrorHandler(hsmbus);
1925
1926
1927 if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX)
1928 {
1929
1930 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX);
1931
1932
1933 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1934
1935
1936 SMBUS_RESET_CR2(hsmbus);
1937
1938
1939
1940 __HAL_SMBUS_DISABLE(hsmbus);
1941
1942 hsmbus->PreviousState = HAL_SMBUS_STATE_READY;
1943 hsmbus->State = HAL_SMBUS_STATE_READY;
1944
1945
1946 __HAL_UNLOCK(hsmbus);
1947
1948
1949 __HAL_SMBUS_ENABLE(hsmbus);
1950
1951
1952 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
1953 hsmbus->MasterTxCpltCallback(hsmbus);
1954 #else
1955 HAL_SMBUS_MasterTxCpltCallback(hsmbus);
1956 #endif
1957 }
1958 else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX)
1959 {
1960
1961 if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET)
1962 {
1963
1964 *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR);
1965
1966
1967 hsmbus->pBuffPtr++;
1968
1969 if ((hsmbus->XferSize > 0U))
1970 {
1971 hsmbus->XferSize--;
1972 hsmbus->XferCount--;
1973 }
1974 }
1975
1976
1977 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX);
1978
1979
1980 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
1981
1982
1983 SMBUS_RESET_CR2(hsmbus);
1984
1985 hsmbus->PreviousState = HAL_SMBUS_STATE_READY;
1986 hsmbus->State = HAL_SMBUS_STATE_READY;
1987
1988
1989 __HAL_UNLOCK(hsmbus);
1990
1991
1992 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
1993 hsmbus->MasterRxCpltCallback(hsmbus);
1994 #else
1995 HAL_SMBUS_MasterRxCpltCallback(hsmbus);
1996 #endif
1997 }
1998 else
1999 {
2000
2001 }
2002 }
2003 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET)
2004 {
2005
2006 *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR);
2007
2008
2009 hsmbus->pBuffPtr++;
2010
2011
2012 hsmbus->XferSize--;
2013 hsmbus->XferCount--;
2014 }
2015 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TXIS) != RESET)
2016 {
2017
2018 hsmbus->Instance->TXDR = *hsmbus->pBuffPtr;
2019
2020
2021 hsmbus->pBuffPtr++;
2022
2023
2024 hsmbus->XferSize--;
2025 hsmbus->XferCount--;
2026 }
2027 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TCR) != RESET)
2028 {
2029 if ((hsmbus->XferCount != 0U) && (hsmbus->XferSize == 0U))
2030 {
2031 DevAddress = (uint16_t)(hsmbus->Instance->CR2 & I2C_CR2_SADD);
2032
2033 if (hsmbus->XferCount > MAX_NBYTE_SIZE)
2034 {
2035 SMBUS_TransferConfig(hsmbus, DevAddress, MAX_NBYTE_SIZE,
2036 (SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE)),
2037 SMBUS_NO_STARTSTOP);
2038 hsmbus->XferSize = MAX_NBYTE_SIZE;
2039 }
2040 else
2041 {
2042 hsmbus->XferSize = hsmbus->XferCount;
2043 SMBUS_TransferConfig(hsmbus, DevAddress, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions,
2044 SMBUS_NO_STARTSTOP);
2045
2046
2047 if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL)
2048 {
2049 hsmbus->XferSize--;
2050 hsmbus->XferCount--;
2051 }
2052 }
2053 }
2054 else if ((hsmbus->XferCount == 0U) && (hsmbus->XferSize == 0U))
2055 {
2056
2057 if (SMBUS_GET_STOP_MODE(hsmbus) != SMBUS_AUTOEND_MODE)
2058 {
2059
2060 if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX)
2061 {
2062
2063 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX);
2064 hsmbus->PreviousState = hsmbus->State;
2065 hsmbus->State = HAL_SMBUS_STATE_READY;
2066
2067
2068 __HAL_UNLOCK(hsmbus);
2069
2070
2071 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2072 hsmbus->MasterTxCpltCallback(hsmbus);
2073 #else
2074 HAL_SMBUS_MasterTxCpltCallback(hsmbus);
2075 #endif
2076 }
2077 else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX)
2078 {
2079 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX);
2080 hsmbus->PreviousState = hsmbus->State;
2081 hsmbus->State = HAL_SMBUS_STATE_READY;
2082
2083
2084 __HAL_UNLOCK(hsmbus);
2085
2086
2087 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2088 hsmbus->MasterRxCpltCallback(hsmbus);
2089 #else
2090 HAL_SMBUS_MasterRxCpltCallback(hsmbus);
2091 #endif
2092 }
2093 else
2094 {
2095
2096 }
2097 }
2098 }
2099 else
2100 {
2101
2102 }
2103 }
2104 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TC) != RESET)
2105 {
2106 if (hsmbus->XferCount == 0U)
2107 {
2108
2109 if (hsmbus->pBuffPtr == NULL)
2110 {
2111
2112 hsmbus->Instance->CR2 |= I2C_CR2_STOP;
2113 }
2114
2115 else if (SMBUS_GET_STOP_MODE(hsmbus) != SMBUS_AUTOEND_MODE)
2116 {
2117
2118
2119
2120
2121 if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_TX)
2122 {
2123
2124 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX);
2125 hsmbus->PreviousState = hsmbus->State;
2126 hsmbus->State = HAL_SMBUS_STATE_READY;
2127
2128
2129 __HAL_UNLOCK(hsmbus);
2130
2131
2132 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2133 hsmbus->MasterTxCpltCallback(hsmbus);
2134 #else
2135 HAL_SMBUS_MasterTxCpltCallback(hsmbus);
2136 #endif
2137 }
2138 else if (hsmbus->State == HAL_SMBUS_STATE_MASTER_BUSY_RX)
2139 {
2140 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX);
2141 hsmbus->PreviousState = hsmbus->State;
2142 hsmbus->State = HAL_SMBUS_STATE_READY;
2143
2144
2145 __HAL_UNLOCK(hsmbus);
2146
2147
2148 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2149 hsmbus->MasterRxCpltCallback(hsmbus);
2150 #else
2151 HAL_SMBUS_MasterRxCpltCallback(hsmbus);
2152 #endif
2153 }
2154 else
2155 {
2156
2157 }
2158 }
2159 else
2160 {
2161
2162 }
2163 }
2164 }
2165 else
2166 {
2167
2168 }
2169
2170
2171 __HAL_UNLOCK(hsmbus);
2172
2173 return HAL_OK;
2174 }
2175
2176
2177
2178
2179
2180
2181
2182 static HAL_StatusTypeDef SMBUS_Slave_ISR(SMBUS_HandleTypeDef *hsmbus, uint32_t StatusFlags)
2183 {
2184 uint8_t TransferDirection;
2185 uint16_t SlaveAddrCode;
2186
2187
2188 __HAL_LOCK(hsmbus);
2189
2190 if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_AF) != RESET)
2191 {
2192
2193
2194
2195
2196 if (hsmbus->XferCount == 0U)
2197 {
2198
2199 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
2200
2201
2202 SMBUS_Flush_TXDR(hsmbus);
2203
2204
2205 __HAL_UNLOCK(hsmbus);
2206 }
2207 else
2208 {
2209
2210
2211 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
2212
2213
2214
2215 hsmbus->PreviousState = hsmbus->State;
2216 hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_TX);
2217 hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_RX);
2218
2219
2220 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_TX);
2221
2222
2223 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ACKF;
2224
2225
2226 SMBUS_Flush_TXDR(hsmbus);
2227
2228
2229 __HAL_UNLOCK(hsmbus);
2230
2231
2232 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2233 hsmbus->ErrorCallback(hsmbus);
2234 #else
2235 HAL_SMBUS_ErrorCallback(hsmbus);
2236 #endif
2237 }
2238 }
2239 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_ADDR) != RESET)
2240 {
2241 TransferDirection = (uint8_t)(SMBUS_GET_DIR(hsmbus));
2242 SlaveAddrCode = (uint16_t)(SMBUS_GET_ADDR_MATCH(hsmbus));
2243
2244
2245
2246 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_ADDRI);
2247
2248
2249 __HAL_UNLOCK(hsmbus);
2250
2251
2252 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2253 hsmbus->AddrCallback(hsmbus, TransferDirection, SlaveAddrCode);
2254 #else
2255 HAL_SMBUS_AddrCallback(hsmbus, TransferDirection, SlaveAddrCode);
2256 #endif
2257 }
2258 else if ((SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_RXNE) != RESET) ||
2259 (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TCR) != RESET))
2260 {
2261 if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX)
2262 {
2263
2264 *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR);
2265
2266
2267 hsmbus->pBuffPtr++;
2268
2269 hsmbus->XferSize--;
2270 hsmbus->XferCount--;
2271
2272 if (hsmbus->XferCount == 1U)
2273 {
2274
2275
2276
2277 hsmbus->XferOptions &= ~SMBUS_RELOAD_MODE;
2278 SMBUS_TransferConfig(hsmbus, 0, 1, hsmbus->XferOptions, SMBUS_NO_STARTSTOP);
2279 }
2280 else if (hsmbus->XferCount == 0U)
2281 {
2282
2283 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX);
2284
2285
2286 hsmbus->PreviousState = hsmbus->State;
2287 hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_RX);
2288
2289
2290 __HAL_UNLOCK(hsmbus);
2291
2292
2293 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2294 hsmbus->SlaveRxCpltCallback(hsmbus);
2295 #else
2296 HAL_SMBUS_SlaveRxCpltCallback(hsmbus);
2297 #endif
2298 }
2299 else
2300 {
2301
2302 SMBUS_TransferConfig(hsmbus, 0, 1,
2303 SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE),
2304 SMBUS_NO_STARTSTOP);
2305
2306
2307 hsmbus->Instance->CR2 &= ~I2C_CR2_NACK;
2308 }
2309 }
2310 else if ((hsmbus->State & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX)
2311 {
2312 if ((hsmbus->XferCount != 0U) && (hsmbus->XferSize == 0U))
2313 {
2314 if (hsmbus->XferCount > MAX_NBYTE_SIZE)
2315 {
2316 SMBUS_TransferConfig(hsmbus, 0, MAX_NBYTE_SIZE,
2317 (SMBUS_RELOAD_MODE | (hsmbus->XferOptions & SMBUS_SENDPEC_MODE)),
2318 SMBUS_NO_STARTSTOP);
2319 hsmbus->XferSize = MAX_NBYTE_SIZE;
2320 }
2321 else
2322 {
2323 hsmbus->XferSize = hsmbus->XferCount;
2324 SMBUS_TransferConfig(hsmbus, 0, (uint8_t)hsmbus->XferSize, hsmbus->XferOptions,
2325 SMBUS_NO_STARTSTOP);
2326
2327
2328 if (SMBUS_GET_PEC_MODE(hsmbus) != 0UL)
2329 {
2330 hsmbus->XferSize--;
2331 hsmbus->XferCount--;
2332 }
2333 }
2334 }
2335 }
2336 else
2337 {
2338
2339 }
2340 }
2341 else if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_TXIS) != RESET)
2342 {
2343
2344
2345
2346
2347 if (hsmbus->XferCount > 0U)
2348 {
2349
2350 hsmbus->Instance->TXDR = *hsmbus->pBuffPtr;
2351
2352
2353 hsmbus->pBuffPtr++;
2354
2355 hsmbus->XferCount--;
2356 hsmbus->XferSize--;
2357 }
2358
2359 if (hsmbus->XferCount == 0U)
2360 {
2361
2362
2363 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_TX);
2364 hsmbus->PreviousState = hsmbus->State;
2365 hsmbus->State &= ~((uint32_t)HAL_SMBUS_STATE_SLAVE_BUSY_TX);
2366
2367
2368 __HAL_UNLOCK(hsmbus);
2369
2370
2371 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2372 hsmbus->SlaveTxCpltCallback(hsmbus);
2373 #else
2374 HAL_SMBUS_SlaveTxCpltCallback(hsmbus);
2375 #endif
2376 }
2377 }
2378 else
2379 {
2380
2381 }
2382
2383
2384 if (SMBUS_CHECK_FLAG(StatusFlags, SMBUS_FLAG_STOPF) != RESET)
2385 {
2386 if ((hsmbus->State & HAL_SMBUS_STATE_LISTEN) == HAL_SMBUS_STATE_LISTEN)
2387 {
2388
2389 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_RXNE) != RESET)
2390 {
2391
2392 *hsmbus->pBuffPtr = (uint8_t)(hsmbus->Instance->RXDR);
2393
2394
2395 hsmbus->pBuffPtr++;
2396
2397 if ((hsmbus->XferSize > 0U))
2398 {
2399 hsmbus->XferSize--;
2400 hsmbus->XferCount--;
2401 }
2402 }
2403
2404
2405 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_RX | SMBUS_IT_TX);
2406
2407
2408 SMBUS_Disable_IRQ(hsmbus, SMBUS_IT_ADDR);
2409
2410
2411 hsmbus->Instance->CR2 |= I2C_CR2_NACK;
2412
2413
2414 SMBUS_RESET_CR2(hsmbus);
2415
2416
2417 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_STOPF);
2418
2419
2420 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ADDR);
2421
2422 hsmbus->XferOptions = 0;
2423 hsmbus->PreviousState = hsmbus->State;
2424 hsmbus->State = HAL_SMBUS_STATE_READY;
2425
2426
2427 __HAL_UNLOCK(hsmbus);
2428
2429
2430 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2431 hsmbus->ListenCpltCallback(hsmbus);
2432 #else
2433 HAL_SMBUS_ListenCpltCallback(hsmbus);
2434 #endif
2435 }
2436 }
2437
2438
2439 __HAL_UNLOCK(hsmbus);
2440
2441 return HAL_OK;
2442 }
2443
2444
2445
2446
2447
2448
2449
2450 static void SMBUS_Enable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest)
2451 {
2452 uint32_t tmpisr = 0UL;
2453
2454 if ((InterruptRequest & SMBUS_IT_ALERT) == SMBUS_IT_ALERT)
2455 {
2456
2457 tmpisr |= SMBUS_IT_ERRI;
2458 }
2459
2460 if ((InterruptRequest & SMBUS_IT_ADDR) == SMBUS_IT_ADDR)
2461 {
2462
2463 tmpisr |= SMBUS_IT_ADDRI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_ERRI;
2464 }
2465
2466 if ((InterruptRequest & SMBUS_IT_TX) == SMBUS_IT_TX)
2467 {
2468
2469 tmpisr |= SMBUS_IT_ERRI | SMBUS_IT_TCI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_TXI;
2470 }
2471
2472 if ((InterruptRequest & SMBUS_IT_RX) == SMBUS_IT_RX)
2473 {
2474
2475 tmpisr |= SMBUS_IT_ERRI | SMBUS_IT_TCI | SMBUS_IT_STOPI | SMBUS_IT_NACKI | SMBUS_IT_RXI;
2476 }
2477
2478
2479
2480
2481 __HAL_SMBUS_ENABLE_IT(hsmbus, tmpisr);
2482 }
2483
2484
2485
2486
2487
2488
2489
2490 static void SMBUS_Disable_IRQ(SMBUS_HandleTypeDef *hsmbus, uint32_t InterruptRequest)
2491 {
2492 uint32_t tmpisr = 0UL;
2493 uint32_t tmpstate = hsmbus->State;
2494
2495 if ((tmpstate == HAL_SMBUS_STATE_READY) && ((InterruptRequest & SMBUS_IT_ALERT) == SMBUS_IT_ALERT))
2496 {
2497
2498 tmpisr |= SMBUS_IT_ERRI;
2499 }
2500
2501 if ((InterruptRequest & SMBUS_IT_TX) == SMBUS_IT_TX)
2502 {
2503
2504 tmpisr |= SMBUS_IT_TCI | SMBUS_IT_TXI;
2505
2506 if ((SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL)
2507 && ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN))
2508 {
2509
2510 tmpisr |= SMBUS_IT_ERRI;
2511 }
2512
2513 if ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN)
2514 {
2515
2516 tmpisr |= SMBUS_IT_STOPI | SMBUS_IT_NACKI;
2517 }
2518 }
2519
2520 if ((InterruptRequest & SMBUS_IT_RX) == SMBUS_IT_RX)
2521 {
2522
2523 tmpisr |= SMBUS_IT_TCI | SMBUS_IT_RXI;
2524
2525 if ((SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL)
2526 && ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN))
2527 {
2528
2529 tmpisr |= SMBUS_IT_ERRI;
2530 }
2531
2532 if ((tmpstate & HAL_SMBUS_STATE_LISTEN) != HAL_SMBUS_STATE_LISTEN)
2533 {
2534
2535 tmpisr |= SMBUS_IT_STOPI | SMBUS_IT_NACKI;
2536 }
2537 }
2538
2539 if ((InterruptRequest & SMBUS_IT_ADDR) == SMBUS_IT_ADDR)
2540 {
2541
2542 tmpisr |= SMBUS_IT_ADDRI | SMBUS_IT_STOPI | SMBUS_IT_NACKI;
2543
2544 if (SMBUS_GET_ALERT_ENABLED(hsmbus) == 0UL)
2545 {
2546
2547 tmpisr |= SMBUS_IT_ERRI;
2548 }
2549 }
2550
2551
2552
2553
2554 __HAL_SMBUS_DISABLE_IT(hsmbus, tmpisr);
2555 }
2556
2557
2558
2559
2560
2561
2562 static void SMBUS_ITErrorHandler(SMBUS_HandleTypeDef *hsmbus)
2563 {
2564 uint32_t itflags = READ_REG(hsmbus->Instance->ISR);
2565 uint32_t itsources = READ_REG(hsmbus->Instance->CR1);
2566 uint32_t tmpstate;
2567 uint32_t tmperror;
2568
2569
2570 if (((itflags & SMBUS_FLAG_BERR) == SMBUS_FLAG_BERR) && \
2571 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2572 {
2573 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_BERR;
2574
2575
2576 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_BERR);
2577 }
2578
2579
2580 if (((itflags & SMBUS_FLAG_OVR) == SMBUS_FLAG_OVR) && \
2581 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2582 {
2583 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_OVR;
2584
2585
2586 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_OVR);
2587 }
2588
2589
2590 if (((itflags & SMBUS_FLAG_ARLO) == SMBUS_FLAG_ARLO) && \
2591 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2592 {
2593 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ARLO;
2594
2595
2596 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ARLO);
2597 }
2598
2599
2600 if (((itflags & SMBUS_FLAG_TIMEOUT) == SMBUS_FLAG_TIMEOUT) && \
2601 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2602 {
2603 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_BUSTIMEOUT;
2604
2605
2606 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_TIMEOUT);
2607 }
2608
2609
2610 if (((itflags & SMBUS_FLAG_ALERT) == SMBUS_FLAG_ALERT) && \
2611 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2612 {
2613 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_ALERT;
2614
2615
2616 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ALERT);
2617 }
2618
2619
2620 if (((itflags & SMBUS_FLAG_PECERR) == SMBUS_FLAG_PECERR) && \
2621 ((itsources & SMBUS_IT_ERRI) == SMBUS_IT_ERRI))
2622 {
2623 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_PECERR;
2624
2625
2626 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_PECERR);
2627 }
2628
2629 if (hsmbus->ErrorCode != HAL_SMBUS_ERROR_NONE)
2630 {
2631
2632 SMBUS_Flush_TXDR(hsmbus);
2633 }
2634
2635
2636 tmperror = hsmbus->ErrorCode;
2637
2638
2639 if ((tmperror != HAL_SMBUS_ERROR_NONE) && (tmperror != HAL_SMBUS_ERROR_ACKF))
2640 {
2641
2642 if ((tmperror & HAL_SMBUS_ERROR_ALERT) != HAL_SMBUS_ERROR_ALERT)
2643 {
2644
2645 tmpstate = hsmbus->State;
2646
2647 if (((tmpstate & HAL_SMBUS_STATE_SLAVE_BUSY_TX) == HAL_SMBUS_STATE_SLAVE_BUSY_TX)
2648 || ((tmpstate & HAL_SMBUS_STATE_SLAVE_BUSY_RX) == HAL_SMBUS_STATE_SLAVE_BUSY_RX))
2649 {
2650
2651
2652 hsmbus->PreviousState = HAL_SMBUS_STATE_READY;
2653 hsmbus->State = HAL_SMBUS_STATE_LISTEN;
2654 }
2655 }
2656
2657
2658 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2659 hsmbus->ErrorCallback(hsmbus);
2660 #else
2661 HAL_SMBUS_ErrorCallback(hsmbus);
2662 #endif
2663 }
2664 }
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675 static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(SMBUS_HandleTypeDef *hsmbus, uint32_t Flag,
2676 FlagStatus Status, uint32_t Timeout)
2677 {
2678 uint32_t tickstart = HAL_GetTick();
2679
2680
2681 while ((FlagStatus)(__HAL_SMBUS_GET_FLAG(hsmbus, Flag)) == Status)
2682 {
2683
2684 if (Timeout != HAL_MAX_DELAY)
2685 {
2686 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
2687 {
2688 hsmbus->PreviousState = hsmbus->State;
2689 hsmbus->State = HAL_SMBUS_STATE_READY;
2690
2691
2692 hsmbus->ErrorCode |= HAL_SMBUS_ERROR_HALTIMEOUT;
2693
2694
2695 __HAL_UNLOCK(hsmbus);
2696
2697 return HAL_ERROR;
2698 }
2699 }
2700 }
2701
2702 return HAL_OK;
2703 }
2704
2705
2706
2707
2708
2709
2710 static void SMBUS_Flush_TXDR(SMBUS_HandleTypeDef *hsmbus)
2711 {
2712
2713
2714 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_TXIS) != RESET)
2715 {
2716 hsmbus->Instance->TXDR = 0x00U;
2717 }
2718
2719
2720 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_TXE) == RESET)
2721 {
2722 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_TXE);
2723 }
2724 }
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746 static void SMBUS_TransferConfig(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t Size,
2747 uint32_t Mode, uint32_t Request)
2748 {
2749
2750 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->Instance));
2751 assert_param(IS_SMBUS_TRANSFER_MODE(Mode));
2752 assert_param(IS_SMBUS_TRANSFER_REQUEST(Request));
2753
2754
2755 MODIFY_REG(hsmbus->Instance->CR2,
2756 ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | \
2757 (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31UL - I2C_CR2_RD_WRN_Pos))) | \
2758 I2C_CR2_START | I2C_CR2_STOP | I2C_CR2_PECBYTE)), \
2759 (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \
2760 (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \
2761 (uint32_t)Mode | (uint32_t)Request));
2762 }
2763
2764
2765
2766
2767
2768
2769 static void SMBUS_ConvertOtherXferOptions(SMBUS_HandleTypeDef *hsmbus)
2770 {
2771
2772
2773
2774 if (hsmbus->XferOptions == SMBUS_OTHER_FRAME_NO_PEC)
2775 {
2776 hsmbus->XferOptions = SMBUS_FIRST_FRAME;
2777 }
2778
2779
2780
2781 else if (hsmbus->XferOptions == SMBUS_OTHER_FRAME_WITH_PEC)
2782 {
2783 hsmbus->XferOptions = SMBUS_FIRST_FRAME | SMBUS_SENDPEC_MODE;
2784 }
2785
2786
2787
2788
2789 else if (hsmbus->XferOptions == SMBUS_OTHER_AND_LAST_FRAME_NO_PEC)
2790 {
2791 hsmbus->XferOptions = SMBUS_FIRST_AND_LAST_FRAME_NO_PEC;
2792 }
2793
2794
2795
2796
2797 else if (hsmbus->XferOptions == SMBUS_OTHER_AND_LAST_FRAME_WITH_PEC)
2798 {
2799 hsmbus->XferOptions = SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC;
2800 }
2801 else
2802 {
2803
2804 }
2805 }
2806
2807
2808
2809
2810 #endif
2811
2812
2813
2814
2815
2816
2817