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 #include "stm32h7xx_hal.h"
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147 #ifdef HAL_SPI_MODULE_ENABLED
0148
0149
0150
0151
0152
0153
0154
0155 #define SPI_DEFAULT_TIMEOUT 100UL
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);
0168 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
0169 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);
0170 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma);
0171 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma);
0172 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma);
0173 static void SPI_DMAError(DMA_HandleTypeDef *hdma);
0174 static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma);
0175 static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
0176 static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
0177 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(const SPI_HandleTypeDef *hspi, uint32_t Flag,
0178 FlagStatus FlagStatus, uint32_t Timeout, uint32_t Tickstart);
0179 static void SPI_TxISR_8BIT(SPI_HandleTypeDef *hspi);
0180 static void SPI_TxISR_16BIT(SPI_HandleTypeDef *hspi);
0181 static void SPI_TxISR_32BIT(SPI_HandleTypeDef *hspi);
0182 static void SPI_RxISR_8BIT(SPI_HandleTypeDef *hspi);
0183 static void SPI_RxISR_16BIT(SPI_HandleTypeDef *hspi);
0184 static void SPI_RxISR_32BIT(SPI_HandleTypeDef *hspi);
0185 static void SPI_AbortTransfer(SPI_HandleTypeDef *hspi);
0186 static void SPI_CloseTransfer(SPI_HandleTypeDef *hspi);
0187 static uint32_t SPI_GetPacketSize(const SPI_HandleTypeDef *hspi);
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244 HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
0245 {
0246 uint32_t crc_length;
0247 uint32_t packet_length;
0248 #if (USE_SPI_CRC != 0UL)
0249 uint32_t crc_poly_msb_mask;
0250 #endif
0251
0252
0253 if (hspi == NULL)
0254 {
0255 return HAL_ERROR;
0256 }
0257
0258
0259 assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
0260 assert_param(IS_SPI_MODE(hspi->Init.Mode));
0261 assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));
0262 assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));
0263 assert_param(IS_SPI_FIFOTHRESHOLD(hspi->Init.FifoThreshold));
0264 assert_param(IS_SPI_NSS(hspi->Init.NSS));
0265 assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));
0266 assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
0267 assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));
0268 assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
0269 if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)
0270 {
0271 assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
0272 assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
0273 }
0274 #if (USE_SPI_CRC != 0UL)
0275 assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
0276 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
0277 {
0278 assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength));
0279 assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));
0280 assert_param(IS_SPI_CRC_INITIALIZATION_PATTERN(hspi->Init.TxCRCInitializationPattern));
0281 assert_param(IS_SPI_CRC_INITIALIZATION_PATTERN(hspi->Init.RxCRCInitializationPattern));
0282 }
0283 #else
0284 hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
0285 #endif
0286
0287
0288 if ((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (hspi->Init.DataSize > SPI_DATASIZE_16BIT))
0289 {
0290 return HAL_ERROR;
0291 }
0292
0293
0294 packet_length = SPI_GetPacketSize(hspi);
0295 if (((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (packet_length > SPI_LOWEND_FIFO_SIZE)) ||
0296 ((IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (packet_length > SPI_HIGHEND_FIFO_SIZE)))
0297 {
0298 return HAL_ERROR;
0299 }
0300
0301 #if (USE_SPI_CRC != 0UL)
0302 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
0303 {
0304
0305 if ((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (hspi->Init.CRCLength > SPI_CRC_LENGTH_16BIT))
0306 {
0307 return HAL_ERROR;
0308 }
0309
0310
0311 if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)
0312 {
0313 crc_length = (hspi->Init.DataSize >> SPI_CFG1_DSIZE_Pos) << SPI_CFG1_CRCSIZE_Pos;
0314 }
0315 else
0316 {
0317 crc_length = hspi->Init.CRCLength;
0318 }
0319
0320
0321 assert_param(IS_SPI_CRC_POLYNOMIAL_SIZE(hspi->Init.CRCPolynomial, crc_length));
0322
0323
0324 if ((hspi->Init.DataSize >> SPI_CFG1_DSIZE_Pos) > (crc_length >> SPI_CFG1_CRCSIZE_Pos))
0325 {
0326 return HAL_ERROR;
0327 }
0328 }
0329 else
0330 {
0331 crc_length = hspi->Init.DataSize << SPI_CFG1_CRCSIZE_Pos;
0332 }
0333 #endif
0334
0335 if (hspi->State == HAL_SPI_STATE_RESET)
0336 {
0337
0338 hspi->Lock = HAL_UNLOCKED;
0339
0340 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
0341
0342 hspi->TxCpltCallback = HAL_SPI_TxCpltCallback;
0343 hspi->RxCpltCallback = HAL_SPI_RxCpltCallback;
0344 hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback;
0345 hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback;
0346 hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback;
0347 hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback;
0348 hspi->ErrorCallback = HAL_SPI_ErrorCallback;
0349 hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback;
0350 hspi->SuspendCallback = HAL_SPI_SuspendCallback;
0351
0352 if (hspi->MspInitCallback == NULL)
0353 {
0354 hspi->MspInitCallback = HAL_SPI_MspInit;
0355 }
0356
0357
0358 hspi->MspInitCallback(hspi);
0359 #else
0360
0361 HAL_SPI_MspInit(hspi);
0362 #endif
0363 }
0364
0365 hspi->State = HAL_SPI_STATE_BUSY;
0366
0367
0368 __HAL_SPI_DISABLE(hspi);
0369
0370 #if (USE_SPI_CRC == 0)
0371
0372 crc_length = hspi->Instance->CFG1 & SPI_CFG1_CRCSIZE;
0373 #endif
0374
0375
0376
0377
0378
0379
0380 if ((hspi->Init.NSS == SPI_NSS_SOFT) && (((hspi->Init.Mode == SPI_MODE_MASTER) && \
0381 (hspi->Init.NSSPolarity == SPI_NSS_POLARITY_LOW)) || \
0382 ((hspi->Init.Mode == SPI_MODE_SLAVE) && \
0383 (hspi->Init.NSSPolarity == SPI_NSS_POLARITY_HIGH))))
0384 {
0385 SET_BIT(hspi->Instance->CR1, SPI_CR1_SSI);
0386 }
0387
0388
0389 if (((hspi->Init.Mode & SPI_MODE_MASTER) == SPI_MODE_MASTER) && (hspi->Init.DataSize >= SPI_DATASIZE_8BIT))
0390 {
0391 MODIFY_REG(hspi->Instance->CR1, SPI_CR1_MASRX, hspi->Init.MasterReceiverAutoSusp);
0392 }
0393 else
0394 {
0395 CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_MASRX);
0396 }
0397
0398
0399 WRITE_REG(hspi->Instance->CFG1, (hspi->Init.BaudRatePrescaler | hspi->Init.CRCCalculation | crc_length |
0400 hspi->Init.FifoThreshold | hspi->Init.DataSize));
0401
0402
0403 WRITE_REG(hspi->Instance->CFG2, (hspi->Init.NSSPMode | hspi->Init.TIMode |
0404 hspi->Init.NSSPolarity | hspi->Init.NSS |
0405 hspi->Init.CLKPolarity | hspi->Init.CLKPhase |
0406 hspi->Init.FirstBit | hspi->Init.Mode |
0407 hspi->Init.MasterInterDataIdleness | hspi->Init.Direction |
0408 hspi->Init.MasterSSIdleness | hspi->Init.IOSwap));
0409
0410 #if (USE_SPI_CRC != 0UL)
0411
0412
0413 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
0414 {
0415
0416 if (hspi->Init.TxCRCInitializationPattern == SPI_CRC_INITIALIZATION_ALL_ONE_PATTERN)
0417 {
0418 SET_BIT(hspi->Instance->CR1, SPI_CR1_TCRCINI);
0419 }
0420 else
0421 {
0422 CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_TCRCINI);
0423 }
0424
0425
0426 if (hspi->Init.RxCRCInitializationPattern == SPI_CRC_INITIALIZATION_ALL_ONE_PATTERN)
0427 {
0428 SET_BIT(hspi->Instance->CR1, SPI_CR1_RCRCINI);
0429 }
0430 else
0431 {
0432 CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_RCRCINI);
0433 }
0434
0435
0436 if (((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (crc_length == SPI_CRC_LENGTH_16BIT)) ||
0437 ((IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (crc_length == SPI_CRC_LENGTH_32BIT)))
0438 {
0439
0440 SET_BIT(hspi->Instance->CR1, SPI_CR1_CRC33_17);
0441
0442 WRITE_REG(hspi->Instance->CRCPOLY, hspi->Init.CRCPolynomial);
0443 }
0444 else
0445 {
0446
0447 CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_CRC33_17);
0448
0449
0450
0451 crc_poly_msb_mask = (0x1UL << ((crc_length >> SPI_CFG1_CRCSIZE_Pos) + 0x1U));
0452 WRITE_REG(hspi->Instance->CRCPOLY, (hspi->Init.CRCPolynomial) | crc_poly_msb_mask);
0453 }
0454 }
0455 #endif
0456
0457
0458 if (hspi->Init.Mode == SPI_MODE_SLAVE)
0459 {
0460
0461 #if (USE_SPI_CRC != 0UL)
0462 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_DISABLE)
0463 #endif
0464 {
0465 MODIFY_REG(hspi->Instance->CFG1, SPI_CFG1_UDRDET, SPI_CFG1_UDRDET_0);
0466 }
0467 MODIFY_REG(hspi->Instance->CFG1, SPI_CFG1_UDRCFG, SPI_CFG1_UDRCFG_1);
0468 }
0469
0470 #if defined(SPI_I2SCFGR_I2SMOD)
0471
0472 CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD);
0473 #endif
0474
0475
0476 if ((hspi->Init.Mode & SPI_MODE_MASTER) == SPI_MODE_MASTER)
0477 {
0478
0479 MODIFY_REG(hspi->Instance->CFG2, SPI_CFG2_AFCNTR, (hspi->Init.MasterKeepIOState));
0480 }
0481
0482 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
0483 hspi->State = HAL_SPI_STATE_READY;
0484
0485 return HAL_OK;
0486 }
0487
0488
0489
0490
0491
0492
0493
0494 HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)
0495 {
0496
0497 if (hspi == NULL)
0498 {
0499 return HAL_ERROR;
0500 }
0501
0502
0503 assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));
0504
0505 hspi->State = HAL_SPI_STATE_BUSY;
0506
0507
0508 __HAL_SPI_DISABLE(hspi);
0509
0510 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
0511 if (hspi->MspDeInitCallback == NULL)
0512 {
0513 hspi->MspDeInitCallback = HAL_SPI_MspDeInit;
0514 }
0515
0516
0517 hspi->MspDeInitCallback(hspi);
0518 #else
0519
0520 HAL_SPI_MspDeInit(hspi);
0521 #endif
0522
0523 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
0524 hspi->State = HAL_SPI_STATE_RESET;
0525
0526
0527 __HAL_UNLOCK(hspi);
0528
0529 return HAL_OK;
0530 }
0531
0532 #ifndef __rtems__
0533
0534
0535
0536
0537
0538
0539 __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
0540 {
0541
0542 UNUSED(hspi);
0543
0544
0545
0546
0547 }
0548 #endif
0549
0550
0551
0552
0553
0554
0555
0556 __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
0557 {
0558
0559 UNUSED(hspi);
0560
0561
0562
0563
0564 }
0565
0566 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578 HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID,
0579 pSPI_CallbackTypeDef pCallback)
0580 {
0581 HAL_StatusTypeDef status = HAL_OK;
0582
0583 if (pCallback == NULL)
0584 {
0585
0586 hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK;
0587
0588 return HAL_ERROR;
0589 }
0590
0591 if (HAL_SPI_STATE_READY == hspi->State)
0592 {
0593 switch (CallbackID)
0594 {
0595 case HAL_SPI_TX_COMPLETE_CB_ID :
0596 hspi->TxCpltCallback = pCallback;
0597 break;
0598
0599 case HAL_SPI_RX_COMPLETE_CB_ID :
0600 hspi->RxCpltCallback = pCallback;
0601 break;
0602
0603 case HAL_SPI_TX_RX_COMPLETE_CB_ID :
0604 hspi->TxRxCpltCallback = pCallback;
0605 break;
0606
0607 case HAL_SPI_TX_HALF_COMPLETE_CB_ID :
0608 hspi->TxHalfCpltCallback = pCallback;
0609 break;
0610
0611 case HAL_SPI_RX_HALF_COMPLETE_CB_ID :
0612 hspi->RxHalfCpltCallback = pCallback;
0613 break;
0614
0615 case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :
0616 hspi->TxRxHalfCpltCallback = pCallback;
0617 break;
0618
0619 case HAL_SPI_ERROR_CB_ID :
0620 hspi->ErrorCallback = pCallback;
0621 break;
0622
0623 case HAL_SPI_ABORT_CB_ID :
0624 hspi->AbortCpltCallback = pCallback;
0625 break;
0626
0627 case HAL_SPI_SUSPEND_CB_ID :
0628 hspi->SuspendCallback = pCallback;
0629 break;
0630
0631 case HAL_SPI_MSPINIT_CB_ID :
0632 hspi->MspInitCallback = pCallback;
0633 break;
0634
0635 case HAL_SPI_MSPDEINIT_CB_ID :
0636 hspi->MspDeInitCallback = pCallback;
0637 break;
0638
0639 default :
0640
0641 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0642
0643
0644 status = HAL_ERROR;
0645 break;
0646 }
0647 }
0648 else if (HAL_SPI_STATE_RESET == hspi->State)
0649 {
0650 switch (CallbackID)
0651 {
0652 case HAL_SPI_MSPINIT_CB_ID :
0653 hspi->MspInitCallback = pCallback;
0654 break;
0655
0656 case HAL_SPI_MSPDEINIT_CB_ID :
0657 hspi->MspDeInitCallback = pCallback;
0658 break;
0659
0660 default :
0661
0662 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0663
0664
0665 status = HAL_ERROR;
0666 break;
0667 }
0668 }
0669 else
0670 {
0671
0672 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0673
0674
0675 status = HAL_ERROR;
0676 }
0677
0678 return status;
0679 }
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691 HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID)
0692 {
0693 HAL_StatusTypeDef status = HAL_OK;
0694
0695 if (HAL_SPI_STATE_READY == hspi->State)
0696 {
0697 switch (CallbackID)
0698 {
0699 case HAL_SPI_TX_COMPLETE_CB_ID :
0700 hspi->TxCpltCallback = HAL_SPI_TxCpltCallback;
0701 break;
0702
0703 case HAL_SPI_RX_COMPLETE_CB_ID :
0704 hspi->RxCpltCallback = HAL_SPI_RxCpltCallback;
0705 break;
0706
0707 case HAL_SPI_TX_RX_COMPLETE_CB_ID :
0708 hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback;
0709 break;
0710
0711 case HAL_SPI_TX_HALF_COMPLETE_CB_ID :
0712 hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback;
0713 break;
0714
0715 case HAL_SPI_RX_HALF_COMPLETE_CB_ID :
0716 hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback;
0717 break;
0718
0719 case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :
0720 hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback;
0721 break;
0722
0723 case HAL_SPI_ERROR_CB_ID :
0724 hspi->ErrorCallback = HAL_SPI_ErrorCallback;
0725 break;
0726
0727 case HAL_SPI_ABORT_CB_ID :
0728 hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback;
0729 break;
0730
0731 case HAL_SPI_SUSPEND_CB_ID :
0732 hspi->SuspendCallback = HAL_SPI_SuspendCallback;
0733 break;
0734
0735 case HAL_SPI_MSPINIT_CB_ID :
0736 hspi->MspInitCallback = HAL_SPI_MspInit;
0737 break;
0738
0739 case HAL_SPI_MSPDEINIT_CB_ID :
0740 hspi->MspDeInitCallback = HAL_SPI_MspDeInit;
0741 break;
0742
0743 default :
0744
0745 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0746
0747
0748 status = HAL_ERROR;
0749 break;
0750 }
0751 }
0752 else if (HAL_SPI_STATE_RESET == hspi->State)
0753 {
0754 switch (CallbackID)
0755 {
0756 case HAL_SPI_MSPINIT_CB_ID :
0757 hspi->MspInitCallback = HAL_SPI_MspInit;
0758 break;
0759
0760 case HAL_SPI_MSPDEINIT_CB_ID :
0761 hspi->MspDeInitCallback = HAL_SPI_MspDeInit;
0762 break;
0763
0764 default :
0765
0766 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0767
0768
0769 status = HAL_ERROR;
0770 break;
0771 }
0772 }
0773 else
0774 {
0775
0776 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);
0777
0778
0779 status = HAL_ERROR;
0780 }
0781
0782 return status;
0783 }
0784 #endif
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
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832 HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
0833 {
0834 #if defined (__GNUC__)
0835 __IO uint16_t *ptxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->TXDR));
0836 #endif
0837
0838 uint32_t tickstart;
0839
0840
0841 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_TXONLY(hspi->Init.Direction));
0842
0843
0844 tickstart = HAL_GetTick();
0845
0846 if (hspi->State != HAL_SPI_STATE_READY)
0847 {
0848 return HAL_BUSY;
0849 }
0850
0851 if ((pData == NULL) || (Size == 0UL))
0852 {
0853 return HAL_ERROR;
0854 }
0855
0856
0857 __HAL_LOCK(hspi);
0858
0859
0860 hspi->State = HAL_SPI_STATE_BUSY_TX;
0861 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
0862 hspi->pTxBuffPtr = (const uint8_t *)pData;
0863 hspi->TxXferSize = Size;
0864 hspi->TxXferCount = Size;
0865
0866
0867 hspi->pRxBuffPtr = NULL;
0868 hspi->RxXferSize = (uint16_t) 0UL;
0869 hspi->RxXferCount = (uint16_t) 0UL;
0870 hspi->TxISR = NULL;
0871 hspi->RxISR = NULL;
0872
0873
0874 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
0875 {
0876 SPI_1LINE_TX(hspi);
0877 }
0878 else
0879 {
0880 SPI_2LINES_TX(hspi);
0881 }
0882
0883
0884 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
0885
0886
0887 __HAL_SPI_ENABLE(hspi);
0888
0889 if (hspi->Init.Mode == SPI_MODE_MASTER)
0890 {
0891
0892 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
0893 }
0894
0895
0896 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
0897 {
0898
0899 while (hspi->TxXferCount > 0UL)
0900 {
0901
0902 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP))
0903 {
0904 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
0905 hspi->pTxBuffPtr += sizeof(uint32_t);
0906 hspi->TxXferCount--;
0907 }
0908 else
0909 {
0910
0911 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
0912 {
0913
0914 SPI_CloseTransfer(hspi);
0915
0916 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
0917 hspi->State = HAL_SPI_STATE_READY;
0918
0919
0920 __HAL_UNLOCK(hspi);
0921
0922 return HAL_TIMEOUT;
0923 }
0924 }
0925 }
0926 }
0927
0928 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
0929 {
0930
0931 while (hspi->TxXferCount > 0UL)
0932 {
0933
0934 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP))
0935 {
0936 if ((hspi->TxXferCount > 1UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_01DATA))
0937 {
0938 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
0939 hspi->pTxBuffPtr += sizeof(uint32_t);
0940 hspi->TxXferCount -= (uint16_t)2UL;
0941 }
0942 else
0943 {
0944 #if defined (__GNUC__)
0945 *ptxdr_16bits = *((const uint16_t *)hspi->pTxBuffPtr);
0946 #else
0947 *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
0948 #endif
0949 hspi->pTxBuffPtr += sizeof(uint16_t);
0950 hspi->TxXferCount--;
0951 }
0952 }
0953 else
0954 {
0955
0956 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
0957 {
0958
0959 SPI_CloseTransfer(hspi);
0960
0961 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
0962 hspi->State = HAL_SPI_STATE_READY;
0963
0964
0965 __HAL_UNLOCK(hspi);
0966
0967 return HAL_TIMEOUT;
0968 }
0969 }
0970 }
0971 }
0972
0973 else
0974 {
0975 while (hspi->TxXferCount > 0UL)
0976 {
0977
0978 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP))
0979 {
0980 if ((hspi->TxXferCount > 3UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_03DATA))
0981 {
0982 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
0983 hspi->pTxBuffPtr += sizeof(uint32_t);
0984 hspi->TxXferCount -= (uint16_t)4UL;
0985 }
0986 else if ((hspi->TxXferCount > 1UL) && (hspi->Init.FifoThreshold > SPI_FIFO_THRESHOLD_01DATA))
0987 {
0988 #if defined (__GNUC__)
0989 *ptxdr_16bits = *((const uint16_t *)hspi->pTxBuffPtr);
0990 #else
0991 *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
0992 #endif
0993 hspi->pTxBuffPtr += sizeof(uint16_t);
0994 hspi->TxXferCount -= (uint16_t)2UL;
0995 }
0996 else
0997 {
0998 *((__IO uint8_t *)&hspi->Instance->TXDR) = *((const uint8_t *)hspi->pTxBuffPtr);
0999 hspi->pTxBuffPtr += sizeof(uint8_t);
1000 hspi->TxXferCount--;
1001 }
1002 }
1003 else
1004 {
1005
1006 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1007 {
1008
1009 SPI_CloseTransfer(hspi);
1010
1011 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1012 hspi->State = HAL_SPI_STATE_READY;
1013
1014
1015 __HAL_UNLOCK(hspi);
1016
1017 return HAL_TIMEOUT;
1018 }
1019 }
1020 }
1021 }
1022
1023
1024 if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_EOT, RESET, Timeout, tickstart) != HAL_OK)
1025 {
1026 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
1027 }
1028
1029
1030 SPI_CloseTransfer(hspi);
1031
1032 hspi->State = HAL_SPI_STATE_READY;
1033
1034
1035 __HAL_UNLOCK(hspi);
1036
1037 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
1038 {
1039 return HAL_ERROR;
1040 }
1041 else
1042 {
1043 return HAL_OK;
1044 }
1045 }
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056 HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
1057 {
1058 uint32_t tickstart;
1059 uint32_t temp_sr_reg;
1060 uint16_t init_max_data_in_fifo;
1061 init_max_data_in_fifo = (((uint16_t)(hspi->Init.FifoThreshold >> 5U) + 1U));
1062 #if defined (__GNUC__)
1063 __IO uint16_t *prxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->RXDR));
1064 #endif
1065
1066
1067 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_RXONLY(hspi->Init.Direction));
1068
1069
1070 tickstart = HAL_GetTick();
1071
1072 if (hspi->State != HAL_SPI_STATE_READY)
1073 {
1074 return HAL_BUSY;
1075 }
1076
1077 if ((pData == NULL) || (Size == 0UL))
1078 {
1079 return HAL_ERROR;
1080 }
1081
1082
1083 __HAL_LOCK(hspi);
1084
1085
1086 hspi->State = HAL_SPI_STATE_BUSY_RX;
1087 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1088 hspi->pRxBuffPtr = (uint8_t *)pData;
1089 hspi->RxXferSize = Size;
1090 hspi->RxXferCount = Size;
1091
1092
1093 hspi->pTxBuffPtr = NULL;
1094 hspi->TxXferSize = (uint16_t) 0UL;
1095 hspi->TxXferCount = (uint16_t) 0UL;
1096 hspi->RxISR = NULL;
1097 hspi->TxISR = NULL;
1098
1099
1100 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1101 {
1102 SPI_1LINE_RX(hspi);
1103 }
1104 else
1105 {
1106 SPI_2LINES_RX(hspi);
1107 }
1108
1109
1110 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
1111
1112
1113 __HAL_SPI_ENABLE(hspi);
1114
1115 if (hspi->Init.Mode == SPI_MODE_MASTER)
1116 {
1117
1118 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
1119 }
1120
1121
1122 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1123 {
1124
1125 while (hspi->RxXferCount > 0UL)
1126 {
1127
1128 temp_sr_reg = hspi->Instance->SR;
1129
1130
1131 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1132 {
1133 *((uint32_t *)hspi->pRxBuffPtr) = *((__IO uint32_t *)&hspi->Instance->RXDR);
1134 hspi->pRxBuffPtr += sizeof(uint32_t);
1135 hspi->RxXferCount--;
1136 }
1137
1138 else if ((hspi->RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1139 {
1140 *((uint32_t *)hspi->pRxBuffPtr) = *((__IO uint32_t *)&hspi->Instance->RXDR);
1141 hspi->pRxBuffPtr += sizeof(uint32_t);
1142 hspi->RxXferCount--;
1143 }
1144 else
1145 {
1146
1147 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1148 {
1149
1150 SPI_CloseTransfer(hspi);
1151
1152 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1153 hspi->State = HAL_SPI_STATE_READY;
1154
1155
1156 __HAL_UNLOCK(hspi);
1157
1158 return HAL_TIMEOUT;
1159 }
1160 }
1161 }
1162 }
1163
1164 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1165 {
1166
1167 while (hspi->RxXferCount > 0UL)
1168 {
1169
1170 temp_sr_reg = hspi->Instance->SR;
1171
1172
1173 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1174 {
1175 #if defined (__GNUC__)
1176 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1177 #else
1178 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1179 #endif
1180 hspi->pRxBuffPtr += sizeof(uint16_t);
1181 hspi->RxXferCount--;
1182 }
1183
1184 else if ((hspi->RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1185 {
1186 #if defined (__GNUC__)
1187 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1188 #else
1189 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1190 #endif
1191 hspi->pRxBuffPtr += sizeof(uint16_t);
1192 #if defined (__GNUC__)
1193 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1194 #else
1195 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1196 #endif
1197 hspi->pRxBuffPtr += sizeof(uint16_t);
1198 hspi->RxXferCount -= (uint16_t)2UL;
1199 }
1200
1201 else if ((hspi->RxXferCount == 1UL) && ((temp_sr_reg & SPI_SR_RXPLVL_0) != 0UL))
1202 {
1203 #if defined (__GNUC__)
1204 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1205 #else
1206 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1207 #endif
1208 hspi->pRxBuffPtr += sizeof(uint16_t);
1209 hspi->RxXferCount--;
1210 }
1211 else
1212 {
1213
1214 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1215 {
1216
1217 SPI_CloseTransfer(hspi);
1218
1219 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1220 hspi->State = HAL_SPI_STATE_READY;
1221
1222
1223 __HAL_UNLOCK(hspi);
1224
1225 return HAL_TIMEOUT;
1226 }
1227 }
1228 }
1229 }
1230
1231 else
1232 {
1233
1234 while (hspi->RxXferCount > 0UL)
1235 {
1236
1237 temp_sr_reg = hspi->Instance->SR;
1238
1239
1240 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1241 {
1242 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1243 hspi->pRxBuffPtr += sizeof(uint8_t);
1244 hspi->RxXferCount--;
1245 }
1246
1247 else if ((hspi->RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1248 {
1249 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1250 hspi->pRxBuffPtr += sizeof(uint8_t);
1251 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1252 hspi->pRxBuffPtr += sizeof(uint8_t);
1253 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1254 hspi->pRxBuffPtr += sizeof(uint8_t);
1255 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1256 hspi->pRxBuffPtr += sizeof(uint8_t);
1257 hspi->RxXferCount -= (uint16_t)4UL;
1258 }
1259
1260 else if ((hspi->RxXferCount < 4UL) && ((temp_sr_reg & SPI_SR_RXPLVL_Msk) != 0UL))
1261 {
1262 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1263 hspi->pRxBuffPtr += sizeof(uint8_t);
1264 hspi->RxXferCount--;
1265 }
1266 else
1267 {
1268
1269 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1270 {
1271
1272 SPI_CloseTransfer(hspi);
1273
1274 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1275 hspi->State = HAL_SPI_STATE_READY;
1276
1277
1278 __HAL_UNLOCK(hspi);
1279
1280 return HAL_TIMEOUT;
1281 }
1282 }
1283 }
1284 }
1285
1286 #if (USE_SPI_CRC != 0UL)
1287 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
1288 {
1289
1290 if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_EOT, RESET, Timeout, tickstart) != HAL_OK)
1291 {
1292 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
1293 }
1294 }
1295 #endif
1296
1297
1298 SPI_CloseTransfer(hspi);
1299
1300 hspi->State = HAL_SPI_STATE_READY;
1301
1302
1303 __HAL_UNLOCK(hspi);
1304
1305
1306 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
1307 {
1308 return HAL_ERROR;
1309 }
1310 else
1311 {
1312 return HAL_OK;
1313 }
1314 }
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326 HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData,
1327 uint16_t Size, uint32_t Timeout)
1328 {
1329 #if defined (__GNUC__)
1330 __IO uint16_t *ptxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->TXDR));
1331 __IO uint16_t *prxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->RXDR));
1332 #endif
1333
1334 uint32_t tickstart;
1335 uint32_t fifo_length;
1336 uint32_t temp_sr_reg;
1337 uint16_t initial_TxXferCount;
1338 uint16_t initial_RxXferCount;
1339 uint16_t init_max_data_in_fifo;
1340 init_max_data_in_fifo = (((uint16_t)(hspi->Init.FifoThreshold >> 5U) + 1U));
1341
1342
1343 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1344
1345
1346 tickstart = HAL_GetTick();
1347
1348 initial_TxXferCount = Size;
1349 initial_RxXferCount = Size;
1350
1351 if (hspi->State != HAL_SPI_STATE_READY)
1352 {
1353 return HAL_BUSY;
1354 }
1355
1356 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0UL))
1357 {
1358 return HAL_ERROR;
1359 }
1360
1361
1362 __HAL_LOCK(hspi);
1363
1364
1365 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
1366 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1367 hspi->pRxBuffPtr = (uint8_t *)pRxData;
1368 hspi->RxXferCount = Size;
1369 hspi->RxXferSize = Size;
1370 hspi->pTxBuffPtr = (const uint8_t *)pTxData;
1371 hspi->TxXferCount = Size;
1372 hspi->TxXferSize = Size;
1373
1374
1375 hspi->RxISR = NULL;
1376 hspi->TxISR = NULL;
1377
1378
1379 SPI_2LINES(hspi);
1380
1381
1382 if (IS_SPI_HIGHEND_INSTANCE(hspi->Instance))
1383 {
1384 fifo_length = SPI_HIGHEND_FIFO_SIZE;
1385 }
1386 else
1387 {
1388 fifo_length = SPI_LOWEND_FIFO_SIZE;
1389 }
1390
1391
1392 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
1393
1394 __HAL_SPI_ENABLE(hspi);
1395
1396 if (hspi->Init.Mode == SPI_MODE_MASTER)
1397 {
1398
1399 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
1400 }
1401
1402
1403 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1404 {
1405
1406 fifo_length = (fifo_length / 4UL);
1407
1408 while ((initial_TxXferCount > 0UL) || (initial_RxXferCount > 0UL))
1409 {
1410
1411 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (initial_TxXferCount > 0UL) &&
1412 (initial_RxXferCount < (initial_TxXferCount + fifo_length)))
1413 {
1414 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
1415 hspi->pTxBuffPtr += sizeof(uint32_t);
1416 hspi->TxXferCount --;
1417 initial_TxXferCount = hspi->TxXferCount;
1418 }
1419
1420
1421 temp_sr_reg = hspi->Instance->SR;
1422
1423 if (initial_RxXferCount > 0UL)
1424 {
1425
1426 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1427 {
1428 *((uint32_t *)hspi->pRxBuffPtr) = *((__IO uint32_t *)&hspi->Instance->RXDR);
1429 hspi->pRxBuffPtr += sizeof(uint32_t);
1430 hspi->RxXferCount--;
1431 initial_RxXferCount = hspi->RxXferCount;
1432 }
1433
1434 else if ((initial_RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1435 {
1436 *((uint32_t *)hspi->pRxBuffPtr) = *((__IO uint32_t *)&hspi->Instance->RXDR);
1437 hspi->pRxBuffPtr += sizeof(uint32_t);
1438 hspi->RxXferCount--;
1439 initial_RxXferCount = hspi->RxXferCount;
1440 }
1441 else
1442 {
1443
1444 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1445 {
1446
1447 SPI_CloseTransfer(hspi);
1448
1449 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1450 hspi->State = HAL_SPI_STATE_READY;
1451
1452
1453 __HAL_UNLOCK(hspi);
1454
1455 return HAL_TIMEOUT;
1456 }
1457 }
1458 }
1459 }
1460 }
1461
1462 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1463 {
1464
1465 fifo_length = (fifo_length / 2UL);
1466
1467 while ((initial_TxXferCount > 0UL) || (initial_RxXferCount > 0UL))
1468 {
1469
1470 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (initial_TxXferCount > 0UL) &&
1471 (initial_RxXferCount < (initial_TxXferCount + fifo_length)))
1472 {
1473 #if defined (__GNUC__)
1474 *ptxdr_16bits = *((const uint16_t *)hspi->pTxBuffPtr);
1475 #else
1476 *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
1477 #endif
1478 hspi->pTxBuffPtr += sizeof(uint16_t);
1479 hspi->TxXferCount--;
1480 initial_TxXferCount = hspi->TxXferCount;
1481 }
1482
1483
1484 temp_sr_reg = hspi->Instance->SR;
1485
1486 if (initial_RxXferCount > 0UL)
1487 {
1488
1489 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1490 {
1491 #if defined (__GNUC__)
1492 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1493 #else
1494 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1495 #endif
1496 hspi->pRxBuffPtr += sizeof(uint16_t);
1497 hspi->RxXferCount--;
1498 initial_RxXferCount = hspi->RxXferCount;
1499 }
1500
1501 else if ((initial_RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1502 {
1503 #if defined (__GNUC__)
1504 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1505 #else
1506 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1507 #endif
1508 hspi->pRxBuffPtr += sizeof(uint16_t);
1509 #if defined (__GNUC__)
1510 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1511 #else
1512 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1513 #endif
1514 hspi->pRxBuffPtr += sizeof(uint16_t);
1515 hspi->RxXferCount -= (uint16_t)2UL;
1516 initial_RxXferCount = hspi->RxXferCount;
1517 }
1518
1519 else if ((initial_RxXferCount == 1UL) && ((temp_sr_reg & SPI_SR_RXPLVL_0) != 0UL))
1520 {
1521 #if defined (__GNUC__)
1522 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
1523 #else
1524 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
1525 #endif
1526 hspi->pRxBuffPtr += sizeof(uint16_t);
1527 hspi->RxXferCount--;
1528 initial_RxXferCount = hspi->RxXferCount;
1529 }
1530 else
1531 {
1532
1533 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1534 {
1535
1536 SPI_CloseTransfer(hspi);
1537
1538 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1539 hspi->State = HAL_SPI_STATE_READY;
1540
1541
1542 __HAL_UNLOCK(hspi);
1543
1544 return HAL_TIMEOUT;
1545 }
1546 }
1547 }
1548 }
1549 }
1550
1551 else
1552 {
1553 while ((initial_TxXferCount > 0UL) || (initial_RxXferCount > 0UL))
1554 {
1555
1556 if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (initial_TxXferCount > 0UL) &&
1557 (initial_RxXferCount < (initial_TxXferCount + fifo_length)))
1558 {
1559 *((__IO uint8_t *)&hspi->Instance->TXDR) = *((const uint8_t *)hspi->pTxBuffPtr);
1560 hspi->pTxBuffPtr += sizeof(uint8_t);
1561 hspi->TxXferCount--;
1562 initial_TxXferCount = hspi->TxXferCount;
1563 }
1564
1565
1566 temp_sr_reg = hspi->Instance->SR;
1567
1568 if (initial_RxXferCount > 0UL)
1569 {
1570
1571 if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP))
1572 {
1573 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1574 hspi->pRxBuffPtr += sizeof(uint8_t);
1575 hspi->RxXferCount--;
1576 initial_RxXferCount = hspi->RxXferCount;
1577 }
1578
1579 else if ((initial_RxXferCount < init_max_data_in_fifo) && ((temp_sr_reg & SPI_SR_RXWNE_Msk) != 0UL))
1580 {
1581 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1582 hspi->pRxBuffPtr += sizeof(uint8_t);
1583 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1584 hspi->pRxBuffPtr += sizeof(uint8_t);
1585 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1586 hspi->pRxBuffPtr += sizeof(uint8_t);
1587 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1588 hspi->pRxBuffPtr += sizeof(uint8_t);
1589 hspi->RxXferCount -= (uint16_t)4UL;
1590 initial_RxXferCount = hspi->RxXferCount;
1591 }
1592
1593 else if ((initial_RxXferCount < 4UL) && ((temp_sr_reg & SPI_SR_RXPLVL_Msk) != 0UL))
1594 {
1595 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
1596 hspi->pRxBuffPtr += sizeof(uint8_t);
1597 hspi->RxXferCount--;
1598 initial_RxXferCount = hspi->RxXferCount;
1599 }
1600 else
1601 {
1602
1603 if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
1604 {
1605
1606 SPI_CloseTransfer(hspi);
1607
1608 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
1609 hspi->State = HAL_SPI_STATE_READY;
1610
1611
1612 __HAL_UNLOCK(hspi);
1613
1614 return HAL_TIMEOUT;
1615 }
1616 }
1617 }
1618 }
1619 }
1620
1621
1622 if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_EOT, RESET, Timeout, tickstart) != HAL_OK)
1623 {
1624 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
1625 }
1626
1627
1628 SPI_CloseTransfer(hspi);
1629
1630 hspi->State = HAL_SPI_STATE_READY;
1631
1632
1633 __HAL_UNLOCK(hspi);
1634
1635 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
1636 {
1637 return HAL_ERROR;
1638 }
1639 else
1640 {
1641 return HAL_OK;
1642 }
1643 }
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653 HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size)
1654 {
1655
1656 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_TXONLY(hspi->Init.Direction));
1657
1658 if ((pData == NULL) || (Size == 0UL))
1659 {
1660 return HAL_ERROR;
1661 }
1662
1663 if (hspi->State != HAL_SPI_STATE_READY)
1664 {
1665 return HAL_BUSY;
1666 }
1667
1668
1669 __HAL_LOCK(hspi);
1670
1671
1672 hspi->State = HAL_SPI_STATE_BUSY_TX;
1673 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1674 hspi->pTxBuffPtr = (const uint8_t *)pData;
1675 hspi->TxXferSize = Size;
1676 hspi->TxXferCount = Size;
1677
1678
1679 hspi->pRxBuffPtr = NULL;
1680 hspi->RxXferSize = (uint16_t) 0UL;
1681 hspi->RxXferCount = (uint16_t) 0UL;
1682 hspi->RxISR = NULL;
1683
1684 #if defined(USE_SPI_RELOAD_TRANSFER)
1685 hspi->Reload.Requested = 0UL;
1686 hspi->Reload.pTxBuffPtr = NULL;
1687 hspi->Reload.TxXferSize = NULL;
1688 #endif
1689
1690
1691 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1692 {
1693 hspi->TxISR = SPI_TxISR_32BIT;
1694 }
1695 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1696 {
1697 hspi->TxISR = SPI_TxISR_16BIT;
1698 }
1699 else
1700 {
1701 hspi->TxISR = SPI_TxISR_8BIT;
1702 }
1703
1704
1705 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1706 {
1707 SPI_1LINE_TX(hspi);
1708 }
1709 else
1710 {
1711 SPI_2LINES_TX(hspi);
1712 }
1713
1714
1715 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
1716
1717
1718 __HAL_SPI_ENABLE(hspi);
1719
1720
1721 __HAL_UNLOCK(hspi);
1722
1723
1724 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_TXP | SPI_IT_UDR | SPI_IT_FRE | SPI_IT_MODF | SPI_IT_TSERF));
1725
1726 if (hspi->Init.Mode == SPI_MODE_MASTER)
1727 {
1728
1729 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
1730 }
1731
1732 return HAL_OK;
1733 }
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743 HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1744 {
1745
1746 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_RXONLY(hspi->Init.Direction));
1747
1748 if (hspi->State != HAL_SPI_STATE_READY)
1749 {
1750 return HAL_BUSY;
1751 }
1752
1753 if ((pData == NULL) || (Size == 0UL))
1754 {
1755 return HAL_ERROR;
1756 }
1757
1758
1759 __HAL_LOCK(hspi);
1760
1761
1762 hspi->State = HAL_SPI_STATE_BUSY_RX;
1763 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1764 hspi->pRxBuffPtr = (uint8_t *)pData;
1765 hspi->RxXferSize = Size;
1766 hspi->RxXferCount = Size;
1767
1768
1769 hspi->pTxBuffPtr = NULL;
1770 hspi->TxXferSize = (uint16_t) 0UL;
1771 hspi->TxXferCount = (uint16_t) 0UL;
1772 hspi->TxISR = NULL;
1773
1774 #if defined(USE_SPI_RELOAD_TRANSFER)
1775 hspi->Reload.Requested = 0UL;
1776 hspi->Reload.pRxBuffPtr = NULL;
1777 hspi->Reload.RxXferSize = NULL;
1778 #endif
1779
1780
1781 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1782 {
1783 hspi->RxISR = SPI_RxISR_32BIT;
1784 }
1785 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1786 {
1787 hspi->RxISR = SPI_RxISR_16BIT;
1788 }
1789 else
1790 {
1791 hspi->RxISR = SPI_RxISR_8BIT;
1792 }
1793
1794
1795 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1796 {
1797 SPI_1LINE_RX(hspi);
1798 }
1799 else
1800 {
1801 SPI_2LINES_RX(hspi);
1802 }
1803
1804
1805
1806
1807
1808
1809 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
1810
1811
1812 __HAL_SPI_ENABLE(hspi);
1813
1814
1815 __HAL_UNLOCK(hspi);
1816
1817
1818 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_RXP | SPI_IT_OVR | SPI_IT_FRE | SPI_IT_MODF | SPI_IT_TSERF));
1819
1820 if (hspi->Init.Mode == SPI_MODE_MASTER)
1821 {
1822
1823 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
1824 }
1825
1826 return HAL_OK;
1827 }
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838 HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData,
1839 uint16_t Size)
1840 {
1841 uint32_t tmp_TxXferCount;
1842 #if defined (__GNUC__)
1843 __IO uint16_t *ptxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->TXDR));
1844 #endif
1845
1846
1847 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1848
1849 if (hspi->State != HAL_SPI_STATE_READY)
1850 {
1851 return HAL_BUSY;
1852 }
1853
1854 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0UL))
1855 {
1856 return HAL_ERROR;
1857 }
1858
1859
1860 __HAL_LOCK(hspi);
1861
1862
1863 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
1864 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
1865 hspi->pTxBuffPtr = (const uint8_t *)pTxData;
1866 hspi->TxXferSize = Size;
1867 hspi->TxXferCount = Size;
1868 hspi->pRxBuffPtr = (uint8_t *)pRxData;
1869 hspi->RxXferSize = Size;
1870 hspi->RxXferCount = Size;
1871 tmp_TxXferCount = hspi->TxXferCount;
1872
1873 #if defined(USE_SPI_RELOAD_TRANSFER)
1874 hspi->Reload.Requested = 0UL;
1875 hspi->Reload.pRxBuffPtr = NULL;
1876 hspi->Reload.RxXferSize = NULL;
1877 hspi->Reload.pTxBuffPtr = NULL;
1878 hspi->Reload.TxXferSize = NULL;
1879 #endif
1880
1881
1882 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1883 {
1884 hspi->TxISR = SPI_TxISR_32BIT;
1885 hspi->RxISR = SPI_RxISR_32BIT;
1886 }
1887 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1888 {
1889 hspi->RxISR = SPI_RxISR_16BIT;
1890 hspi->TxISR = SPI_TxISR_16BIT;
1891 }
1892 else
1893 {
1894 hspi->RxISR = SPI_RxISR_8BIT;
1895 hspi->TxISR = SPI_TxISR_8BIT;
1896 }
1897
1898
1899 SPI_2LINES(hspi);
1900
1901
1902 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
1903
1904
1905 __HAL_SPI_ENABLE(hspi);
1906
1907
1908 while ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (tmp_TxXferCount != 0UL))
1909 {
1910
1911 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
1912 {
1913 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
1914 hspi->pTxBuffPtr += sizeof(uint32_t);
1915 hspi->TxXferCount--;
1916 tmp_TxXferCount = hspi->TxXferCount;
1917 }
1918
1919 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1920 {
1921 #if defined (__GNUC__)
1922 *ptxdr_16bits = *((const uint16_t *)hspi->pTxBuffPtr);
1923 #else
1924 *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
1925 #endif
1926 hspi->pTxBuffPtr += sizeof(uint16_t);
1927 hspi->TxXferCount--;
1928 tmp_TxXferCount = hspi->TxXferCount;
1929 }
1930
1931 else
1932 {
1933 *((__IO uint8_t *)&hspi->Instance->TXDR) = *((const uint8_t *)hspi->pTxBuffPtr);
1934 hspi->pTxBuffPtr += sizeof(uint8_t);
1935 hspi->TxXferCount--;
1936 tmp_TxXferCount = hspi->TxXferCount;
1937 }
1938 }
1939
1940
1941 __HAL_UNLOCK(hspi);
1942
1943
1944 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_DXP | SPI_IT_UDR | SPI_IT_OVR |
1945 SPI_IT_FRE | SPI_IT_MODF | SPI_IT_TSERF));
1946
1947 if (hspi->Init.Mode == SPI_MODE_MASTER)
1948 {
1949
1950 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
1951 }
1952
1953 return HAL_OK;
1954 }
1955
1956 #if defined(USE_SPI_RELOAD_TRANSFER)
1957
1958
1959
1960
1961
1962
1963
1964
1965 HAL_StatusTypeDef HAL_SPI_Reload_Transmit_IT(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size)
1966 {
1967
1968 if ((hspi->Reload.Requested == 1UL) || (pData == NULL) || (Size == 0UL))
1969 {
1970 return HAL_ERROR;
1971 }
1972
1973 if (hspi->State == HAL_SPI_STATE_BUSY_TX)
1974 {
1975
1976 __HAL_LOCK(hspi);
1977
1978
1979 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSER, (Size & 0xFFFFFFFFUL) << 16UL);
1980
1981
1982 hspi->Reload.Requested = 1UL;
1983 hspi->Reload.pTxBuffPtr = (const uint8_t *)pData;
1984 hspi->Reload.TxXferSize = Size;
1985
1986
1987 __HAL_UNLOCK(hspi);
1988
1989 return HAL_OK;
1990 }
1991 else
1992 {
1993 return HAL_ERROR;
1994 }
1995 }
1996 #endif
1997
1998 #if defined(USE_SPI_RELOAD_TRANSFER)
1999
2000
2001
2002
2003
2004
2005
2006
2007 HAL_StatusTypeDef HAL_SPI_Reload_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
2008 {
2009
2010 if ((hspi->Reload.Requested == 1UL) || (pData == NULL) || (Size == 0UL))
2011 {
2012 return HAL_ERROR;
2013 }
2014
2015 if (hspi->State == HAL_SPI_STATE_BUSY_RX)
2016 {
2017
2018 __HAL_LOCK(hspi);
2019
2020
2021 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSER, (Size & 0xFFFFFFFFUL) << 16UL);
2022
2023
2024 hspi->Reload.Requested = 1UL;
2025 hspi->Reload.pRxBuffPtr = (uint8_t *)pData;
2026 hspi->Reload.RxXferSize = Size;
2027
2028
2029 __HAL_UNLOCK(hspi);
2030
2031 return HAL_OK;
2032 }
2033 else
2034 {
2035 return HAL_ERROR;
2036 }
2037 }
2038 #endif
2039
2040 #if defined(USE_SPI_RELOAD_TRANSFER)
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050 HAL_StatusTypeDef HAL_SPI_Reload_TransmitReceive_IT(SPI_HandleTypeDef *hspi, const uint8_t *pTxData,
2051 uint8_t *pRxData, uint16_t Size)
2052 {
2053
2054 if ((hspi->Reload.Requested == 1UL) || (pTxData == NULL) || (pRxData == NULL) || (Size == 0UL))
2055 {
2056 return HAL_ERROR;
2057 }
2058
2059 if (hspi->State == HAL_SPI_STATE_BUSY_TX_RX)
2060 {
2061
2062 __HAL_LOCK(hspi);
2063
2064
2065 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSER, (Size & 0xFFFFFFFFUL) << 16UL);
2066
2067
2068 hspi->Reload.Requested = 1UL;
2069 hspi->Reload.pTxBuffPtr = (const uint8_t *)pTxData;
2070 hspi->Reload.TxXferSize = Size;
2071 hspi->Reload.pRxBuffPtr = (uint8_t *)pRxData;
2072 hspi->Reload.RxXferSize = Size;
2073
2074
2075 __HAL_UNLOCK(hspi);
2076
2077 return HAL_OK;
2078 }
2079 else
2080 {
2081 return HAL_ERROR;
2082 }
2083 }
2084 #endif
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094 HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size)
2095 {
2096
2097
2098 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_TXONLY(hspi->Init.Direction));
2099
2100 if (hspi->State != HAL_SPI_STATE_READY)
2101 {
2102 return HAL_BUSY;
2103 }
2104
2105 if ((pData == NULL) || (Size == 0UL))
2106 {
2107 return HAL_ERROR;
2108 }
2109
2110
2111 __HAL_LOCK(hspi);
2112
2113
2114 hspi->State = HAL_SPI_STATE_BUSY_TX;
2115 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2116 hspi->pTxBuffPtr = (const uint8_t *)pData;
2117 hspi->TxXferSize = Size;
2118 hspi->TxXferCount = Size;
2119
2120
2121 hspi->pRxBuffPtr = NULL;
2122 hspi->TxISR = NULL;
2123 hspi->RxISR = NULL;
2124 hspi->RxXferSize = (uint16_t)0UL;
2125 hspi->RxXferCount = (uint16_t)0UL;
2126
2127
2128 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
2129 {
2130 SPI_1LINE_TX(hspi);
2131 }
2132 else
2133 {
2134 SPI_2LINES_TX(hspi);
2135 }
2136
2137
2138 if (((hspi->Init.DataSize > SPI_DATASIZE_16BIT) && (hspi->hdmatx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD)) || \
2139 ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) && ((hspi->hdmatx->Init.MemDataAlignment != DMA_MDATAALIGN_HALFWORD) && \
2140 (hspi->hdmatx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD))))
2141 {
2142
2143 __HAL_UNLOCK(hspi);
2144 return HAL_ERROR;
2145 }
2146
2147
2148 if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)
2149 {
2150 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2151 {
2152 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 1UL) >> 1UL;
2153 }
2154 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2155 {
2156 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 3UL) >> 2UL;
2157 }
2158 }
2159 else if (hspi->Init.DataSize <= SPI_DATASIZE_16BIT)
2160 {
2161 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2162 {
2163 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 1UL) >> 1UL;
2164 }
2165 }
2166 else
2167 {
2168
2169 }
2170
2171
2172 hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt;
2173
2174
2175 hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;
2176
2177
2178 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
2179
2180
2181 hspi->hdmatx->XferAbortCallback = NULL;
2182
2183
2184 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN);
2185
2186
2187 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->TXDR,
2188 hspi->TxXferCount))
2189 {
2190
2191 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2192 hspi->State = HAL_SPI_STATE_READY;
2193
2194
2195 __HAL_UNLOCK(hspi);
2196
2197 return HAL_ERROR;
2198 }
2199
2200
2201 if (hspi->hdmatx->Init.Mode == DMA_CIRCULAR)
2202 {
2203 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0UL);
2204 }
2205 else
2206 {
2207 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
2208 }
2209
2210
2211 SET_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN);
2212
2213
2214 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_UDR | SPI_IT_FRE | SPI_IT_MODF));
2215
2216
2217 __HAL_SPI_ENABLE(hspi);
2218
2219 if (hspi->Init.Mode == SPI_MODE_MASTER)
2220 {
2221
2222 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
2223 }
2224
2225
2226 __HAL_UNLOCK(hspi);
2227
2228 return HAL_OK;
2229 }
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240 HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
2241 {
2242
2243
2244 assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE_2LINES_RXONLY(hspi->Init.Direction));
2245
2246
2247 if (hspi->State != HAL_SPI_STATE_READY)
2248 {
2249 __HAL_UNLOCK(hspi);
2250 return HAL_BUSY;
2251 }
2252
2253 if ((pData == NULL) || (Size == 0UL))
2254 {
2255 __HAL_UNLOCK(hspi);
2256 return HAL_ERROR;
2257 }
2258
2259
2260 __HAL_LOCK(hspi);
2261
2262
2263 hspi->State = HAL_SPI_STATE_BUSY_RX;
2264 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2265 hspi->pRxBuffPtr = (uint8_t *)pData;
2266 hspi->RxXferSize = Size;
2267 hspi->RxXferCount = Size;
2268
2269
2270 hspi->RxISR = NULL;
2271 hspi->TxISR = NULL;
2272 hspi->TxXferSize = (uint16_t) 0UL;
2273 hspi->TxXferCount = (uint16_t) 0UL;
2274
2275
2276 if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
2277 {
2278 SPI_1LINE_RX(hspi);
2279 }
2280 else
2281 {
2282 SPI_2LINES_RX(hspi);
2283 }
2284
2285
2286 if (((hspi->Init.DataSize > SPI_DATASIZE_16BIT) && (hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD)) || \
2287 ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) && ((hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_HALFWORD) && \
2288 (hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD))))
2289 {
2290
2291 __HAL_UNLOCK(hspi);
2292 return HAL_ERROR;
2293 }
2294
2295
2296 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_RXDMAEN);
2297
2298
2299 if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)
2300 {
2301 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2302 {
2303 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 1UL) >> 1UL;
2304 }
2305 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2306 {
2307 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 3UL) >> 2UL;
2308 }
2309 }
2310 else if (hspi->Init.DataSize <= SPI_DATASIZE_16BIT)
2311 {
2312 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2313 {
2314 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 1UL) >> 1UL;
2315 }
2316 }
2317 else
2318 {
2319
2320 }
2321
2322
2323 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;
2324
2325
2326 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;
2327
2328
2329 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
2330
2331
2332 hspi->hdmarx->XferAbortCallback = NULL;
2333
2334
2335 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->RXDR, (uint32_t)hspi->pRxBuffPtr,
2336 hspi->RxXferCount))
2337 {
2338
2339 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2340 hspi->State = HAL_SPI_STATE_READY;
2341
2342
2343 __HAL_UNLOCK(hspi);
2344
2345 return HAL_ERROR;
2346 }
2347
2348
2349 if (hspi->hdmarx->Init.Mode == DMA_CIRCULAR)
2350 {
2351 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0UL);
2352 }
2353 else
2354 {
2355 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
2356 }
2357
2358
2359 SET_BIT(hspi->Instance->CFG1, SPI_CFG1_RXDMAEN);
2360
2361
2362 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_OVR | SPI_IT_FRE | SPI_IT_MODF));
2363
2364
2365 __HAL_SPI_ENABLE(hspi);
2366
2367 if (hspi->Init.Mode == SPI_MODE_MASTER)
2368 {
2369
2370 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
2371 }
2372
2373
2374 __HAL_UNLOCK(hspi);
2375
2376 return HAL_OK;
2377 }
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389 HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData,
2390 uint16_t Size)
2391 {
2392
2393 assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
2394
2395 if (hspi->State != HAL_SPI_STATE_READY)
2396 {
2397 return HAL_BUSY;
2398 }
2399
2400 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0UL))
2401 {
2402 return HAL_ERROR;
2403 }
2404
2405
2406 __HAL_LOCK(hspi);
2407
2408
2409 hspi->State = HAL_SPI_STATE_BUSY_TX_RX;
2410 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2411 hspi->pTxBuffPtr = (const uint8_t *)pTxData;
2412 hspi->TxXferSize = Size;
2413 hspi->TxXferCount = Size;
2414 hspi->pRxBuffPtr = (uint8_t *)pRxData;
2415 hspi->RxXferSize = Size;
2416 hspi->RxXferCount = Size;
2417
2418
2419 hspi->RxISR = NULL;
2420 hspi->TxISR = NULL;
2421
2422
2423 SPI_2LINES(hspi);
2424
2425
2426 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN);
2427
2428
2429 if (((hspi->Init.DataSize > SPI_DATASIZE_16BIT) && (hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD)) || \
2430 ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) && ((hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_HALFWORD) && \
2431 (hspi->hdmarx->Init.MemDataAlignment != DMA_MDATAALIGN_WORD))))
2432 {
2433
2434
2435 __HAL_UNLOCK(hspi);
2436 return HAL_ERROR;
2437 }
2438
2439
2440 if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)
2441 {
2442 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2443 {
2444 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 1UL) >> 1UL;
2445 }
2446 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2447 {
2448 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 3UL) >> 2UL;
2449 }
2450 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)
2451 {
2452 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 1UL) >> 1UL;
2453 }
2454 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2455 {
2456 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 3UL) >> 2UL;
2457 }
2458 }
2459 else if (hspi->Init.DataSize <= SPI_DATASIZE_16BIT)
2460 {
2461 if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2462 {
2463 hspi->TxXferCount = (hspi->TxXferCount + (uint16_t) 1UL) >> 1UL;
2464 }
2465 if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_WORD)
2466 {
2467 hspi->RxXferCount = (hspi->RxXferCount + (uint16_t) 1UL) >> 1UL;
2468 }
2469 }
2470 else
2471 {
2472
2473 }
2474
2475
2476 hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt;
2477 hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt;
2478
2479
2480 hspi->hdmarx->XferErrorCallback = SPI_DMAError;
2481
2482
2483 hspi->hdmarx->XferAbortCallback = NULL;
2484
2485
2486 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->RXDR, (uint32_t)hspi->pRxBuffPtr,
2487 hspi->RxXferCount))
2488 {
2489
2490 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2491 hspi->State = HAL_SPI_STATE_READY;
2492
2493
2494 __HAL_UNLOCK(hspi);
2495
2496 return HAL_ERROR;
2497 }
2498
2499
2500 SET_BIT(hspi->Instance->CFG1, SPI_CFG1_RXDMAEN);
2501
2502
2503
2504 hspi->hdmatx->XferHalfCpltCallback = NULL;
2505 hspi->hdmatx->XferCpltCallback = NULL;
2506 hspi->hdmatx->XferAbortCallback = NULL;
2507
2508
2509 hspi->hdmatx->XferErrorCallback = SPI_DMAError;
2510
2511
2512 if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->TXDR,
2513 hspi->TxXferCount))
2514 {
2515
2516 (void)HAL_DMA_Abort(hspi->hdmarx);
2517
2518
2519 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
2520 hspi->State = HAL_SPI_STATE_READY;
2521
2522
2523 __HAL_UNLOCK(hspi);
2524
2525 return HAL_ERROR;
2526 }
2527
2528 if (hspi->hdmatx->Init.Mode == DMA_CIRCULAR)
2529 {
2530 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, 0UL);
2531 }
2532 else
2533 {
2534 MODIFY_REG(hspi->Instance->CR2, SPI_CR2_TSIZE, Size);
2535 }
2536
2537
2538 SET_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN);
2539
2540
2541 __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_OVR | SPI_IT_UDR | SPI_IT_FRE | SPI_IT_MODF));
2542
2543
2544 __HAL_SPI_ENABLE(hspi);
2545
2546 if (hspi->Init.Mode == SPI_MODE_MASTER)
2547 {
2548
2549 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSTART);
2550 }
2551
2552
2553 __HAL_UNLOCK(hspi);
2554
2555 return HAL_OK;
2556 }
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571 HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi)
2572 {
2573 HAL_StatusTypeDef errorcode;
2574
2575 __IO uint32_t count;
2576
2577
2578 __HAL_LOCK(hspi);
2579
2580
2581 hspi->State = HAL_SPI_STATE_ABORT;
2582
2583
2584 errorcode = HAL_OK;
2585 count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24UL / 1000UL);
2586
2587
2588 if (HAL_IS_BIT_SET(hspi->Instance->CR1, SPI_CR1_CSTART))
2589 {
2590
2591 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_EOT);
2592 do
2593 {
2594 count--;
2595 if (count == 0UL)
2596 {
2597 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2598 break;
2599 }
2600 } while (HAL_IS_BIT_SET(hspi->Instance->IER, SPI_IT_EOT));
2601
2602
2603 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSUSP);
2604 do
2605 {
2606 count--;
2607 if (count == 0UL)
2608 {
2609 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2610 break;
2611 }
2612 } while (HAL_IS_BIT_SET(hspi->Instance->CR1, SPI_CR1_CSTART));
2613
2614
2615 __HAL_SPI_CLEAR_SUSPFLAG(hspi);
2616 do
2617 {
2618 count--;
2619 if (count == 0UL)
2620 {
2621 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2622 break;
2623 }
2624 } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_SUSP));
2625 }
2626
2627
2628 if (HAL_IS_BIT_SET(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN))
2629 {
2630 if (hspi->hdmatx != NULL)
2631 {
2632
2633 hspi->hdmatx->XferAbortCallback = NULL;
2634
2635
2636 if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK)
2637 {
2638 if (HAL_DMA_GetError(hspi->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
2639 {
2640 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2641 }
2642 }
2643 }
2644 }
2645
2646
2647 if (HAL_IS_BIT_SET(hspi->Instance->CFG1, SPI_CFG1_RXDMAEN))
2648 {
2649 if (hspi->hdmarx != NULL)
2650 {
2651
2652 hspi->hdmarx->XferAbortCallback = NULL;
2653
2654
2655 if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK)
2656 {
2657 if (HAL_DMA_GetError(hspi->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
2658 {
2659 hspi->ErrorCode = HAL_SPI_ERROR_ABORT;
2660 }
2661 }
2662 }
2663 }
2664
2665
2666 SPI_AbortTransfer(hspi);
2667
2668
2669 if (HAL_IS_BIT_SET(hspi->ErrorCode, HAL_SPI_ERROR_ABORT))
2670 {
2671
2672 errorcode = HAL_ERROR;
2673 }
2674 else
2675 {
2676
2677 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2678 }
2679
2680
2681 hspi->State = HAL_SPI_STATE_READY;
2682
2683
2684 __HAL_UNLOCK(hspi);
2685
2686 return errorcode;
2687 }
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704 HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi)
2705 {
2706 HAL_StatusTypeDef errorcode;
2707 __IO uint32_t count;
2708 uint32_t dma_tx_abort_done = 1UL;
2709 uint32_t dma_rx_abort_done = 1UL;
2710
2711
2712 hspi->State = HAL_SPI_STATE_ABORT;
2713
2714
2715 errorcode = HAL_OK;
2716 count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24UL / 1000UL);
2717
2718
2719 if (HAL_IS_BIT_SET(hspi->Instance->CR1, SPI_CR1_CSTART))
2720 {
2721
2722 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_EOT);
2723 do
2724 {
2725 count--;
2726 if (count == 0UL)
2727 {
2728 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2729 break;
2730 }
2731 } while (HAL_IS_BIT_SET(hspi->Instance->IER, SPI_IT_EOT));
2732
2733
2734 SET_BIT(hspi->Instance->CR1, SPI_CR1_CSUSP);
2735 do
2736 {
2737 count--;
2738 if (count == 0UL)
2739 {
2740 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2741 break;
2742 }
2743 } while (HAL_IS_BIT_SET(hspi->Instance->CR1, SPI_CR1_CSTART));
2744
2745
2746 __HAL_SPI_CLEAR_SUSPFLAG(hspi);
2747 do
2748 {
2749 count--;
2750 if (count == 0UL)
2751 {
2752 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
2753 break;
2754 }
2755 } while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_SUSP));
2756 }
2757
2758
2759
2760
2761 if (hspi->hdmatx != NULL)
2762 {
2763 if (HAL_IS_BIT_SET(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN))
2764 {
2765
2766 hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback;
2767
2768 dma_tx_abort_done = 0UL;
2769
2770
2771 if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK)
2772 {
2773 if (HAL_DMA_GetError(hspi->hdmatx) == HAL_DMA_ERROR_NO_XFER)
2774 {
2775 dma_tx_abort_done = 1UL;
2776 hspi->hdmatx->XferAbortCallback = NULL;
2777 }
2778 }
2779 }
2780 else
2781 {
2782 hspi->hdmatx->XferAbortCallback = NULL;
2783 }
2784 }
2785
2786 if (hspi->hdmarx != NULL)
2787 {
2788 if (HAL_IS_BIT_SET(hspi->Instance->CFG1, SPI_CFG1_RXDMAEN))
2789 {
2790
2791 hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback;
2792
2793 dma_rx_abort_done = 0UL;
2794
2795
2796 if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK)
2797 {
2798 if (HAL_DMA_GetError(hspi->hdmarx) == HAL_DMA_ERROR_NO_XFER)
2799 {
2800 dma_rx_abort_done = 1UL;
2801 hspi->hdmarx->XferAbortCallback = NULL;
2802 }
2803 }
2804 }
2805 else
2806 {
2807 hspi->hdmarx->XferAbortCallback = NULL;
2808 }
2809 }
2810
2811
2812 if ((dma_tx_abort_done == 1UL) && (dma_rx_abort_done == 1UL))
2813 {
2814
2815 SPI_AbortTransfer(hspi);
2816
2817
2818 if (HAL_IS_BIT_SET(hspi->ErrorCode, HAL_SPI_ERROR_ABORT))
2819 {
2820
2821 errorcode = HAL_ERROR;
2822 }
2823 else
2824 {
2825
2826 hspi->ErrorCode = HAL_SPI_ERROR_NONE;
2827 }
2828
2829
2830 hspi->State = HAL_SPI_STATE_READY;
2831
2832
2833 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
2834 hspi->AbortCpltCallback(hspi);
2835 #else
2836 HAL_SPI_AbortCpltCallback(hspi);
2837 #endif
2838 }
2839
2840 return errorcode;
2841 }
2842
2843
2844
2845
2846
2847
2848
2849
2850 HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi)
2851 {
2852
2853 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_NOT_SUPPORTED);
2854
2855 return HAL_ERROR;
2856 }
2857
2858
2859
2860
2861
2862
2863
2864
2865 HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi)
2866 {
2867
2868 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_NOT_SUPPORTED);
2869
2870 return HAL_ERROR;
2871 }
2872
2873
2874
2875
2876
2877
2878
2879
2880 HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi)
2881 {
2882
2883 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_NOT_SUPPORTED);
2884
2885 return HAL_ERROR;
2886 }
2887
2888
2889
2890
2891
2892
2893
2894 void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)
2895 {
2896 uint32_t itsource = hspi->Instance->IER;
2897 uint32_t itflag = hspi->Instance->SR;
2898 uint32_t trigger = itsource & itflag;
2899 uint32_t cfg1 = hspi->Instance->CFG1;
2900 uint32_t handled = 0UL;
2901
2902 HAL_SPI_StateTypeDef State = hspi->State;
2903 #if defined (__GNUC__)
2904 __IO uint16_t *prxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->RXDR));
2905 #endif
2906
2907
2908 if (HAL_IS_BIT_SET(itflag, SPI_FLAG_SUSP) && HAL_IS_BIT_SET(itsource, SPI_FLAG_EOT))
2909 {
2910
2911 __HAL_SPI_CLEAR_SUSPFLAG(hspi);
2912
2913
2914 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
2915 hspi->SuspendCallback(hspi);
2916 #else
2917 HAL_SPI_SuspendCallback(hspi);
2918 #endif
2919 return;
2920 }
2921
2922
2923 if (HAL_IS_BIT_CLR(trigger, SPI_FLAG_OVR) && HAL_IS_BIT_CLR(trigger, SPI_FLAG_UDR) && \
2924 HAL_IS_BIT_SET(trigger, SPI_FLAG_DXP))
2925 {
2926 hspi->TxISR(hspi);
2927 hspi->RxISR(hspi);
2928 handled = 1UL;
2929 }
2930
2931
2932 if (HAL_IS_BIT_CLR(trigger, SPI_FLAG_OVR) && HAL_IS_BIT_SET(trigger, SPI_FLAG_RXP) && \
2933 HAL_IS_BIT_CLR(trigger, SPI_FLAG_DXP))
2934 {
2935 hspi->RxISR(hspi);
2936 handled = 1UL;
2937 }
2938
2939
2940 if (HAL_IS_BIT_CLR(trigger, SPI_FLAG_UDR) && HAL_IS_BIT_SET(trigger, SPI_FLAG_TXP) && \
2941 HAL_IS_BIT_CLR(trigger, SPI_FLAG_DXP))
2942 {
2943 hspi->TxISR(hspi);
2944 handled = 1UL;
2945 }
2946
2947 #if defined(USE_SPI_RELOAD_TRANSFER)
2948
2949 if (HAL_IS_BIT_SET(trigger, SPI_FLAG_TSERF))
2950 {
2951 __HAL_SPI_CLEAR_TSERFFLAG(hspi);
2952 }
2953 #endif
2954
2955 if (handled != 0UL)
2956 {
2957 return;
2958 }
2959
2960
2961 if (HAL_IS_BIT_SET(trigger, SPI_FLAG_EOT))
2962 {
2963
2964 __HAL_SPI_CLEAR_EOTFLAG(hspi);
2965 __HAL_SPI_CLEAR_TXTFFLAG(hspi);
2966 __HAL_SPI_CLEAR_SUSPFLAG(hspi);
2967
2968
2969 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_EOT);
2970
2971
2972 if (HAL_IS_BIT_CLR(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN))
2973 {
2974
2975 while (hspi->RxXferCount != 0UL)
2976 {
2977
2978 if (hspi->Init.DataSize > SPI_DATASIZE_16BIT)
2979 {
2980 *((uint32_t *)hspi->pRxBuffPtr) = *((__IO uint32_t *)&hspi->Instance->RXDR);
2981 hspi->pRxBuffPtr += sizeof(uint32_t);
2982 }
2983
2984 else if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
2985 {
2986 #if defined (__GNUC__)
2987 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
2988 #else
2989 *((uint16_t *)hspi->pRxBuffPtr) = *((__IO uint16_t *)&hspi->Instance->RXDR);
2990 #endif
2991 hspi->pRxBuffPtr += sizeof(uint16_t);
2992 }
2993
2994 else
2995 {
2996 *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
2997 hspi->pRxBuffPtr += sizeof(uint8_t);
2998 }
2999
3000 hspi->RxXferCount--;
3001 }
3002 }
3003
3004
3005 SPI_CloseTransfer(hspi);
3006
3007 hspi->State = HAL_SPI_STATE_READY;
3008 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
3009 {
3010 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3011 hspi->ErrorCallback(hspi);
3012 #else
3013 HAL_SPI_ErrorCallback(hspi);
3014 #endif
3015 return;
3016 }
3017
3018 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3019
3020 if (State == HAL_SPI_STATE_BUSY_TX_RX)
3021 {
3022 hspi->TxRxCpltCallback(hspi);
3023 }
3024 else if (State == HAL_SPI_STATE_BUSY_RX)
3025 {
3026 hspi->RxCpltCallback(hspi);
3027 }
3028 else if (State == HAL_SPI_STATE_BUSY_TX)
3029 {
3030 hspi->TxCpltCallback(hspi);
3031 }
3032 #else
3033
3034 if (State == HAL_SPI_STATE_BUSY_TX_RX)
3035 {
3036 HAL_SPI_TxRxCpltCallback(hspi);
3037 }
3038 else if (State == HAL_SPI_STATE_BUSY_RX)
3039 {
3040 HAL_SPI_RxCpltCallback(hspi);
3041 }
3042 else if (State == HAL_SPI_STATE_BUSY_TX)
3043 {
3044 HAL_SPI_TxCpltCallback(hspi);
3045 }
3046 #endif
3047 else
3048 {
3049
3050 }
3051
3052 return;
3053 }
3054
3055
3056 if ((trigger & (SPI_FLAG_MODF | SPI_FLAG_OVR | SPI_FLAG_FRE | SPI_FLAG_UDR)) != 0UL)
3057 {
3058
3059 if ((trigger & SPI_FLAG_OVR) != 0UL)
3060 {
3061 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);
3062 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3063 }
3064
3065
3066 if ((trigger & SPI_FLAG_MODF) != 0UL)
3067 {
3068 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF);
3069 __HAL_SPI_CLEAR_MODFFLAG(hspi);
3070 }
3071
3072
3073 if ((trigger & SPI_FLAG_FRE) != 0UL)
3074 {
3075 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE);
3076 __HAL_SPI_CLEAR_FREFLAG(hspi);
3077 }
3078
3079
3080 if ((trigger & SPI_FLAG_UDR) != 0UL)
3081 {
3082 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_UDR);
3083 __HAL_SPI_CLEAR_UDRFLAG(hspi);
3084 }
3085
3086 if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)
3087 {
3088
3089 __HAL_SPI_DISABLE(hspi);
3090
3091
3092 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_RXP | SPI_IT_TXP | SPI_IT_MODF |
3093 SPI_IT_OVR | SPI_IT_FRE | SPI_IT_UDR));
3094
3095
3096 if (HAL_IS_BIT_SET(cfg1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN))
3097 {
3098
3099 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN);
3100
3101
3102 if (hspi->hdmarx != NULL)
3103 {
3104
3105
3106 hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError;
3107 if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx))
3108 {
3109 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
3110 }
3111 }
3112
3113 if (hspi->hdmatx != NULL)
3114 {
3115
3116
3117 hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError;
3118 if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx))
3119 {
3120 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
3121 }
3122 }
3123 }
3124 else
3125 {
3126
3127 hspi->State = HAL_SPI_STATE_READY;
3128
3129
3130 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3131 hspi->ErrorCallback(hspi);
3132 #else
3133 HAL_SPI_ErrorCallback(hspi);
3134 #endif
3135 }
3136 }
3137 return;
3138 }
3139 }
3140
3141 #ifndef __rtems__
3142
3143
3144
3145
3146
3147
3148 __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
3149 {
3150
3151 UNUSED(hspi);
3152
3153
3154
3155
3156 }
3157
3158
3159
3160
3161
3162
3163
3164 __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
3165 {
3166
3167 UNUSED(hspi);
3168
3169
3170
3171
3172 }
3173
3174
3175
3176
3177
3178
3179
3180 __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
3181 {
3182
3183 UNUSED(hspi);
3184
3185
3186
3187
3188 }
3189 #endif
3190
3191
3192
3193
3194
3195
3196
3197 __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
3198 {
3199
3200 UNUSED(hspi);
3201
3202
3203
3204
3205 }
3206
3207
3208
3209
3210
3211
3212
3213 __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)
3214 {
3215
3216 UNUSED(hspi);
3217
3218
3219
3220
3221 }
3222
3223
3224
3225
3226
3227
3228
3229 __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)
3230 {
3231
3232 UNUSED(hspi);
3233
3234
3235
3236
3237 }
3238
3239 #ifndef __rtems__
3240
3241
3242
3243
3244
3245
3246 __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
3247 {
3248
3249 UNUSED(hspi);
3250
3251
3252
3253
3254
3255
3256
3257 }
3258 #endif
3259
3260
3261
3262
3263
3264
3265 __weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi)
3266 {
3267
3268 UNUSED(hspi);
3269
3270
3271
3272
3273 }
3274
3275
3276
3277
3278
3279
3280 __weak void HAL_SPI_SuspendCallback(SPI_HandleTypeDef *hspi)
3281 {
3282
3283 UNUSED(hspi);
3284
3285
3286
3287
3288 }
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316 HAL_SPI_StateTypeDef HAL_SPI_GetState(const SPI_HandleTypeDef *hspi)
3317 {
3318
3319 return hspi->State;
3320 }
3321
3322
3323
3324
3325
3326
3327
3328 uint32_t HAL_SPI_GetError(const SPI_HandleTypeDef *hspi)
3329 {
3330
3331 return hspi->ErrorCode;
3332 }
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353 static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)
3354 {
3355 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3356
3357 if (hspi->State != HAL_SPI_STATE_ABORT)
3358 {
3359 if (hspi->hdmatx->Init.Mode == DMA_CIRCULAR)
3360 {
3361 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3362 hspi->TxCpltCallback(hspi);
3363 #else
3364 HAL_SPI_TxCpltCallback(hspi);
3365 #endif
3366 }
3367 else
3368 {
3369
3370 __HAL_SPI_ENABLE_IT(hspi, SPI_IT_EOT);
3371 }
3372 }
3373 }
3374
3375
3376
3377
3378
3379
3380
3381 static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
3382 {
3383 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3384
3385 if (hspi->State != HAL_SPI_STATE_ABORT)
3386 {
3387 if (hspi->hdmarx->Init.Mode == DMA_CIRCULAR)
3388 {
3389 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3390 hspi->RxCpltCallback(hspi);
3391 #else
3392 HAL_SPI_RxCpltCallback(hspi);
3393 #endif
3394 }
3395 else
3396 {
3397
3398 __HAL_SPI_ENABLE_IT(hspi, SPI_IT_EOT);
3399 }
3400 }
3401 }
3402
3403
3404
3405
3406
3407
3408
3409 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3410 {
3411 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3412
3413 if (hspi->State != HAL_SPI_STATE_ABORT)
3414 {
3415 if (hspi->hdmatx->Init.Mode == DMA_CIRCULAR)
3416 {
3417 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3418 hspi->TxRxCpltCallback(hspi);
3419 #else
3420 HAL_SPI_TxRxCpltCallback(hspi);
3421 #endif
3422 }
3423 else
3424 {
3425
3426 __HAL_SPI_ENABLE_IT(hspi, SPI_IT_EOT);
3427 }
3428 }
3429 }
3430
3431
3432
3433
3434
3435
3436
3437 static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma)
3438 {
3439 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)
3440 ((DMA_HandleTypeDef *)hdma)->Parent;
3441
3442 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3443 hspi->TxHalfCpltCallback(hspi);
3444 #else
3445 HAL_SPI_TxHalfCpltCallback(hspi);
3446 #endif
3447 }
3448
3449
3450
3451
3452
3453
3454
3455 static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma)
3456 {
3457 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)
3458 ((DMA_HandleTypeDef *)hdma)->Parent;
3459
3460 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3461 hspi->RxHalfCpltCallback(hspi);
3462 #else
3463 HAL_SPI_RxHalfCpltCallback(hspi);
3464 #endif
3465 }
3466
3467
3468
3469
3470
3471
3472
3473 static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3474 {
3475 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)
3476 ((DMA_HandleTypeDef *)hdma)->Parent;
3477
3478 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3479 hspi->TxRxHalfCpltCallback(hspi);
3480 #else
3481 HAL_SPI_TxRxHalfCpltCallback(hspi);
3482 #endif
3483 }
3484
3485
3486
3487
3488
3489
3490
3491 static void SPI_DMAError(DMA_HandleTypeDef *hdma)
3492 {
3493 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3494
3495
3496 if (HAL_DMA_GetError(hdma) != HAL_DMA_ERROR_FE)
3497 {
3498
3499 SPI_CloseTransfer(hspi);
3500
3501 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);
3502 hspi->State = HAL_SPI_STATE_READY;
3503 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3504 hspi->ErrorCallback(hspi);
3505 #else
3506 HAL_SPI_ErrorCallback(hspi);
3507 #endif
3508 }
3509 }
3510
3511
3512
3513
3514
3515
3516
3517 static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma)
3518 {
3519 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3520 hspi->RxXferCount = (uint16_t) 0UL;
3521 hspi->TxXferCount = (uint16_t) 0UL;
3522
3523
3524 hspi->State = HAL_SPI_STATE_READY;
3525
3526 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3527 hspi->ErrorCallback(hspi);
3528 #else
3529 HAL_SPI_ErrorCallback(hspi);
3530 #endif
3531 }
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541 static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
3542 {
3543 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3544
3545 hspi->hdmatx->XferAbortCallback = NULL;
3546
3547
3548 if (hspi->hdmarx != NULL)
3549 {
3550 if (hspi->hdmarx->XferAbortCallback != NULL)
3551 {
3552 return;
3553 }
3554 }
3555
3556
3557 SPI_AbortTransfer(hspi);
3558
3559
3560 hspi->State = HAL_SPI_STATE_READY;
3561
3562
3563 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3564 hspi->AbortCpltCallback(hspi);
3565 #else
3566 HAL_SPI_AbortCpltCallback(hspi);
3567 #endif
3568 }
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578 static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
3579 {
3580 SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
3581
3582 hspi->hdmarx->XferAbortCallback = NULL;
3583
3584
3585 if (hspi->hdmatx != NULL)
3586 {
3587 if (hspi->hdmatx->XferAbortCallback != NULL)
3588 {
3589 return;
3590 }
3591 }
3592
3593
3594 SPI_AbortTransfer(hspi);
3595
3596
3597 hspi->State = HAL_SPI_STATE_READY;
3598
3599
3600 #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
3601 hspi->AbortCpltCallback(hspi);
3602 #else
3603 HAL_SPI_AbortCpltCallback(hspi);
3604 #endif
3605 }
3606
3607
3608
3609
3610
3611
3612
3613 static void SPI_RxISR_8BIT(SPI_HandleTypeDef *hspi)
3614 {
3615
3616 *((uint8_t *)hspi->pRxBuffPtr) = (*(__IO uint8_t *)&hspi->Instance->RXDR);
3617 hspi->pRxBuffPtr += sizeof(uint8_t);
3618 hspi->RxXferCount--;
3619
3620
3621 if (hspi->RxXferCount == 0UL)
3622 {
3623 #if defined(USE_SPI_RELOAD_TRANSFER)
3624
3625 if (hspi->Reload.Requested == 1UL)
3626 {
3627 hspi->RxXferSize = hspi->Reload.RxXferSize;
3628 hspi->RxXferCount = hspi->Reload.RxXferSize;
3629 hspi->pRxBuffPtr = hspi->Reload.pRxBuffPtr;
3630 hspi->Reload.Requested = 0UL;
3631 }
3632 else
3633 {
3634
3635 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3636 }
3637 #else
3638
3639 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3640 #endif
3641 }
3642 }
3643
3644
3645
3646
3647
3648
3649
3650
3651 static void SPI_RxISR_16BIT(SPI_HandleTypeDef *hspi)
3652 {
3653
3654 #if defined (__GNUC__)
3655 __IO uint16_t *prxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->RXDR));
3656
3657 *((uint16_t *)hspi->pRxBuffPtr) = *prxdr_16bits;
3658 #else
3659 *((uint16_t *)hspi->pRxBuffPtr) = (*(__IO uint16_t *)&hspi->Instance->RXDR);
3660 #endif
3661 hspi->pRxBuffPtr += sizeof(uint16_t);
3662 hspi->RxXferCount--;
3663
3664
3665 if (hspi->RxXferCount == 0UL)
3666 {
3667 #if defined(USE_SPI_RELOAD_TRANSFER)
3668
3669 if (hspi->Reload.Requested == 1UL)
3670 {
3671 hspi->RxXferSize = hspi->Reload.RxXferSize;
3672 hspi->RxXferCount = hspi->Reload.RxXferSize;
3673 hspi->pRxBuffPtr = hspi->Reload.pRxBuffPtr;
3674 hspi->Reload.Requested = 0UL;
3675 }
3676 else
3677 {
3678
3679 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3680 }
3681 #else
3682
3683 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3684 #endif
3685 }
3686 }
3687
3688
3689
3690
3691
3692
3693
3694
3695 static void SPI_RxISR_32BIT(SPI_HandleTypeDef *hspi)
3696 {
3697
3698 *((uint32_t *)hspi->pRxBuffPtr) = (*(__IO uint32_t *)&hspi->Instance->RXDR);
3699 hspi->pRxBuffPtr += sizeof(uint32_t);
3700 hspi->RxXferCount--;
3701
3702
3703 if (hspi->RxXferCount == 0UL)
3704 {
3705 #if defined(USE_SPI_RELOAD_TRANSFER)
3706
3707 if (hspi->Reload.Requested == 1UL)
3708 {
3709 hspi->RxXferSize = hspi->Reload.RxXferSize;
3710 hspi->RxXferCount = hspi->Reload.RxXferSize;
3711 hspi->pRxBuffPtr = hspi->Reload.pRxBuffPtr;
3712 hspi->Reload.Requested = 0UL;
3713 }
3714 else
3715 {
3716
3717 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3718 }
3719 #else
3720
3721 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXP);
3722 #endif
3723 }
3724 }
3725
3726
3727
3728
3729
3730
3731
3732
3733 static void SPI_TxISR_8BIT(SPI_HandleTypeDef *hspi)
3734 {
3735
3736 *(__IO uint8_t *)&hspi->Instance->TXDR = *((const uint8_t *)hspi->pTxBuffPtr);
3737 hspi->pTxBuffPtr += sizeof(uint8_t);
3738 hspi->TxXferCount--;
3739
3740
3741 if (hspi->TxXferCount == 0UL)
3742 {
3743 #if defined(USE_SPI_RELOAD_TRANSFER)
3744
3745 if (hspi->Reload.Requested == 1UL)
3746 {
3747 hspi->TxXferSize = hspi->Reload.TxXferSize;
3748 hspi->TxXferCount = hspi->Reload.TxXferSize;
3749 hspi->pTxBuffPtr = hspi->Reload.pTxBuffPtr;
3750
3751
3752 if (hspi->State == HAL_SPI_STATE_BUSY_TX)
3753 {
3754 hspi->Reload.Requested = 0UL;
3755 }
3756 }
3757 else
3758 {
3759
3760 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3761 }
3762 #else
3763
3764 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3765 #endif
3766 }
3767 }
3768
3769
3770
3771
3772
3773
3774
3775 static void SPI_TxISR_16BIT(SPI_HandleTypeDef *hspi)
3776 {
3777
3778 #if defined (__GNUC__)
3779 __IO uint16_t *ptxdr_16bits = (__IO uint16_t *)(&(hspi->Instance->TXDR));
3780
3781 *ptxdr_16bits = *((const uint16_t *)hspi->pTxBuffPtr);
3782 #else
3783 *((__IO uint16_t *)&hspi->Instance->TXDR) = *((const uint16_t *)hspi->pTxBuffPtr);
3784 #endif
3785 hspi->pTxBuffPtr += sizeof(uint16_t);
3786 hspi->TxXferCount--;
3787
3788
3789 if (hspi->TxXferCount == 0UL)
3790 {
3791 #if defined(USE_SPI_RELOAD_TRANSFER)
3792
3793 if (hspi->Reload.Requested == 1UL)
3794 {
3795 hspi->TxXferSize = hspi->Reload.TxXferSize;
3796 hspi->TxXferCount = hspi->Reload.TxXferSize;
3797 hspi->pTxBuffPtr = hspi->Reload.pTxBuffPtr;
3798
3799
3800 if (hspi->State == HAL_SPI_STATE_BUSY_TX)
3801 {
3802 hspi->Reload.Requested = 0UL;
3803 }
3804 }
3805 else
3806 {
3807
3808 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3809 }
3810 #else
3811
3812 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3813 #endif
3814 }
3815 }
3816
3817
3818
3819
3820
3821
3822
3823 static void SPI_TxISR_32BIT(SPI_HandleTypeDef *hspi)
3824 {
3825
3826 *((__IO uint32_t *)&hspi->Instance->TXDR) = *((const uint32_t *)hspi->pTxBuffPtr);
3827 hspi->pTxBuffPtr += sizeof(uint32_t);
3828 hspi->TxXferCount--;
3829
3830
3831 if (hspi->TxXferCount == 0UL)
3832 {
3833 #if defined(USE_SPI_RELOAD_TRANSFER)
3834
3835 if (hspi->Reload.Requested == 1UL)
3836 {
3837 hspi->TxXferSize = hspi->Reload.TxXferSize;
3838 hspi->TxXferCount = hspi->Reload.TxXferSize;
3839 hspi->pTxBuffPtr = hspi->Reload.pTxBuffPtr;
3840
3841
3842 if (hspi->State == HAL_SPI_STATE_BUSY_TX)
3843 {
3844 hspi->Reload.Requested = 0UL;
3845 }
3846 }
3847 else
3848 {
3849
3850 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3851 }
3852 #else
3853
3854 __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXP);
3855 #endif
3856 }
3857 }
3858
3859
3860
3861
3862
3863
3864
3865 static void SPI_AbortTransfer(SPI_HandleTypeDef *hspi)
3866 {
3867
3868 __HAL_SPI_DISABLE(hspi);
3869
3870
3871 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_TXP | SPI_IT_RXP | SPI_IT_DXP | SPI_IT_UDR | SPI_IT_OVR | \
3872 SPI_IT_FRE | SPI_IT_MODF));
3873
3874
3875 __HAL_SPI_CLEAR_EOTFLAG(hspi);
3876 __HAL_SPI_CLEAR_TXTFFLAG(hspi);
3877
3878
3879 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN);
3880
3881
3882 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3883 __HAL_SPI_CLEAR_UDRFLAG(hspi);
3884 __HAL_SPI_CLEAR_FREFLAG(hspi);
3885 __HAL_SPI_CLEAR_MODFFLAG(hspi);
3886 __HAL_SPI_CLEAR_SUSPFLAG(hspi);
3887
3888 #if (USE_SPI_CRC != 0U)
3889 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
3890 #endif
3891
3892 hspi->TxXferCount = (uint16_t)0UL;
3893 hspi->RxXferCount = (uint16_t)0UL;
3894 }
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904 static void SPI_CloseTransfer(SPI_HandleTypeDef *hspi)
3905 {
3906 uint32_t itflag = hspi->Instance->SR;
3907
3908 __HAL_SPI_CLEAR_EOTFLAG(hspi);
3909 __HAL_SPI_CLEAR_TXTFFLAG(hspi);
3910
3911
3912 __HAL_SPI_DISABLE(hspi);
3913
3914
3915 __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_EOT | SPI_IT_TXP | SPI_IT_RXP | SPI_IT_DXP | SPI_IT_UDR | SPI_IT_OVR | \
3916 SPI_IT_FRE | SPI_IT_MODF));
3917
3918
3919 CLEAR_BIT(hspi->Instance->CFG1, SPI_CFG1_TXDMAEN | SPI_CFG1_RXDMAEN);
3920
3921
3922 if (hspi->State != HAL_SPI_STATE_BUSY_RX)
3923 {
3924 if ((itflag & SPI_FLAG_UDR) != 0UL)
3925 {
3926 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_UDR);
3927 __HAL_SPI_CLEAR_UDRFLAG(hspi);
3928 }
3929 }
3930
3931
3932 if (hspi->State != HAL_SPI_STATE_BUSY_TX)
3933 {
3934 if ((itflag & SPI_FLAG_OVR) != 0UL)
3935 {
3936 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);
3937 __HAL_SPI_CLEAR_OVRFLAG(hspi);
3938 }
3939
3940 #if (USE_SPI_CRC != 0UL)
3941
3942 if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
3943 {
3944 if ((itflag & SPI_FLAG_CRCERR) != 0UL)
3945 {
3946 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3947 __HAL_SPI_CLEAR_CRCERRFLAG(hspi);
3948 }
3949 }
3950 #endif
3951 }
3952
3953
3954 if ((itflag & SPI_FLAG_MODF) != 0UL)
3955 {
3956 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF);
3957 __HAL_SPI_CLEAR_MODFFLAG(hspi);
3958 }
3959
3960
3961 if ((itflag & SPI_FLAG_FRE) != 0UL)
3962 {
3963 SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE);
3964 __HAL_SPI_CLEAR_FREFLAG(hspi);
3965 }
3966
3967 hspi->TxXferCount = (uint16_t)0UL;
3968 hspi->RxXferCount = (uint16_t)0UL;
3969 }
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981 static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(const SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status,
3982 uint32_t Timeout, uint32_t Tickstart)
3983 {
3984
3985 while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) == Status)
3986 {
3987
3988 if ((((HAL_GetTick() - Tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
3989 {
3990 return HAL_TIMEOUT;
3991 }
3992 }
3993 return HAL_OK;
3994 }
3995
3996
3997
3998
3999
4000
4001
4002 static uint32_t SPI_GetPacketSize(const SPI_HandleTypeDef *hspi)
4003 {
4004 uint32_t fifo_threashold = (hspi->Init.FifoThreshold >> SPI_CFG1_FTHLV_Pos) + 1UL;
4005 uint32_t data_size = (hspi->Init.DataSize >> SPI_CFG1_DSIZE_Pos) + 1UL;
4006
4007
4008 data_size = (data_size + 7UL) / 8UL;
4009
4010 return data_size * fifo_threashold;
4011 }
4012
4013
4014
4015
4016
4017 #endif
4018
4019
4020
4021
4022
4023
4024
4025