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
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 #include "stm32h7xx_hal.h"
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196 #ifdef HAL_SMARTCARD_MODULE_ENABLED
0197
0198
0199
0200
0201
0202
0203
0204 #define SMARTCARD_TEACK_REACK_TIMEOUT 1000U
0205
0206 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \
0207 USART_CR1_RE | USART_CR1_OVER8| \
0208 USART_CR1_FIFOEN))
0209
0210 #define USART_CR2_CLK_FIELDS ((uint32_t)(USART_CR2_CLKEN | USART_CR2_CPOL | \
0211 USART_CR2_CPHA | USART_CR2_LBCL))
0212
0213 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_RTOEN | USART_CR2_CLK_FIELDS | \
0214 USART_CR2_STOP))
0215
0216 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_ONEBIT | USART_CR3_NACK | USART_CR3_SCARCNT | \
0217 USART_CR3_TXFTCFG | USART_CR3_RXFTCFG ))
0218
0219 #define USART_BRR_MIN 0x10U
0220
0221 #define USART_BRR_MAX 0x0000FFFFU
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
0233 void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsmartcard);
0234 #endif
0235 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard);
0236 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard);
0237 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard);
0238 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag,
0239 FlagStatus Status, uint32_t Tickstart, uint32_t Timeout);
0240 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard);
0241 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard);
0242 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma);
0243 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
0244 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma);
0245 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma);
0246 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
0247 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
0248 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
0249 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);
0250 static void SMARTCARD_TxISR(SMARTCARD_HandleTypeDef *hsmartcard);
0251 static void SMARTCARD_TxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard);
0252 static void SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard);
0253 static void SMARTCARD_RxISR(SMARTCARD_HandleTypeDef *hsmartcard);
0254 static void SMARTCARD_RxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard);
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
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322 HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsmartcard)
0323 {
0324
0325 if (hsmartcard == NULL)
0326 {
0327 return HAL_ERROR;
0328 }
0329
0330
0331 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
0332
0333 if (hsmartcard->gState == HAL_SMARTCARD_STATE_RESET)
0334 {
0335
0336 hsmartcard->Lock = HAL_UNLOCKED;
0337
0338 #if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
0339 SMARTCARD_InitCallbacksToDefault(hsmartcard);
0340
0341 if (hsmartcard->MspInitCallback == NULL)
0342 {
0343 hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit;
0344 }
0345
0346
0347 hsmartcard->MspInitCallback(hsmartcard);
0348 #else
0349
0350 HAL_SMARTCARD_MspInit(hsmartcard);
0351 #endif
0352 }
0353
0354 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY;
0355
0356
0357 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0358
0359
0360
0361
0362 CLEAR_BIT(hsmartcard->Instance->CR2, USART_CR2_LINEN);
0363 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN));
0364
0365
0366 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_SCEN);
0367
0368
0369 if (SMARTCARD_SetConfig(hsmartcard) == HAL_ERROR)
0370 {
0371 return HAL_ERROR;
0372 }
0373
0374
0375 SMARTCARD_TRANSMISSION_COMPLETION_SETTING(hsmartcard);
0376
0377 if (hsmartcard->AdvancedInit.AdvFeatureInit != SMARTCARD_ADVFEATURE_NO_INIT)
0378 {
0379 SMARTCARD_AdvFeatureConfig(hsmartcard);
0380 }
0381
0382
0383 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0384
0385
0386 return (SMARTCARD_CheckIdleState(hsmartcard));
0387 }
0388
0389
0390
0391
0392
0393
0394
0395 HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsmartcard)
0396 {
0397
0398 if (hsmartcard == NULL)
0399 {
0400 return HAL_ERROR;
0401 }
0402
0403
0404 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
0405
0406 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY;
0407
0408
0409 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0410
0411 WRITE_REG(hsmartcard->Instance->CR1, 0x0U);
0412 WRITE_REG(hsmartcard->Instance->CR2, 0x0U);
0413 WRITE_REG(hsmartcard->Instance->CR3, 0x0U);
0414 WRITE_REG(hsmartcard->Instance->RTOR, 0x0U);
0415 WRITE_REG(hsmartcard->Instance->GTPR, 0x0U);
0416
0417
0418 #if USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1
0419 if (hsmartcard->MspDeInitCallback == NULL)
0420 {
0421 hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
0422 }
0423
0424 hsmartcard->MspDeInitCallback(hsmartcard);
0425 #else
0426 HAL_SMARTCARD_MspDeInit(hsmartcard);
0427 #endif
0428
0429 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
0430 hsmartcard->gState = HAL_SMARTCARD_STATE_RESET;
0431 hsmartcard->RxState = HAL_SMARTCARD_STATE_RESET;
0432
0433
0434 __HAL_UNLOCK(hsmartcard);
0435
0436 return HAL_OK;
0437 }
0438
0439
0440
0441
0442
0443
0444
0445 __weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsmartcard)
0446 {
0447
0448 UNUSED(hsmartcard);
0449
0450
0451
0452
0453 }
0454
0455
0456
0457
0458
0459
0460
0461 __weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsmartcard)
0462 {
0463
0464 UNUSED(hsmartcard);
0465
0466
0467
0468
0469 }
0470
0471 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494 HAL_StatusTypeDef HAL_SMARTCARD_RegisterCallback(SMARTCARD_HandleTypeDef *hsmartcard,
0495 HAL_SMARTCARD_CallbackIDTypeDef CallbackID,
0496 pSMARTCARD_CallbackTypeDef pCallback)
0497 {
0498 HAL_StatusTypeDef status = HAL_OK;
0499
0500 if (pCallback == NULL)
0501 {
0502
0503 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0504
0505 return HAL_ERROR;
0506 }
0507
0508 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
0509 {
0510 switch (CallbackID)
0511 {
0512
0513 case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
0514 hsmartcard->TxCpltCallback = pCallback;
0515 break;
0516
0517 case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
0518 hsmartcard->RxCpltCallback = pCallback;
0519 break;
0520
0521 case HAL_SMARTCARD_ERROR_CB_ID :
0522 hsmartcard->ErrorCallback = pCallback;
0523 break;
0524
0525 case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
0526 hsmartcard->AbortCpltCallback = pCallback;
0527 break;
0528
0529 case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
0530 hsmartcard->AbortTransmitCpltCallback = pCallback;
0531 break;
0532
0533 case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
0534 hsmartcard->AbortReceiveCpltCallback = pCallback;
0535 break;
0536
0537 case HAL_SMARTCARD_RX_FIFO_FULL_CB_ID :
0538 hsmartcard->RxFifoFullCallback = pCallback;
0539 break;
0540
0541 case HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID :
0542 hsmartcard->TxFifoEmptyCallback = pCallback;
0543 break;
0544
0545 case HAL_SMARTCARD_MSPINIT_CB_ID :
0546 hsmartcard->MspInitCallback = pCallback;
0547 break;
0548
0549 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
0550 hsmartcard->MspDeInitCallback = pCallback;
0551 break;
0552
0553 default :
0554
0555 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0556
0557
0558 status = HAL_ERROR;
0559 break;
0560 }
0561 }
0562 else if (hsmartcard->gState == HAL_SMARTCARD_STATE_RESET)
0563 {
0564 switch (CallbackID)
0565 {
0566 case HAL_SMARTCARD_MSPINIT_CB_ID :
0567 hsmartcard->MspInitCallback = pCallback;
0568 break;
0569
0570 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
0571 hsmartcard->MspDeInitCallback = pCallback;
0572 break;
0573
0574 default :
0575
0576 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0577
0578
0579 status = HAL_ERROR;
0580 break;
0581 }
0582 }
0583 else
0584 {
0585
0586 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0587
0588
0589 status = HAL_ERROR;
0590 }
0591
0592 return status;
0593 }
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616 HAL_StatusTypeDef HAL_SMARTCARD_UnRegisterCallback(SMARTCARD_HandleTypeDef *hsmartcard,
0617 HAL_SMARTCARD_CallbackIDTypeDef CallbackID)
0618 {
0619 HAL_StatusTypeDef status = HAL_OK;
0620
0621 if (HAL_SMARTCARD_STATE_READY == hsmartcard->gState)
0622 {
0623 switch (CallbackID)
0624 {
0625 case HAL_SMARTCARD_TX_COMPLETE_CB_ID :
0626 hsmartcard->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback;
0627 break;
0628
0629 case HAL_SMARTCARD_RX_COMPLETE_CB_ID :
0630 hsmartcard->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback;
0631 break;
0632
0633 case HAL_SMARTCARD_ERROR_CB_ID :
0634 hsmartcard->ErrorCallback = HAL_SMARTCARD_ErrorCallback;
0635 break;
0636
0637 case HAL_SMARTCARD_ABORT_COMPLETE_CB_ID :
0638 hsmartcard->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback;
0639 break;
0640
0641 case HAL_SMARTCARD_ABORT_TRANSMIT_COMPLETE_CB_ID :
0642 hsmartcard->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback;
0643
0644 break;
0645
0646 case HAL_SMARTCARD_ABORT_RECEIVE_COMPLETE_CB_ID :
0647 hsmartcard->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback;
0648
0649 break;
0650
0651 case HAL_SMARTCARD_RX_FIFO_FULL_CB_ID :
0652 hsmartcard->RxFifoFullCallback = HAL_SMARTCARDEx_RxFifoFullCallback;
0653 break;
0654
0655 case HAL_SMARTCARD_TX_FIFO_EMPTY_CB_ID :
0656 hsmartcard->TxFifoEmptyCallback = HAL_SMARTCARDEx_TxFifoEmptyCallback;
0657 break;
0658
0659 case HAL_SMARTCARD_MSPINIT_CB_ID :
0660 hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit;
0661 break;
0662
0663 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
0664 hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
0665 break;
0666
0667 default :
0668
0669 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0670
0671
0672 status = HAL_ERROR;
0673 break;
0674 }
0675 }
0676 else if (HAL_SMARTCARD_STATE_RESET == hsmartcard->gState)
0677 {
0678 switch (CallbackID)
0679 {
0680 case HAL_SMARTCARD_MSPINIT_CB_ID :
0681 hsmartcard->MspInitCallback = HAL_SMARTCARD_MspInit;
0682 break;
0683
0684 case HAL_SMARTCARD_MSPDEINIT_CB_ID :
0685 hsmartcard->MspDeInitCallback = HAL_SMARTCARD_MspDeInit;
0686 break;
0687
0688 default :
0689
0690 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0691
0692
0693 status = HAL_ERROR;
0694 break;
0695 }
0696 }
0697 else
0698 {
0699
0700 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_INVALID_CALLBACK;
0701
0702
0703 status = HAL_ERROR;
0704 }
0705
0706 return status;
0707 }
0708 #endif
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812 HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size,
0813 uint32_t Timeout)
0814 {
0815 uint32_t tickstart;
0816 const uint8_t *ptmpdata = pData;
0817
0818
0819 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
0820 {
0821 if ((ptmpdata == NULL) || (Size == 0U))
0822 {
0823 return HAL_ERROR;
0824 }
0825
0826
0827 __HAL_LOCK(hsmartcard);
0828
0829 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
0830
0831
0832 tickstart = HAL_GetTick();
0833
0834
0835 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0836
0837
0838
0839
0840 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
0841 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
0842 {
0843 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
0844 }
0845
0846 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
0847
0848
0849 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0850
0851
0852 __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard);
0853
0854 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
0855 hsmartcard->TxXferSize = Size;
0856 hsmartcard->TxXferCount = Size;
0857
0858 while (hsmartcard->TxXferCount > 0U)
0859 {
0860 hsmartcard->TxXferCount--;
0861 if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
0862 {
0863 return HAL_TIMEOUT;
0864 }
0865 hsmartcard->Instance->TDR = (uint8_t)(*ptmpdata & 0xFFU);
0866 ptmpdata++;
0867 }
0868 if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_TRANSMISSION_COMPLETION_FLAG(hsmartcard), RESET,
0869 tickstart, Timeout) != HAL_OK)
0870 {
0871 return HAL_TIMEOUT;
0872 }
0873
0874
0875 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0876 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
0877 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
0878 {
0879
0880
0881 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
0882 }
0883 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX)
0884 || (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
0885 {
0886
0887 __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard);
0888 }
0889 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
0890
0891
0892 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
0893
0894
0895 __HAL_UNLOCK(hsmartcard);
0896
0897 return HAL_OK;
0898 }
0899 else
0900 {
0901 return HAL_BUSY;
0902 }
0903 }
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918 HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size,
0919 uint32_t Timeout)
0920 {
0921 uint32_t tickstart;
0922 uint8_t *ptmpdata = pData;
0923
0924
0925 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
0926 {
0927 if ((ptmpdata == NULL) || (Size == 0U))
0928 {
0929 return HAL_ERROR;
0930 }
0931
0932
0933 __HAL_LOCK(hsmartcard);
0934
0935 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
0936 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
0937
0938
0939 tickstart = HAL_GetTick();
0940
0941 hsmartcard->RxXferSize = Size;
0942 hsmartcard->RxXferCount = Size;
0943
0944
0945 while (hsmartcard->RxXferCount > 0U)
0946 {
0947 hsmartcard->RxXferCount--;
0948
0949 if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, SMARTCARD_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
0950 {
0951 return HAL_TIMEOUT;
0952 }
0953 *ptmpdata = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0x00FF);
0954 ptmpdata++;
0955 }
0956
0957
0958 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
0959
0960
0961 __HAL_UNLOCK(hsmartcard);
0962
0963 return HAL_OK;
0964 }
0965 else
0966 {
0967 return HAL_BUSY;
0968 }
0969 }
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size)
0987 {
0988
0989 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
0990 {
0991 if ((pData == NULL) || (Size == 0U))
0992 {
0993 return HAL_ERROR;
0994 }
0995
0996
0997 __HAL_LOCK(hsmartcard);
0998
0999 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1000 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
1001
1002 hsmartcard->pTxBuffPtr = pData;
1003 hsmartcard->TxXferSize = Size;
1004 hsmartcard->TxXferCount = Size;
1005 hsmartcard->TxISR = NULL;
1006
1007
1008 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
1009
1010
1011
1012
1013 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
1014 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
1015 {
1016 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
1017 }
1018
1019 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
1020
1021
1022 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
1023
1024
1025 __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard);
1026
1027
1028 if (hsmartcard->FifoMode == SMARTCARD_FIFOMODE_ENABLE)
1029 {
1030
1031 hsmartcard->TxISR = SMARTCARD_TxISR_FIFOEN;
1032
1033
1034 __HAL_UNLOCK(hsmartcard);
1035
1036
1037 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1038
1039
1040 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE);
1041 }
1042 else
1043 {
1044
1045 hsmartcard->TxISR = SMARTCARD_TxISR;
1046
1047
1048 __HAL_UNLOCK(hsmartcard);
1049
1050
1051 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1052
1053
1054 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1055 }
1056
1057 return HAL_OK;
1058 }
1059 else
1060 {
1061 return HAL_BUSY;
1062 }
1063 }
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080 HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
1081 {
1082
1083 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
1084 {
1085 if ((pData == NULL) || (Size == 0U))
1086 {
1087 return HAL_ERROR;
1088 }
1089
1090
1091 __HAL_LOCK(hsmartcard);
1092
1093 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1094 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
1095
1096 hsmartcard->pRxBuffPtr = pData;
1097 hsmartcard->RxXferSize = Size;
1098 hsmartcard->RxXferCount = Size;
1099
1100
1101 if ((hsmartcard->FifoMode == SMARTCARD_FIFOMODE_ENABLE) && (Size >= hsmartcard->NbRxDataToProcess))
1102 {
1103
1104 hsmartcard->RxISR = SMARTCARD_RxISR_FIFOEN;
1105
1106
1107 __HAL_UNLOCK(hsmartcard);
1108
1109
1110 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
1111 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_RXFTIE);
1112 }
1113 else
1114 {
1115
1116 hsmartcard->RxISR = SMARTCARD_RxISR;
1117
1118
1119 __HAL_UNLOCK(hsmartcard);
1120
1121
1122 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1123 }
1124
1125
1126 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1127
1128 return HAL_OK;
1129 }
1130 else
1131 {
1132 return HAL_BUSY;
1133 }
1134 }
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144 HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsmartcard, const uint8_t *pData, uint16_t Size)
1145 {
1146
1147 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
1148 {
1149 if ((pData == NULL) || (Size == 0U))
1150 {
1151 return HAL_ERROR;
1152 }
1153
1154
1155 __HAL_LOCK(hsmartcard);
1156
1157 hsmartcard->gState = HAL_SMARTCARD_STATE_BUSY_TX;
1158
1159 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1160 hsmartcard->pTxBuffPtr = pData;
1161 hsmartcard->TxXferSize = Size;
1162 hsmartcard->TxXferCount = Size;
1163
1164
1165 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
1166
1167
1168
1169
1170 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
1171 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
1172 {
1173 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
1174 }
1175
1176 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_TE);
1177
1178
1179 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
1180
1181
1182 __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard);
1183
1184
1185 hsmartcard->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt;
1186
1187
1188 hsmartcard->hdmatx->XferErrorCallback = SMARTCARD_DMAError;
1189
1190
1191 hsmartcard->hdmatx->XferAbortCallback = NULL;
1192
1193
1194 if (HAL_DMA_Start_IT(hsmartcard->hdmatx, (uint32_t)hsmartcard->pTxBuffPtr, (uint32_t)&hsmartcard->Instance->TDR,
1195 Size) == HAL_OK)
1196 {
1197
1198 CLEAR_BIT(hsmartcard->Instance->ICR, USART_ICR_TCCF);
1199
1200
1201 __HAL_UNLOCK(hsmartcard);
1202
1203
1204 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1205
1206
1207
1208 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
1209
1210 return HAL_OK;
1211 }
1212 else
1213 {
1214
1215 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1216
1217
1218 __HAL_UNLOCK(hsmartcard);
1219
1220
1221 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1222
1223 return HAL_ERROR;
1224 }
1225 }
1226 else
1227 {
1228 return HAL_BUSY;
1229 }
1230 }
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242 HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsmartcard, uint8_t *pData, uint16_t Size)
1243 {
1244
1245 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
1246 {
1247 if ((pData == NULL) || (Size == 0U))
1248 {
1249 return HAL_ERROR;
1250 }
1251
1252
1253 __HAL_LOCK(hsmartcard);
1254
1255 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1256 hsmartcard->RxState = HAL_SMARTCARD_STATE_BUSY_RX;
1257
1258 hsmartcard->pRxBuffPtr = pData;
1259 hsmartcard->RxXferSize = Size;
1260
1261
1262 hsmartcard->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt;
1263
1264
1265 hsmartcard->hdmarx->XferErrorCallback = SMARTCARD_DMAError;
1266
1267
1268 hsmartcard->hdmarx->XferAbortCallback = NULL;
1269
1270
1271 if (HAL_DMA_Start_IT(hsmartcard->hdmarx, (uint32_t)&hsmartcard->Instance->RDR, (uint32_t)hsmartcard->pRxBuffPtr,
1272 Size) == HAL_OK)
1273 {
1274
1275 __HAL_UNLOCK(hsmartcard);
1276
1277
1278 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
1279
1280
1281 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1282
1283
1284
1285 SET_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1286
1287 return HAL_OK;
1288 }
1289 else
1290 {
1291
1292 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1293
1294
1295 __HAL_UNLOCK(hsmartcard);
1296
1297
1298 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1299
1300 return HAL_ERROR;
1301 }
1302 }
1303 else
1304 {
1305 return HAL_BUSY;
1306 }
1307 }
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322 HAL_StatusTypeDef HAL_SMARTCARD_Abort(SMARTCARD_HandleTypeDef *hsmartcard)
1323 {
1324
1325
1326 CLEAR_BIT(hsmartcard->Instance->CR1,
1327 (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE | USART_CR1_RTOIE |
1328 USART_CR1_EOBIE));
1329 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1330
1331
1332 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
1333 {
1334 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
1335
1336
1337 if (hsmartcard->hdmatx != NULL)
1338 {
1339
1340
1341 hsmartcard->hdmatx->XferAbortCallback = NULL;
1342
1343 if (HAL_DMA_Abort(hsmartcard->hdmatx) != HAL_OK)
1344 {
1345 if (HAL_DMA_GetError(hsmartcard->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1346 {
1347
1348 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1349
1350 return HAL_TIMEOUT;
1351 }
1352 }
1353 }
1354 }
1355
1356
1357 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1358 {
1359 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1360
1361
1362 if (hsmartcard->hdmarx != NULL)
1363 {
1364
1365
1366 hsmartcard->hdmarx->XferAbortCallback = NULL;
1367
1368 if (HAL_DMA_Abort(hsmartcard->hdmarx) != HAL_OK)
1369 {
1370 if (HAL_DMA_GetError(hsmartcard->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1371 {
1372
1373 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1374
1375 return HAL_TIMEOUT;
1376 }
1377 }
1378 }
1379 }
1380
1381
1382 hsmartcard->TxXferCount = 0U;
1383 hsmartcard->RxXferCount = 0U;
1384
1385
1386 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
1387 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF |
1388 SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
1389
1390
1391 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1392 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1393
1394
1395 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1396
1397 return HAL_OK;
1398 }
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit(SMARTCARD_HandleTypeDef *hsmartcard)
1414 {
1415
1416 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1417 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE);
1418
1419
1420 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
1421 {
1422
1423 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1424 }
1425
1426
1427 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
1428 {
1429 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
1430
1431
1432 if (hsmartcard->hdmatx != NULL)
1433 {
1434
1435
1436 hsmartcard->hdmatx->XferAbortCallback = NULL;
1437
1438 if (HAL_DMA_Abort(hsmartcard->hdmatx) != HAL_OK)
1439 {
1440 if (HAL_DMA_GetError(hsmartcard->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1441 {
1442
1443 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1444
1445 return HAL_TIMEOUT;
1446 }
1447 }
1448 }
1449 }
1450
1451
1452 hsmartcard->TxXferCount = 0U;
1453
1454
1455 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
1456
1457
1458 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1459
1460 return HAL_OK;
1461 }
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive(SMARTCARD_HandleTypeDef *hsmartcard)
1477 {
1478
1479 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE |
1480 USART_CR1_EOBIE));
1481 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
1482
1483
1484 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
1485 {
1486
1487 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1488 }
1489
1490
1491 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1492 {
1493 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1494
1495
1496 if (hsmartcard->hdmarx != NULL)
1497 {
1498
1499
1500 hsmartcard->hdmarx->XferAbortCallback = NULL;
1501
1502 if (HAL_DMA_Abort(hsmartcard->hdmarx) != HAL_OK)
1503 {
1504 if (HAL_DMA_GetError(hsmartcard->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1505 {
1506
1507 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_DMA;
1508
1509 return HAL_TIMEOUT;
1510 }
1511 }
1512 }
1513 }
1514
1515
1516 hsmartcard->RxXferCount = 0U;
1517
1518
1519 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
1520 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF |
1521 SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
1522
1523
1524 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1525
1526 return HAL_OK;
1527 }
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544 HAL_StatusTypeDef HAL_SMARTCARD_Abort_IT(SMARTCARD_HandleTypeDef *hsmartcard)
1545 {
1546 uint32_t abortcplt = 1U;
1547
1548
1549
1550 CLEAR_BIT(hsmartcard->Instance->CR1,
1551 (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE | USART_CR1_RTOIE |
1552 USART_CR1_EOBIE));
1553 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1554
1555
1556
1557
1558
1559 if (hsmartcard->hdmatx != NULL)
1560 {
1561
1562
1563 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
1564 {
1565 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxAbortCallback;
1566 }
1567 else
1568 {
1569 hsmartcard->hdmatx->XferAbortCallback = NULL;
1570 }
1571 }
1572
1573 if (hsmartcard->hdmarx != NULL)
1574 {
1575
1576
1577 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1578 {
1579 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxAbortCallback;
1580 }
1581 else
1582 {
1583 hsmartcard->hdmarx->XferAbortCallback = NULL;
1584 }
1585 }
1586
1587
1588 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
1589 {
1590
1591 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
1592
1593
1594 if (hsmartcard->hdmatx != NULL)
1595 {
1596
1597
1598
1599
1600 if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
1601 {
1602 hsmartcard->hdmatx->XferAbortCallback = NULL;
1603 }
1604 else
1605 {
1606 abortcplt = 0U;
1607 }
1608 }
1609 }
1610
1611
1612 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1613 {
1614 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1615
1616
1617 if (hsmartcard->hdmarx != NULL)
1618 {
1619
1620
1621
1622
1623 if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
1624 {
1625 hsmartcard->hdmarx->XferAbortCallback = NULL;
1626 abortcplt = 1U;
1627 }
1628 else
1629 {
1630 abortcplt = 0U;
1631 }
1632 }
1633 }
1634
1635
1636 if (abortcplt == 1U)
1637 {
1638
1639 hsmartcard->TxXferCount = 0U;
1640 hsmartcard->RxXferCount = 0U;
1641
1642
1643 hsmartcard->RxISR = NULL;
1644 hsmartcard->TxISR = NULL;
1645
1646
1647 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
1648
1649
1650 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
1651 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF |
1652 SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
1653
1654
1655 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1656 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1657
1658
1659 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1660
1661 hsmartcard->AbortCpltCallback(hsmartcard);
1662 #else
1663
1664 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
1665 #endif
1666 }
1667
1668 return HAL_OK;
1669 }
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686 HAL_StatusTypeDef HAL_SMARTCARD_AbortTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
1687 {
1688
1689 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
1690 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_TXFTIE);
1691
1692
1693 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
1694 {
1695
1696 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1697 }
1698
1699
1700 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
1701 {
1702 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
1703
1704
1705 if (hsmartcard->hdmatx != NULL)
1706 {
1707
1708
1709 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMATxOnlyAbortCallback;
1710
1711
1712 if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
1713 {
1714
1715 hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx);
1716 }
1717 }
1718 else
1719 {
1720
1721 hsmartcard->TxXferCount = 0U;
1722
1723
1724 hsmartcard->TxISR = NULL;
1725
1726
1727 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1728
1729
1730 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1731
1732 hsmartcard->AbortTransmitCpltCallback(hsmartcard);
1733 #else
1734
1735 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
1736 #endif
1737 }
1738 }
1739 else
1740 {
1741
1742 hsmartcard->TxXferCount = 0U;
1743
1744
1745 hsmartcard->TxISR = NULL;
1746
1747
1748 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
1749
1750
1751 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
1752
1753
1754 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1755
1756 hsmartcard->AbortTransmitCpltCallback(hsmartcard);
1757 #else
1758
1759 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
1760 #endif
1761 }
1762
1763 return HAL_OK;
1764 }
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781 HAL_StatusTypeDef HAL_SMARTCARD_AbortReceive_IT(SMARTCARD_HandleTypeDef *hsmartcard)
1782 {
1783
1784 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_RTOIE |
1785 USART_CR1_EOBIE));
1786 CLEAR_BIT(hsmartcard->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
1787
1788
1789 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
1790 {
1791
1792 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
1793 }
1794
1795
1796 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1797 {
1798 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1799
1800
1801 if (hsmartcard->hdmarx != NULL)
1802 {
1803
1804
1805 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMARxOnlyAbortCallback;
1806
1807
1808 if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
1809 {
1810
1811 hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx);
1812 }
1813 }
1814 else
1815 {
1816
1817 hsmartcard->RxXferCount = 0U;
1818
1819
1820 hsmartcard->RxISR = NULL;
1821
1822
1823 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
1824 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF |
1825 SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
1826
1827
1828 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1829
1830
1831 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1832
1833 hsmartcard->AbortReceiveCpltCallback(hsmartcard);
1834 #else
1835
1836 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
1837 #endif
1838 }
1839 }
1840 else
1841 {
1842
1843 hsmartcard->RxXferCount = 0U;
1844
1845
1846 hsmartcard->RxISR = NULL;
1847
1848
1849 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
1850 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF |
1851 SMARTCARD_CLEAR_FEF | SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
1852
1853
1854 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
1855
1856
1857 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1858
1859 hsmartcard->AbortReceiveCpltCallback(hsmartcard);
1860 #else
1861
1862 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
1863 #endif
1864 }
1865
1866 return HAL_OK;
1867 }
1868
1869
1870
1871
1872
1873
1874
1875 void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsmartcard)
1876 {
1877 uint32_t isrflags = READ_REG(hsmartcard->Instance->ISR);
1878 uint32_t cr1its = READ_REG(hsmartcard->Instance->CR1);
1879 uint32_t cr3its = READ_REG(hsmartcard->Instance->CR3);
1880 uint32_t errorflags;
1881 uint32_t errorcode;
1882
1883
1884 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF));
1885 if (errorflags == 0U)
1886 {
1887
1888 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
1889 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
1890 || ((cr3its & USART_CR3_RXFTIE) != 0U)))
1891 {
1892 if (hsmartcard->RxISR != NULL)
1893 {
1894 hsmartcard->RxISR(hsmartcard);
1895 }
1896 return;
1897 }
1898 }
1899
1900
1901 if ((errorflags != 0U)
1902 && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
1903 || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))))
1904 {
1905
1906 if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
1907 {
1908 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_PEF);
1909
1910 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_PE;
1911 }
1912
1913
1914 if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
1915 {
1916 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_FEF);
1917
1918 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_FE;
1919 }
1920
1921
1922 if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
1923 {
1924 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_NEF);
1925
1926 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_NE;
1927 }
1928
1929
1930 if (((isrflags & USART_ISR_ORE) != 0U)
1931 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
1932 || ((cr3its & USART_CR3_RXFTIE) != 0U)
1933 || ((cr3its & USART_CR3_EIE) != 0U)))
1934 {
1935 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_OREF);
1936
1937 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_ORE;
1938 }
1939
1940
1941 if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U))
1942 {
1943 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_RTOF);
1944
1945 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_RTO;
1946 }
1947
1948
1949 if (hsmartcard->ErrorCode != HAL_SMARTCARD_ERROR_NONE)
1950 {
1951
1952 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
1953 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
1954 || ((cr3its & USART_CR3_RXFTIE) != 0U)))
1955 {
1956 if (hsmartcard->RxISR != NULL)
1957 {
1958 hsmartcard->RxISR(hsmartcard);
1959 }
1960 }
1961
1962
1963
1964
1965
1966
1967 errorcode = hsmartcard->ErrorCode;
1968 if ((HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1969 || ((errorcode & (HAL_SMARTCARD_ERROR_RTO | HAL_SMARTCARD_ERROR_ORE)) != 0U))
1970 {
1971
1972
1973
1974 SMARTCARD_EndRxTransfer(hsmartcard);
1975
1976
1977 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
1978 {
1979 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
1980
1981
1982 if (hsmartcard->hdmarx != NULL)
1983 {
1984
1985
1986 hsmartcard->hdmarx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
1987
1988
1989 if (HAL_DMA_Abort_IT(hsmartcard->hdmarx) != HAL_OK)
1990 {
1991
1992 hsmartcard->hdmarx->XferAbortCallback(hsmartcard->hdmarx);
1993 }
1994 }
1995 else
1996 {
1997 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
1998
1999 hsmartcard->ErrorCallback(hsmartcard);
2000 #else
2001
2002 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2003 #endif
2004 }
2005 }
2006 else
2007 {
2008 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2009
2010 hsmartcard->ErrorCallback(hsmartcard);
2011 #else
2012
2013 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2014 #endif
2015 }
2016 }
2017
2018
2019
2020 else if ((hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
2021 && ((errorcode & HAL_SMARTCARD_ERROR_FE) != 0U))
2022 {
2023
2024
2025
2026 SMARTCARD_EndTxTransfer(hsmartcard);
2027
2028
2029 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
2030 {
2031 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
2032
2033
2034 if (hsmartcard->hdmatx != NULL)
2035 {
2036
2037
2038 hsmartcard->hdmatx->XferAbortCallback = SMARTCARD_DMAAbortOnError;
2039
2040
2041 if (HAL_DMA_Abort_IT(hsmartcard->hdmatx) != HAL_OK)
2042 {
2043
2044 hsmartcard->hdmatx->XferAbortCallback(hsmartcard->hdmatx);
2045 }
2046 }
2047 else
2048 {
2049 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2050
2051 hsmartcard->ErrorCallback(hsmartcard);
2052 #else
2053
2054 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2055 #endif
2056 }
2057 }
2058 else
2059 {
2060 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2061
2062 hsmartcard->ErrorCallback(hsmartcard);
2063 #else
2064
2065 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2066 #endif
2067 }
2068 }
2069 else
2070 {
2071
2072
2073 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2074
2075 hsmartcard->ErrorCallback(hsmartcard);
2076 #else
2077
2078 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2079 #endif
2080 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2081 }
2082 }
2083 return;
2084
2085 }
2086
2087
2088 if (((isrflags & USART_ISR_EOBF) != 0U) && ((cr1its & USART_CR1_EOBIE) != 0U))
2089 {
2090 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2091 __HAL_UNLOCK(hsmartcard);
2092 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2093
2094 hsmartcard->RxCpltCallback(hsmartcard);
2095 #else
2096
2097 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
2098 #endif
2099
2100
2101 __HAL_SMARTCARD_CLEAR_IT(hsmartcard, SMARTCARD_CLEAR_EOBF);
2102 return;
2103 }
2104
2105
2106 if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
2107 && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
2108 || ((cr3its & USART_CR3_TXFTIE) != 0U)))
2109 {
2110 if (hsmartcard->TxISR != NULL)
2111 {
2112 hsmartcard->TxISR(hsmartcard);
2113 }
2114 return;
2115 }
2116
2117
2118 if (__HAL_SMARTCARD_GET_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET)
2119 {
2120 if (__HAL_SMARTCARD_GET_IT_SOURCE(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication) != RESET)
2121 {
2122 SMARTCARD_EndTransmit_IT(hsmartcard);
2123 return;
2124 }
2125 }
2126
2127
2128 if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
2129 {
2130 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2131
2132 hsmartcard->TxFifoEmptyCallback(hsmartcard);
2133 #else
2134
2135 HAL_SMARTCARDEx_TxFifoEmptyCallback(hsmartcard);
2136 #endif
2137 return;
2138 }
2139
2140
2141 if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
2142 {
2143 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2144
2145 hsmartcard->RxFifoFullCallback(hsmartcard);
2146 #else
2147
2148 HAL_SMARTCARDEx_RxFifoFullCallback(hsmartcard);
2149 #endif
2150 return;
2151 }
2152 }
2153
2154
2155
2156
2157
2158
2159
2160 __weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2161 {
2162
2163 UNUSED(hsmartcard);
2164
2165
2166
2167
2168 }
2169
2170
2171
2172
2173
2174
2175
2176 __weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2177 {
2178
2179 UNUSED(hsmartcard);
2180
2181
2182
2183
2184 }
2185
2186
2187
2188
2189
2190
2191
2192 __weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2193 {
2194
2195 UNUSED(hsmartcard);
2196
2197
2198
2199
2200 }
2201
2202
2203
2204
2205
2206
2207
2208 __weak void HAL_SMARTCARD_AbortCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2209 {
2210
2211 UNUSED(hsmartcard);
2212
2213
2214
2215
2216 }
2217
2218
2219
2220
2221
2222
2223
2224 __weak void HAL_SMARTCARD_AbortTransmitCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2225 {
2226
2227 UNUSED(hsmartcard);
2228
2229
2230
2231
2232 }
2233
2234
2235
2236
2237
2238
2239
2240 __weak void HAL_SMARTCARD_AbortReceiveCpltCallback(SMARTCARD_HandleTypeDef *hsmartcard)
2241 {
2242
2243 UNUSED(hsmartcard);
2244
2245
2246
2247
2248 }
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280 HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(const SMARTCARD_HandleTypeDef *hsmartcard)
2281 {
2282
2283 uint32_t temp1;
2284 uint32_t temp2;
2285 temp1 = (uint32_t)hsmartcard->gState;
2286 temp2 = (uint32_t)hsmartcard->RxState;
2287
2288 return (HAL_SMARTCARD_StateTypeDef)(temp1 | temp2);
2289 }
2290
2291
2292
2293
2294
2295
2296
2297 uint32_t HAL_SMARTCARD_GetError(const SMARTCARD_HandleTypeDef *hsmartcard)
2298 {
2299 return hsmartcard->ErrorCode;
2300 }
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2316
2317
2318
2319
2320
2321 void SMARTCARD_InitCallbacksToDefault(SMARTCARD_HandleTypeDef *hsmartcard)
2322 {
2323
2324 hsmartcard->TxCpltCallback = HAL_SMARTCARD_TxCpltCallback;
2325 hsmartcard->RxCpltCallback = HAL_SMARTCARD_RxCpltCallback;
2326 hsmartcard->ErrorCallback = HAL_SMARTCARD_ErrorCallback;
2327 hsmartcard->AbortCpltCallback = HAL_SMARTCARD_AbortCpltCallback;
2328 hsmartcard->AbortTransmitCpltCallback = HAL_SMARTCARD_AbortTransmitCpltCallback;
2329
2330 hsmartcard->AbortReceiveCpltCallback = HAL_SMARTCARD_AbortReceiveCpltCallback;
2331
2332 hsmartcard->RxFifoFullCallback = HAL_SMARTCARDEx_RxFifoFullCallback;
2333
2334 hsmartcard->TxFifoEmptyCallback = HAL_SMARTCARDEx_TxFifoEmptyCallback;
2335
2336
2337 }
2338 #endif
2339
2340
2341
2342
2343
2344
2345
2346 static HAL_StatusTypeDef SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsmartcard)
2347 {
2348 uint32_t tmpreg;
2349 SMARTCARD_ClockSourceTypeDef clocksource;
2350 HAL_StatusTypeDef ret = HAL_OK;
2351 static const uint16_t SMARTCARDPrescTable[12] = {1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U};
2352 PLL2_ClocksTypeDef pll2_clocks;
2353 PLL3_ClocksTypeDef pll3_clocks;
2354 uint32_t pclk;
2355
2356
2357 assert_param(IS_SMARTCARD_INSTANCE(hsmartcard->Instance));
2358 assert_param(IS_SMARTCARD_BAUDRATE(hsmartcard->Init.BaudRate));
2359 assert_param(IS_SMARTCARD_WORD_LENGTH(hsmartcard->Init.WordLength));
2360 assert_param(IS_SMARTCARD_STOPBITS(hsmartcard->Init.StopBits));
2361 assert_param(IS_SMARTCARD_PARITY(hsmartcard->Init.Parity));
2362 assert_param(IS_SMARTCARD_MODE(hsmartcard->Init.Mode));
2363 assert_param(IS_SMARTCARD_POLARITY(hsmartcard->Init.CLKPolarity));
2364 assert_param(IS_SMARTCARD_PHASE(hsmartcard->Init.CLKPhase));
2365 assert_param(IS_SMARTCARD_LASTBIT(hsmartcard->Init.CLKLastBit));
2366 assert_param(IS_SMARTCARD_ONE_BIT_SAMPLE(hsmartcard->Init.OneBitSampling));
2367 assert_param(IS_SMARTCARD_NACK(hsmartcard->Init.NACKEnable));
2368 assert_param(IS_SMARTCARD_TIMEOUT(hsmartcard->Init.TimeOutEnable));
2369 assert_param(IS_SMARTCARD_AUTORETRY_COUNT(hsmartcard->Init.AutoRetryCount));
2370 assert_param(IS_SMARTCARD_CLOCKPRESCALER(hsmartcard->Init.ClockPrescaler));
2371
2372
2373
2374
2375
2376
2377
2378 tmpreg = (((uint32_t)hsmartcard->Init.Parity) | ((uint32_t)hsmartcard->Init.Mode) |
2379 ((uint32_t)hsmartcard->Init.WordLength));
2380 MODIFY_REG(hsmartcard->Instance->CR1, USART_CR1_FIELDS, tmpreg);
2381
2382
2383 tmpreg = hsmartcard->Init.StopBits;
2384
2385 tmpreg |= (uint32_t) USART_CR2_CLKEN | hsmartcard->Init.CLKPolarity;
2386 tmpreg |= (uint32_t) hsmartcard->Init.CLKPhase | hsmartcard->Init.CLKLastBit;
2387 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutEnable;
2388 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_FIELDS, tmpreg);
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398 tmpreg = (uint32_t) hsmartcard->Init.OneBitSampling | hsmartcard->Init.NACKEnable;
2399 tmpreg |= ((uint32_t)hsmartcard->Init.AutoRetryCount << USART_CR3_SCARCNT_Pos);
2400 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_FIELDS, tmpreg);
2401
2402
2403
2404
2405 MODIFY_REG(hsmartcard->Instance->PRESC, USART_PRESC_PRESCALER, hsmartcard->Init.ClockPrescaler);
2406
2407
2408 tmpreg = (hsmartcard->Init.Prescaler | ((uint32_t)hsmartcard->Init.GuardTime << USART_GTPR_GT_Pos));
2409 MODIFY_REG(hsmartcard->Instance->GTPR, (uint16_t)(USART_GTPR_GT | USART_GTPR_PSC), (uint16_t)tmpreg);
2410
2411
2412 tmpreg = ((uint32_t)hsmartcard->Init.BlockLength << USART_RTOR_BLEN_Pos);
2413 if (hsmartcard->Init.TimeOutEnable == SMARTCARD_TIMEOUT_ENABLE)
2414 {
2415 assert_param(IS_SMARTCARD_TIMEOUT_VALUE(hsmartcard->Init.TimeOutValue));
2416 tmpreg |= (uint32_t) hsmartcard->Init.TimeOutValue;
2417 }
2418 MODIFY_REG(hsmartcard->Instance->RTOR, (USART_RTOR_RTO | USART_RTOR_BLEN), tmpreg);
2419
2420
2421 SMARTCARD_GETCLOCKSOURCE(hsmartcard, clocksource);
2422 tmpreg = 0U;
2423 switch (clocksource)
2424 {
2425 case SMARTCARD_CLOCKSOURCE_D2PCLK1:
2426 pclk = HAL_RCC_GetPCLK1Freq();
2427 tmpreg = (uint32_t)(((pclk / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2428 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2429 break;
2430 case SMARTCARD_CLOCKSOURCE_D2PCLK2:
2431 pclk = HAL_RCC_GetPCLK2Freq();
2432 tmpreg = (uint32_t)(((pclk / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2433 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2434 break;
2435 case SMARTCARD_CLOCKSOURCE_PLL2Q:
2436 HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2437 tmpreg = (uint32_t)(((pll2_clocks.PLL2_Q_Frequency / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2438 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2439 break;
2440 case SMARTCARD_CLOCKSOURCE_PLL3Q:
2441 HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
2442 tmpreg = (uint32_t)(((pll3_clocks.PLL3_Q_Frequency / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2443 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2444 break;
2445 case SMARTCARD_CLOCKSOURCE_HSI:
2446 if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
2447 {
2448 tmpreg = (uint32_t)((((HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3U)) /
2449 SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2450 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2451 }
2452 else
2453 {
2454 tmpreg = (uint32_t)(((HSI_VALUE / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2455 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2456 }
2457 break;
2458 case SMARTCARD_CLOCKSOURCE_CSI:
2459 tmpreg = (uint32_t)(((CSI_VALUE / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2460 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2461 break;
2462 case SMARTCARD_CLOCKSOURCE_LSE:
2463 tmpreg = (uint32_t)(((uint16_t)(LSE_VALUE / SMARTCARDPrescTable[hsmartcard->Init.ClockPrescaler]) +
2464 (hsmartcard->Init.BaudRate / 2U)) / hsmartcard->Init.BaudRate);
2465 break;
2466 default:
2467 ret = HAL_ERROR;
2468 break;
2469 }
2470
2471
2472 if ((tmpreg >= USART_BRR_MIN) && (tmpreg <= USART_BRR_MAX))
2473 {
2474 hsmartcard->Instance->BRR = (uint16_t)tmpreg;
2475 }
2476 else
2477 {
2478 ret = HAL_ERROR;
2479 }
2480
2481
2482 hsmartcard->NbTxDataToProcess = 1U;
2483 hsmartcard->NbRxDataToProcess = 1U;
2484
2485
2486 hsmartcard->RxISR = NULL;
2487 hsmartcard->TxISR = NULL;
2488
2489 return ret;
2490 }
2491
2492
2493
2494
2495
2496
2497
2498
2499 static void SMARTCARD_AdvFeatureConfig(SMARTCARD_HandleTypeDef *hsmartcard)
2500 {
2501
2502 assert_param(IS_SMARTCARD_ADVFEATURE_INIT(hsmartcard->AdvancedInit.AdvFeatureInit));
2503
2504
2505 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_TXINVERT_INIT))
2506 {
2507 assert_param(IS_SMARTCARD_ADVFEATURE_TXINV(hsmartcard->AdvancedInit.TxPinLevelInvert));
2508 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_TXINV, hsmartcard->AdvancedInit.TxPinLevelInvert);
2509 }
2510
2511
2512 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXINVERT_INIT))
2513 {
2514 assert_param(IS_SMARTCARD_ADVFEATURE_RXINV(hsmartcard->AdvancedInit.RxPinLevelInvert));
2515 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_RXINV, hsmartcard->AdvancedInit.RxPinLevelInvert);
2516 }
2517
2518
2519 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DATAINVERT_INIT))
2520 {
2521 assert_param(IS_SMARTCARD_ADVFEATURE_DATAINV(hsmartcard->AdvancedInit.DataInvert));
2522 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_DATAINV, hsmartcard->AdvancedInit.DataInvert);
2523 }
2524
2525
2526 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_SWAP_INIT))
2527 {
2528 assert_param(IS_SMARTCARD_ADVFEATURE_SWAP(hsmartcard->AdvancedInit.Swap));
2529 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_SWAP, hsmartcard->AdvancedInit.Swap);
2530 }
2531
2532
2533 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_RXOVERRUNDISABLE_INIT))
2534 {
2535 assert_param(IS_SMARTCARD_OVERRUN(hsmartcard->AdvancedInit.OverrunDisable));
2536 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_OVRDIS, hsmartcard->AdvancedInit.OverrunDisable);
2537 }
2538
2539
2540 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_DMADISABLEONERROR_INIT))
2541 {
2542 assert_param(IS_SMARTCARD_ADVFEATURE_DMAONRXERROR(hsmartcard->AdvancedInit.DMADisableonRxError));
2543 MODIFY_REG(hsmartcard->Instance->CR3, USART_CR3_DDRE, hsmartcard->AdvancedInit.DMADisableonRxError);
2544 }
2545
2546
2547 if (HAL_IS_BIT_SET(hsmartcard->AdvancedInit.AdvFeatureInit, SMARTCARD_ADVFEATURE_MSBFIRST_INIT))
2548 {
2549 assert_param(IS_SMARTCARD_ADVFEATURE_MSBFIRST(hsmartcard->AdvancedInit.MSBFirst));
2550 MODIFY_REG(hsmartcard->Instance->CR2, USART_CR2_MSBFIRST, hsmartcard->AdvancedInit.MSBFirst);
2551 }
2552
2553 }
2554
2555
2556
2557
2558
2559
2560
2561 static HAL_StatusTypeDef SMARTCARD_CheckIdleState(SMARTCARD_HandleTypeDef *hsmartcard)
2562 {
2563 uint32_t tickstart;
2564
2565
2566 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2567
2568
2569 tickstart = HAL_GetTick();
2570
2571
2572 if ((hsmartcard->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
2573 {
2574
2575 if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_TEACK, RESET, tickstart,
2576 SMARTCARD_TEACK_REACK_TIMEOUT) != HAL_OK)
2577 {
2578
2579 return HAL_TIMEOUT;
2580 }
2581 }
2582
2583 if ((hsmartcard->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
2584 {
2585
2586 if (SMARTCARD_WaitOnFlagUntilTimeout(hsmartcard, USART_ISR_REACK, RESET, tickstart,
2587 SMARTCARD_TEACK_REACK_TIMEOUT) != HAL_OK)
2588 {
2589
2590 return HAL_TIMEOUT;
2591 }
2592 }
2593
2594
2595 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2596 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2597
2598
2599 __HAL_UNLOCK(hsmartcard);
2600
2601 return HAL_OK;
2602 }
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615 static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsmartcard, uint32_t Flag,
2616 FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
2617 {
2618
2619 while ((__HAL_SMARTCARD_GET_FLAG(hsmartcard, Flag) ? SET : RESET) == Status)
2620 {
2621
2622 if (Timeout != HAL_MAX_DELAY)
2623 {
2624 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2625 {
2626
2627
2628 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));
2629 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
2630
2631 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2632 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2633
2634
2635 __HAL_UNLOCK(hsmartcard);
2636 return HAL_TIMEOUT;
2637 }
2638 }
2639 }
2640 return HAL_OK;
2641 }
2642
2643
2644
2645
2646
2647
2648
2649
2650 static void SMARTCARD_EndTxTransfer(SMARTCARD_HandleTypeDef *hsmartcard)
2651 {
2652
2653 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));
2654 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
2655
2656
2657 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2658 }
2659
2660
2661
2662
2663
2664
2665
2666
2667 static void SMARTCARD_EndRxTransfer(SMARTCARD_HandleTypeDef *hsmartcard)
2668 {
2669
2670 CLEAR_BIT(hsmartcard->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
2671 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
2672
2673
2674 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2675 }
2676
2677
2678
2679
2680
2681
2682
2683
2684 static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma)
2685 {
2686 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2687 hsmartcard->TxXferCount = 0U;
2688
2689
2690
2691 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAT);
2692
2693
2694 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
2695 }
2696
2697
2698
2699
2700
2701
2702
2703 static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
2704 {
2705 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2706 hsmartcard->RxXferCount = 0U;
2707
2708
2709 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
2710 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
2711
2712
2713
2714 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_DMAR);
2715
2716
2717 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2718
2719 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2720
2721 hsmartcard->RxCpltCallback(hsmartcard);
2722 #else
2723
2724 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
2725 #endif
2726 }
2727
2728
2729
2730
2731
2732
2733
2734 static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma)
2735 {
2736 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2737
2738
2739 if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
2740 {
2741 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAT))
2742 {
2743 hsmartcard->TxXferCount = 0U;
2744 SMARTCARD_EndTxTransfer(hsmartcard);
2745 }
2746 }
2747
2748
2749 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
2750 {
2751 if (HAL_IS_BIT_SET(hsmartcard->Instance->CR3, USART_CR3_DMAR))
2752 {
2753 hsmartcard->RxXferCount = 0U;
2754 SMARTCARD_EndRxTransfer(hsmartcard);
2755 }
2756 }
2757
2758 hsmartcard->ErrorCode |= HAL_SMARTCARD_ERROR_DMA;
2759 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2760
2761 hsmartcard->ErrorCallback(hsmartcard);
2762 #else
2763
2764 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2765 #endif
2766 }
2767
2768
2769
2770
2771
2772
2773
2774 static void SMARTCARD_DMAAbortOnError(DMA_HandleTypeDef *hdma)
2775 {
2776 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2777 hsmartcard->RxXferCount = 0U;
2778 hsmartcard->TxXferCount = 0U;
2779
2780 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2781
2782 hsmartcard->ErrorCallback(hsmartcard);
2783 #else
2784
2785 HAL_SMARTCARD_ErrorCallback(hsmartcard);
2786 #endif
2787 }
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797 static void SMARTCARD_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
2798 {
2799 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2800
2801 hsmartcard->hdmatx->XferAbortCallback = NULL;
2802
2803
2804 if (hsmartcard->hdmarx != NULL)
2805 {
2806 if (hsmartcard->hdmarx->XferAbortCallback != NULL)
2807 {
2808 return;
2809 }
2810 }
2811
2812
2813 hsmartcard->TxXferCount = 0U;
2814 hsmartcard->RxXferCount = 0U;
2815
2816
2817 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2818
2819
2820 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
2821 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF |
2822 SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
2823
2824
2825 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2826 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2827
2828 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2829
2830 hsmartcard->AbortCpltCallback(hsmartcard);
2831 #else
2832
2833 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
2834 #endif
2835 }
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846 static void SMARTCARD_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
2847 {
2848 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2849
2850 hsmartcard->hdmarx->XferAbortCallback = NULL;
2851
2852
2853 if (hsmartcard->hdmatx != NULL)
2854 {
2855 if (hsmartcard->hdmatx->XferAbortCallback != NULL)
2856 {
2857 return;
2858 }
2859 }
2860
2861
2862 hsmartcard->TxXferCount = 0U;
2863 hsmartcard->RxXferCount = 0U;
2864
2865
2866 hsmartcard->ErrorCode = HAL_SMARTCARD_ERROR_NONE;
2867
2868
2869 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
2870 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF |
2871 SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
2872
2873
2874 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2875 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2876
2877 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2878
2879 hsmartcard->AbortCpltCallback(hsmartcard);
2880 #else
2881
2882 HAL_SMARTCARD_AbortCpltCallback(hsmartcard);
2883 #endif
2884 }
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895 static void SMARTCARD_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2896 {
2897 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2898
2899 hsmartcard->TxXferCount = 0U;
2900
2901
2902 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard, SMARTCARD_CLEAR_FEF);
2903
2904
2905 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
2906
2907 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2908
2909 hsmartcard->AbortTransmitCpltCallback(hsmartcard);
2910 #else
2911
2912 HAL_SMARTCARD_AbortTransmitCpltCallback(hsmartcard);
2913 #endif
2914 }
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924 static void SMARTCARD_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)
2925 {
2926 SMARTCARD_HandleTypeDef *hsmartcard = (SMARTCARD_HandleTypeDef *)(hdma->Parent);
2927
2928 hsmartcard->RxXferCount = 0U;
2929
2930
2931 __HAL_SMARTCARD_CLEAR_FLAG(hsmartcard,
2932 SMARTCARD_CLEAR_OREF | SMARTCARD_CLEAR_NEF | SMARTCARD_CLEAR_PEF | SMARTCARD_CLEAR_FEF |
2933 SMARTCARD_CLEAR_RTOF | SMARTCARD_CLEAR_EOBF);
2934
2935
2936 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
2937
2938 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
2939
2940 hsmartcard->AbortReceiveCpltCallback(hsmartcard);
2941 #else
2942
2943 HAL_SMARTCARD_AbortReceiveCpltCallback(hsmartcard);
2944 #endif
2945 }
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956 static void SMARTCARD_TxISR(SMARTCARD_HandleTypeDef *hsmartcard)
2957 {
2958
2959 if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
2960 {
2961 if (hsmartcard->TxXferCount == 0U)
2962 {
2963
2964 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
2965
2966
2967 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
2968 }
2969 else
2970 {
2971 hsmartcard->Instance->TDR = (uint8_t)(*hsmartcard->pTxBuffPtr & 0xFFU);
2972 hsmartcard->pTxBuffPtr++;
2973 hsmartcard->TxXferCount--;
2974 }
2975 }
2976 }
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987 static void SMARTCARD_TxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard)
2988 {
2989 uint16_t nb_tx_data;
2990
2991
2992 if (hsmartcard->gState == HAL_SMARTCARD_STATE_BUSY_TX)
2993 {
2994 for (nb_tx_data = hsmartcard->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
2995 {
2996 if (hsmartcard->TxXferCount == 0U)
2997 {
2998
2999 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
3000
3001
3002 __HAL_SMARTCARD_ENABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
3003 }
3004 else if (READ_BIT(hsmartcard->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)
3005 {
3006 hsmartcard->Instance->TDR = (uint8_t)(*hsmartcard->pTxBuffPtr & 0xFFU);
3007 hsmartcard->pTxBuffPtr++;
3008 hsmartcard->TxXferCount--;
3009 }
3010 else
3011 {
3012
3013 }
3014 }
3015 }
3016 }
3017
3018
3019
3020
3021
3022
3023
3024 static void SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard)
3025 {
3026
3027 __HAL_SMARTCARD_DISABLE_IT(hsmartcard, hsmartcard->AdvancedInit.TxCompletionIndication);
3028
3029
3030 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_READY)
3031 {
3032
3033 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
3034 }
3035
3036
3037 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
3038 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX)
3039 && (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
3040 {
3041
3042
3043 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RE);
3044 }
3045 if ((hsmartcard->Init.Mode == SMARTCARD_MODE_TX_RX)
3046 || (hsmartcard->Init.NACKEnable == SMARTCARD_NACK_ENABLE))
3047 {
3048
3049 __HAL_SMARTCARD_FLUSH_DRREGISTER(hsmartcard);
3050 }
3051 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_UE);
3052
3053
3054 hsmartcard->gState = HAL_SMARTCARD_STATE_READY;
3055
3056
3057 hsmartcard->TxISR = NULL;
3058
3059 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
3060
3061 hsmartcard->TxCpltCallback(hsmartcard);
3062 #else
3063
3064 HAL_SMARTCARD_TxCpltCallback(hsmartcard);
3065 #endif
3066 }
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077 static void SMARTCARD_RxISR(SMARTCARD_HandleTypeDef *hsmartcard)
3078 {
3079
3080 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
3081 {
3082 *hsmartcard->pRxBuffPtr = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF);
3083 hsmartcard->pRxBuffPtr++;
3084
3085 hsmartcard->RxXferCount--;
3086 if (hsmartcard->RxXferCount == 0U)
3087 {
3088 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3089
3090
3091 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
3092 {
3093
3094 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
3095 }
3096
3097
3098 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
3099
3100 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
3101
3102
3103 hsmartcard->RxISR = NULL;
3104
3105 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
3106
3107 hsmartcard->RxCpltCallback(hsmartcard);
3108 #else
3109
3110 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
3111 #endif
3112 }
3113 }
3114 else
3115 {
3116
3117 __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST);
3118 }
3119 }
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130 static void SMARTCARD_RxISR_FIFOEN(SMARTCARD_HandleTypeDef *hsmartcard)
3131 {
3132 uint16_t nb_rx_data;
3133 uint16_t rxdatacount;
3134
3135
3136 if (hsmartcard->RxState == HAL_SMARTCARD_STATE_BUSY_RX)
3137 {
3138 for (nb_rx_data = hsmartcard->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
3139 {
3140 *hsmartcard->pRxBuffPtr = (uint8_t)(hsmartcard->Instance->RDR & (uint8_t)0xFF);
3141 hsmartcard->pRxBuffPtr++;
3142
3143 hsmartcard->RxXferCount--;
3144 if (hsmartcard->RxXferCount == 0U)
3145 {
3146 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3147
3148
3149 if (hsmartcard->gState == HAL_SMARTCARD_STATE_READY)
3150 {
3151
3152 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_EIE);
3153 }
3154
3155
3156 CLEAR_BIT(hsmartcard->Instance->CR1, USART_CR1_PEIE);
3157
3158 hsmartcard->RxState = HAL_SMARTCARD_STATE_READY;
3159
3160
3161 hsmartcard->RxISR = NULL;
3162
3163 #if (USE_HAL_SMARTCARD_REGISTER_CALLBACKS == 1)
3164
3165 hsmartcard->RxCpltCallback(hsmartcard);
3166 #else
3167
3168 HAL_SMARTCARD_RxCpltCallback(hsmartcard);
3169 #endif
3170 }
3171 }
3172
3173
3174
3175
3176
3177 rxdatacount = hsmartcard->RxXferCount;
3178 if (((rxdatacount != 0U)) && (rxdatacount < hsmartcard->NbRxDataToProcess))
3179 {
3180
3181 CLEAR_BIT(hsmartcard->Instance->CR3, USART_CR3_RXFTIE);
3182
3183
3184 hsmartcard->RxISR = SMARTCARD_RxISR;
3185
3186
3187 SET_BIT(hsmartcard->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3188 }
3189 }
3190 else
3191 {
3192
3193 __HAL_SMARTCARD_SEND_REQ(hsmartcard, SMARTCARD_RXDATA_FLUSH_REQUEST);
3194 }
3195 }
3196
3197
3198
3199
3200
3201 #endif
3202
3203
3204
3205
3206
3207
3208
3209