File indexing completed on 2025-05-11 08:23:08
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
0185
0186
0187
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 #include "stm32h7xx_hal.h"
0229
0230 #if defined(QUADSPI)
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241 #ifdef HAL_QSPI_MODULE_ENABLED
0242
0243
0244
0245
0246
0247
0248
0249
0250 #define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE 0x00000000U
0251 #define QSPI_FUNCTIONAL_MODE_INDIRECT_READ ((uint32_t)QUADSPI_CCR_FMODE_0)
0252 #define QSPI_FUNCTIONAL_MODE_AUTO_POLLING ((uint32_t)QUADSPI_CCR_FMODE_1)
0253 #define QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED ((uint32_t)QUADSPI_CCR_FMODE)
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263 #define IS_QSPI_FUNCTIONAL_MODE(MODE) (((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE) || \
0264 ((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_READ) || \
0265 ((MODE) == QSPI_FUNCTIONAL_MODE_AUTO_POLLING) || \
0266 ((MODE) == QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
0267
0268
0269
0270
0271
0272
0273
0274 static void QSPI_DMARxCplt(MDMA_HandleTypeDef *hmdma);
0275 static void QSPI_DMATxCplt(MDMA_HandleTypeDef *hmdma);
0276 static void QSPI_DMAError(MDMA_HandleTypeDef *hmdma);
0277 static void QSPI_DMAAbortCplt(MDMA_HandleTypeDef *hmdma);
0278 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout);
0279 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode);
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 HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi)
0312 {
0313 HAL_StatusTypeDef status;
0314 uint32_t tickstart = HAL_GetTick();
0315
0316
0317 if(hqspi == NULL)
0318 {
0319 return HAL_ERROR;
0320 }
0321
0322
0323 assert_param(IS_QSPI_ALL_INSTANCE(hqspi->Instance));
0324 assert_param(IS_QSPI_CLOCK_PRESCALER(hqspi->Init.ClockPrescaler));
0325 assert_param(IS_QSPI_FIFO_THRESHOLD(hqspi->Init.FifoThreshold));
0326 assert_param(IS_QSPI_SSHIFT(hqspi->Init.SampleShifting));
0327 assert_param(IS_QSPI_FLASH_SIZE(hqspi->Init.FlashSize));
0328 assert_param(IS_QSPI_CS_HIGH_TIME(hqspi->Init.ChipSelectHighTime));
0329 assert_param(IS_QSPI_CLOCK_MODE(hqspi->Init.ClockMode));
0330 assert_param(IS_QSPI_DUAL_FLASH_MODE(hqspi->Init.DualFlash));
0331
0332 if (hqspi->Init.DualFlash != QSPI_DUALFLASH_ENABLE )
0333 {
0334 assert_param(IS_QSPI_FLASH_ID(hqspi->Init.FlashID));
0335 }
0336
0337 if(hqspi->State == HAL_QSPI_STATE_RESET)
0338 {
0339
0340 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0341
0342 hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
0343 hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
0344 hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
0345 hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
0346 hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
0347 hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
0348 hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
0349 hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
0350
0351 if(hqspi->MspInitCallback == NULL)
0352 {
0353 hqspi->MspInitCallback = HAL_QSPI_MspInit;
0354 }
0355
0356
0357 hqspi->MspInitCallback(hqspi);
0358 #else
0359
0360 HAL_QSPI_MspInit(hqspi);
0361 #endif
0362
0363
0364 HAL_QSPI_SetTimeout(hqspi, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);
0365 }
0366
0367
0368 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,
0369 ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));
0370
0371
0372 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
0373
0374 if(status == HAL_OK)
0375 {
0376
0377 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM),
0378 ((hqspi->Init.ClockPrescaler << QUADSPI_CR_PRESCALER_Pos) |
0379 hqspi->Init.SampleShifting | hqspi->Init.FlashID | hqspi->Init.DualFlash));
0380
0381
0382 MODIFY_REG(hqspi->Instance->DCR, (QUADSPI_DCR_FSIZE | QUADSPI_DCR_CSHT | QUADSPI_DCR_CKMODE),
0383 ((hqspi->Init.FlashSize << QUADSPI_DCR_FSIZE_Pos) |
0384 hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode));
0385
0386
0387 __HAL_QSPI_ENABLE(hqspi);
0388
0389
0390 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
0391
0392
0393 hqspi->State = HAL_QSPI_STATE_READY;
0394 }
0395
0396
0397 return status;
0398 }
0399
0400
0401
0402
0403
0404
0405 HAL_StatusTypeDef HAL_QSPI_DeInit(QSPI_HandleTypeDef *hqspi)
0406 {
0407
0408 if(hqspi == NULL)
0409 {
0410 return HAL_ERROR;
0411 }
0412
0413
0414 __HAL_QSPI_DISABLE(hqspi);
0415
0416 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0417 if(hqspi->MspDeInitCallback == NULL)
0418 {
0419 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
0420 }
0421
0422
0423 hqspi->MspDeInitCallback(hqspi);
0424 #else
0425
0426 HAL_QSPI_MspDeInit(hqspi);
0427 #endif
0428
0429
0430 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
0431
0432
0433 hqspi->State = HAL_QSPI_STATE_RESET;
0434
0435 return HAL_OK;
0436 }
0437
0438
0439
0440
0441
0442
0443 __weak void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
0444 {
0445
0446 UNUSED(hqspi);
0447
0448
0449
0450
0451 }
0452
0453
0454
0455
0456
0457
0458 __weak void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
0459 {
0460
0461 UNUSED(hqspi);
0462
0463
0464
0465
0466 }
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498 void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi)
0499 {
0500 __IO uint32_t *data_reg;
0501 uint32_t flag = READ_REG(hqspi->Instance->SR);
0502 uint32_t itsource = READ_REG(hqspi->Instance->CR);
0503
0504
0505 if(((flag & QSPI_FLAG_FT) != 0U) && ((itsource & QSPI_IT_FT) != 0U))
0506 {
0507 data_reg = &hqspi->Instance->DR;
0508
0509 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
0510 {
0511
0512 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
0513 {
0514 if (hqspi->TxXferCount > 0U)
0515 {
0516
0517 *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
0518 hqspi->pTxBuffPtr++;
0519 hqspi->TxXferCount--;
0520 }
0521 else
0522 {
0523
0524
0525 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
0526 break;
0527 }
0528 }
0529 }
0530 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
0531 {
0532
0533 while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)
0534 {
0535 if (hqspi->RxXferCount > 0U)
0536 {
0537
0538 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
0539 hqspi->pRxBuffPtr++;
0540 hqspi->RxXferCount--;
0541 }
0542 else
0543 {
0544
0545
0546 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);
0547 break;
0548 }
0549 }
0550 }
0551 else
0552 {
0553
0554 }
0555
0556
0557 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0558 hqspi->FifoThresholdCallback(hqspi);
0559 #else
0560 HAL_QSPI_FifoThresholdCallback(hqspi);
0561 #endif
0562 }
0563
0564
0565 else if(((flag & QSPI_FLAG_TC) != 0U) && ((itsource & QSPI_IT_TC) != 0U))
0566 {
0567
0568 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TC);
0569
0570
0571 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
0572
0573
0574 if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)
0575 {
0576 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
0577 {
0578
0579
0580 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
0581
0582
0583 __HAL_MDMA_DISABLE(hqspi->hmdma);
0584 }
0585
0586
0587
0588 hqspi->State = HAL_QSPI_STATE_READY;
0589
0590
0591 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0592 hqspi->TxCpltCallback(hqspi);
0593 #else
0594 HAL_QSPI_TxCpltCallback(hqspi);
0595 #endif
0596 }
0597 else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)
0598 {
0599 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
0600 {
0601
0602
0603 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
0604
0605
0606 __HAL_MDMA_DISABLE(hqspi->hmdma);
0607 }
0608 else
0609 {
0610 data_reg = &hqspi->Instance->DR;
0611 while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0U)
0612 {
0613 if (hqspi->RxXferCount > 0U)
0614 {
0615
0616 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
0617 hqspi->pRxBuffPtr++;
0618 hqspi->RxXferCount--;
0619 }
0620 else
0621 {
0622
0623 break;
0624 }
0625 }
0626 }
0627
0628
0629
0630 hqspi->State = HAL_QSPI_STATE_READY;
0631
0632
0633 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0634 hqspi->RxCpltCallback(hqspi);
0635 #else
0636 HAL_QSPI_RxCpltCallback(hqspi);
0637 #endif
0638 }
0639 else if(hqspi->State == HAL_QSPI_STATE_BUSY)
0640 {
0641
0642 hqspi->State = HAL_QSPI_STATE_READY;
0643
0644
0645 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0646 hqspi->CmdCpltCallback(hqspi);
0647 #else
0648 HAL_QSPI_CmdCpltCallback(hqspi);
0649 #endif
0650 }
0651 else if(hqspi->State == HAL_QSPI_STATE_ABORT)
0652 {
0653
0654 CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
0655
0656
0657 hqspi->State = HAL_QSPI_STATE_READY;
0658
0659 if (hqspi->ErrorCode == HAL_QSPI_ERROR_NONE)
0660 {
0661
0662
0663
0664 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0665 hqspi->AbortCpltCallback(hqspi);
0666 #else
0667 HAL_QSPI_AbortCpltCallback(hqspi);
0668 #endif
0669 }
0670 else
0671 {
0672
0673
0674
0675 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0676 hqspi->ErrorCallback(hqspi);
0677 #else
0678 HAL_QSPI_ErrorCallback(hqspi);
0679 #endif
0680 }
0681 }
0682 else
0683 {
0684
0685 }
0686 }
0687
0688
0689 else if(((flag & QSPI_FLAG_SM) != 0U) && ((itsource & QSPI_IT_SM) != 0U))
0690 {
0691
0692 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM);
0693
0694
0695 if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0U)
0696 {
0697
0698 __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
0699
0700
0701 hqspi->State = HAL_QSPI_STATE_READY;
0702 }
0703
0704
0705 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0706 hqspi->StatusMatchCallback(hqspi);
0707 #else
0708 HAL_QSPI_StatusMatchCallback(hqspi);
0709 #endif
0710 }
0711
0712
0713 else if(((flag & QSPI_FLAG_TE) != 0U) && ((itsource & QSPI_IT_TE) != 0U))
0714 {
0715
0716 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TE);
0717
0718
0719 __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);
0720
0721
0722 hqspi->ErrorCode |= HAL_QSPI_ERROR_TRANSFER;
0723
0724 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
0725 {
0726
0727
0728 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
0729
0730
0731 hqspi->hmdma->XferAbortCallback = QSPI_DMAAbortCplt;
0732 if (HAL_MDMA_Abort_IT(hqspi->hmdma) != HAL_OK)
0733 {
0734
0735 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
0736
0737
0738 hqspi->State = HAL_QSPI_STATE_READY;
0739
0740
0741 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0742 hqspi->ErrorCallback(hqspi);
0743 #else
0744 HAL_QSPI_ErrorCallback(hqspi);
0745 #endif
0746 }
0747 }
0748 else
0749 {
0750
0751 hqspi->State = HAL_QSPI_STATE_READY;
0752
0753
0754 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0755 hqspi->ErrorCallback(hqspi);
0756 #else
0757 HAL_QSPI_ErrorCallback(hqspi);
0758 #endif
0759 }
0760 }
0761
0762
0763 else if(((flag & QSPI_FLAG_TO) != 0U) && ((itsource & QSPI_IT_TO) != 0U))
0764 {
0765
0766 WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TO);
0767
0768
0769 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
0770 hqspi->TimeOutCallback(hqspi);
0771 #else
0772 HAL_QSPI_TimeOutCallback(hqspi);
0773 #endif
0774 }
0775
0776 else
0777 {
0778
0779 }
0780 }
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790 HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)
0791 {
0792 HAL_StatusTypeDef status;
0793 uint32_t tickstart = HAL_GetTick();
0794
0795
0796 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
0797 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
0798 {
0799 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
0800 }
0801
0802 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
0803 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
0804 {
0805 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
0806 }
0807
0808 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
0809 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
0810 {
0811 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
0812 }
0813
0814 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
0815 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
0816
0817 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
0818 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
0819 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
0820
0821
0822 __HAL_LOCK(hqspi);
0823
0824 if(hqspi->State == HAL_QSPI_STATE_READY)
0825 {
0826 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
0827
0828
0829 hqspi->State = HAL_QSPI_STATE_BUSY;
0830
0831
0832 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
0833
0834 if (status == HAL_OK)
0835 {
0836
0837 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
0838
0839 if (cmd->DataMode == QSPI_DATA_NONE)
0840 {
0841
0842
0843 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
0844
0845 if (status == HAL_OK)
0846 {
0847 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
0848
0849
0850 hqspi->State = HAL_QSPI_STATE_READY;
0851 }
0852 }
0853 else
0854 {
0855
0856 hqspi->State = HAL_QSPI_STATE_READY;
0857 }
0858 }
0859 }
0860 else
0861 {
0862 status = HAL_BUSY;
0863 }
0864
0865
0866 __HAL_UNLOCK(hqspi);
0867
0868
0869 return status;
0870 }
0871
0872
0873
0874
0875
0876
0877
0878
0879 HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)
0880 {
0881 HAL_StatusTypeDef status;
0882 uint32_t tickstart = HAL_GetTick();
0883
0884
0885 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
0886 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
0887 {
0888 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
0889 }
0890
0891 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
0892 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
0893 {
0894 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
0895 }
0896
0897 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
0898 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
0899 {
0900 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
0901 }
0902
0903 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
0904 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
0905
0906 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
0907 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
0908 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
0909
0910
0911 __HAL_LOCK(hqspi);
0912
0913 if(hqspi->State == HAL_QSPI_STATE_READY)
0914 {
0915 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
0916
0917
0918 hqspi->State = HAL_QSPI_STATE_BUSY;
0919
0920
0921 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
0922
0923 if (status == HAL_OK)
0924 {
0925 if (cmd->DataMode == QSPI_DATA_NONE)
0926 {
0927
0928 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
0929 }
0930
0931
0932 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
0933
0934 if (cmd->DataMode == QSPI_DATA_NONE)
0935 {
0936
0937
0938
0939 __HAL_UNLOCK(hqspi);
0940
0941
0942 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);
0943 }
0944 else
0945 {
0946
0947 hqspi->State = HAL_QSPI_STATE_READY;
0948
0949
0950 __HAL_UNLOCK(hqspi);
0951 }
0952 }
0953 else
0954 {
0955
0956 __HAL_UNLOCK(hqspi);
0957 }
0958 }
0959 else
0960 {
0961 status = HAL_BUSY;
0962
0963
0964 __HAL_UNLOCK(hqspi);
0965 }
0966
0967
0968 return status;
0969 }
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979 HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
0980 {
0981 HAL_StatusTypeDef status = HAL_OK;
0982 uint32_t tickstart = HAL_GetTick();
0983 __IO uint32_t *data_reg = &hqspi->Instance->DR;
0984
0985
0986 __HAL_LOCK(hqspi);
0987
0988 if(hqspi->State == HAL_QSPI_STATE_READY)
0989 {
0990 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
0991
0992 if(pData != NULL )
0993 {
0994
0995 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
0996
0997
0998 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
0999 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1000 hqspi->pTxBuffPtr = pData;
1001
1002
1003 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1004
1005 while(hqspi->TxXferCount > 0U)
1006 {
1007
1008 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout);
1009
1010 if (status != HAL_OK)
1011 {
1012 break;
1013 }
1014
1015 *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;
1016 hqspi->pTxBuffPtr++;
1017 hqspi->TxXferCount--;
1018 }
1019
1020 if (status == HAL_OK)
1021 {
1022
1023 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1024
1025 if (status == HAL_OK)
1026 {
1027
1028 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1029
1030 }
1031 }
1032
1033
1034 hqspi->State = HAL_QSPI_STATE_READY;
1035 }
1036 else
1037 {
1038 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1039 status = HAL_ERROR;
1040 }
1041 }
1042 else
1043 {
1044 status = HAL_BUSY;
1045 }
1046
1047
1048 __HAL_UNLOCK(hqspi);
1049
1050 return status;
1051 }
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062 HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)
1063 {
1064 HAL_StatusTypeDef status = HAL_OK;
1065 uint32_t tickstart = HAL_GetTick();
1066 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1067 __IO uint32_t *data_reg = &hqspi->Instance->DR;
1068
1069
1070 __HAL_LOCK(hqspi);
1071
1072 if(hqspi->State == HAL_QSPI_STATE_READY)
1073 {
1074 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1075
1076 if(pData != NULL )
1077 {
1078
1079 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1080
1081
1082 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1083 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1084 hqspi->pRxBuffPtr = pData;
1085
1086
1087 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1088
1089
1090 WRITE_REG(hqspi->Instance->AR, addr_reg);
1091
1092 while(hqspi->RxXferCount > 0U)
1093 {
1094
1095 status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout);
1096
1097 if (status != HAL_OK)
1098 {
1099 break;
1100 }
1101
1102 *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);
1103 hqspi->pRxBuffPtr++;
1104 hqspi->RxXferCount--;
1105 }
1106
1107 if (status == HAL_OK)
1108 {
1109
1110 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);
1111
1112 if (status == HAL_OK)
1113 {
1114
1115 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
1116
1117 }
1118 }
1119
1120
1121 hqspi->State = HAL_QSPI_STATE_READY;
1122 }
1123 else
1124 {
1125 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1126 status = HAL_ERROR;
1127 }
1128 }
1129 else
1130 {
1131 status = HAL_BUSY;
1132 }
1133
1134
1135 __HAL_UNLOCK(hqspi);
1136
1137 return status;
1138 }
1139
1140
1141
1142
1143
1144
1145
1146
1147 HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1148 {
1149 HAL_StatusTypeDef status = HAL_OK;
1150
1151
1152 __HAL_LOCK(hqspi);
1153
1154 if(hqspi->State == HAL_QSPI_STATE_READY)
1155 {
1156 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1157
1158 if(pData != NULL )
1159 {
1160
1161 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1162
1163
1164 hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1165 hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1166 hqspi->pTxBuffPtr = pData;
1167
1168
1169 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1170
1171
1172 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1173
1174
1175 __HAL_UNLOCK(hqspi);
1176
1177
1178 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1179 }
1180 else
1181 {
1182 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1183 status = HAL_ERROR;
1184
1185
1186 __HAL_UNLOCK(hqspi);
1187 }
1188 }
1189 else
1190 {
1191 status = HAL_BUSY;
1192
1193
1194 __HAL_UNLOCK(hqspi);
1195 }
1196
1197 return status;
1198 }
1199
1200
1201
1202
1203
1204
1205
1206
1207 HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1208 {
1209 HAL_StatusTypeDef status = HAL_OK;
1210 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1211
1212
1213 __HAL_LOCK(hqspi);
1214
1215 if(hqspi->State == HAL_QSPI_STATE_READY)
1216 {
1217 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1218
1219 if(pData != NULL )
1220 {
1221
1222 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1223
1224
1225 hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;
1226 hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;
1227 hqspi->pRxBuffPtr = pData;
1228
1229
1230 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);
1231
1232
1233 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1234
1235
1236 WRITE_REG(hqspi->Instance->AR, addr_reg);
1237
1238
1239 __HAL_UNLOCK(hqspi);
1240
1241
1242 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);
1243 }
1244 else
1245 {
1246 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1247 status = HAL_ERROR;
1248
1249
1250 __HAL_UNLOCK(hqspi);
1251 }
1252 }
1253 else
1254 {
1255 status = HAL_BUSY;
1256
1257
1258 __HAL_UNLOCK(hqspi);
1259 }
1260
1261 return status;
1262 }
1263
1264
1265
1266
1267
1268
1269
1270
1271 HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1272 {
1273 HAL_StatusTypeDef status = HAL_OK;
1274 uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1275
1276
1277 __HAL_LOCK(hqspi);
1278
1279 if(hqspi->State == HAL_QSPI_STATE_READY)
1280 {
1281
1282 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1283
1284 if(pData != NULL )
1285 {
1286
1287 hqspi->TxXferCount = data_size;
1288
1289
1290 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;
1291
1292
1293 __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1294
1295
1296 hqspi->TxXferSize = hqspi->TxXferCount;
1297 hqspi->pTxBuffPtr = pData;
1298
1299
1300 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);
1301
1302
1303 hqspi->hmdma->XferCpltCallback = QSPI_DMATxCplt;
1304
1305
1306 hqspi->hmdma->XferErrorCallback = QSPI_DMAError;
1307
1308
1309 hqspi->hmdma->XferAbortCallback = NULL;
1310
1311
1312 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_DINC | MDMA_CTCR_DINCOS) ,MDMA_DEST_INC_DISABLE);
1313
1314
1315 if (hqspi->hmdma->Init.SourceDataSize == MDMA_SRC_DATASIZE_BYTE)
1316 {
1317 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_SINC | MDMA_CTCR_SINCOS) , MDMA_SRC_INC_BYTE);
1318 }
1319 else if (hqspi->hmdma->Init.SourceDataSize == MDMA_SRC_DATASIZE_HALFWORD)
1320 {
1321 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_SINC | MDMA_CTCR_SINCOS) , MDMA_SRC_INC_HALFWORD);
1322 }
1323 else if (hqspi->hmdma->Init.SourceDataSize == MDMA_SRC_DATASIZE_WORD)
1324 {
1325 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_SINC | MDMA_CTCR_SINCOS) , MDMA_SRC_INC_WORD);
1326 }
1327 else
1328 {
1329
1330 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1331 status = HAL_ERROR;
1332 }
1333
1334
1335 if (HAL_MDMA_Start_IT(hqspi->hmdma, (uint32_t)pData, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize, 1) == HAL_OK)
1336 {
1337
1338 __HAL_UNLOCK(hqspi);
1339
1340
1341 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1342
1343
1344
1345 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1346 }
1347 else
1348 {
1349 status = HAL_ERROR;
1350 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1351 hqspi->State = HAL_QSPI_STATE_READY;
1352
1353
1354 __HAL_UNLOCK(hqspi);
1355 }
1356 }
1357 else
1358 {
1359 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1360 status = HAL_ERROR;
1361
1362
1363 __HAL_UNLOCK(hqspi);
1364 }
1365 }
1366 else
1367 {
1368 status = HAL_BUSY;
1369
1370
1371 __HAL_UNLOCK(hqspi);
1372 }
1373
1374 return status;
1375 }
1376
1377
1378
1379
1380
1381
1382
1383
1384 HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)
1385 {
1386 HAL_StatusTypeDef status = HAL_OK;
1387 uint32_t addr_reg = READ_REG(hqspi->Instance->AR);
1388 uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);
1389
1390
1391 __HAL_LOCK(hqspi);
1392
1393 if(hqspi->State == HAL_QSPI_STATE_READY)
1394 {
1395
1396 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1397
1398 if(pData != NULL )
1399 {
1400
1401 hqspi->RxXferCount = data_size;
1402
1403 hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;
1404
1405
1406 __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));
1407
1408
1409 hqspi->RxXferSize = hqspi->RxXferCount;
1410 hqspi->pRxBuffPtr = pData;
1411
1412
1413 hqspi->hmdma->XferCpltCallback = QSPI_DMARxCplt;
1414
1415
1416 hqspi->hmdma->XferErrorCallback = QSPI_DMAError;
1417
1418
1419 hqspi->hmdma->XferAbortCallback = NULL;
1420
1421
1422 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_SINC | MDMA_CTCR_SINCOS) , MDMA_SRC_INC_DISABLE);
1423
1424
1425 if (hqspi->hmdma->Init.DestDataSize == MDMA_DEST_DATASIZE_BYTE)
1426 {
1427 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_DINC | MDMA_CTCR_DINCOS) , MDMA_DEST_INC_BYTE);
1428 }
1429 else if (hqspi->hmdma->Init.DestDataSize == MDMA_DEST_DATASIZE_HALFWORD)
1430 {
1431 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_DINC | MDMA_CTCR_DINCOS) , MDMA_DEST_INC_HALFWORD);
1432 }
1433 else if (hqspi->hmdma->Init.DestDataSize == MDMA_DEST_DATASIZE_WORD)
1434 {
1435 MODIFY_REG(hqspi->hmdma->Instance->CTCR, (MDMA_CTCR_DINC | MDMA_CTCR_DINCOS) , MDMA_DEST_INC_WORD);
1436 }
1437 else
1438 {
1439
1440 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1441 status = HAL_ERROR;
1442 }
1443
1444 MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);
1445
1446
1447 WRITE_REG(hqspi->Instance->AR, addr_reg);
1448
1449
1450 if (HAL_MDMA_Start_IT(hqspi->hmdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize, 1) == HAL_OK)
1451 {
1452
1453 __HAL_UNLOCK(hqspi);
1454
1455
1456 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);
1457
1458
1459
1460 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
1461 }
1462 else
1463 {
1464 status = HAL_ERROR;
1465 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
1466 hqspi->State = HAL_QSPI_STATE_READY;
1467
1468
1469 __HAL_UNLOCK(hqspi);
1470 }
1471 }
1472 else
1473 {
1474 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;
1475 status = HAL_ERROR;
1476
1477
1478 __HAL_UNLOCK(hqspi);
1479 }
1480 }
1481 else
1482 {
1483 status = HAL_BUSY;
1484
1485
1486 __HAL_UNLOCK(hqspi);
1487 }
1488
1489 return status;
1490 }
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501 HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)
1502 {
1503 HAL_StatusTypeDef status;
1504 uint32_t tickstart = HAL_GetTick();
1505
1506
1507 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1508 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1509 {
1510 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1511 }
1512
1513 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1514 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1515 {
1516 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1517 }
1518
1519 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1520 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1521 {
1522 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1523 }
1524
1525 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1526 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1527
1528 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1529 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1530 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1531
1532 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1533 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1534 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1535
1536
1537 __HAL_LOCK(hqspi);
1538
1539 if(hqspi->State == HAL_QSPI_STATE_READY)
1540 {
1541 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1542
1543
1544 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1545
1546
1547 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);
1548
1549 if (status == HAL_OK)
1550 {
1551
1552 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1553
1554
1555 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1556
1557
1558 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1559
1560
1561
1562 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1563 (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));
1564
1565
1566 cmd->NbData = cfg->StatusBytesSize;
1567 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1568
1569
1570 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);
1571
1572 if (status == HAL_OK)
1573 {
1574 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);
1575
1576
1577 hqspi->State = HAL_QSPI_STATE_READY;
1578 }
1579 }
1580 }
1581 else
1582 {
1583 status = HAL_BUSY;
1584 }
1585
1586
1587 __HAL_UNLOCK(hqspi);
1588
1589
1590 return status;
1591 }
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601 HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)
1602 {
1603 HAL_StatusTypeDef status;
1604 uint32_t tickstart = HAL_GetTick();
1605
1606
1607 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1608 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1609 {
1610 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1611 }
1612
1613 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1614 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1615 {
1616 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1617 }
1618
1619 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1620 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1621 {
1622 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1623 }
1624
1625 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1626 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1627
1628 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1629 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1630 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1631
1632 assert_param(IS_QSPI_INTERVAL(cfg->Interval));
1633 assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));
1634 assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));
1635 assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));
1636
1637
1638 __HAL_LOCK(hqspi);
1639
1640 if(hqspi->State == HAL_QSPI_STATE_READY)
1641 {
1642 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1643
1644
1645 hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;
1646
1647
1648 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1649
1650 if (status == HAL_OK)
1651 {
1652
1653 WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);
1654
1655
1656 WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);
1657
1658
1659 WRITE_REG(hqspi->Instance->PIR, cfg->Interval);
1660
1661
1662 MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),
1663 (cfg->MatchMode | cfg->AutomaticStop));
1664
1665
1666 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);
1667
1668
1669 cmd->NbData = cfg->StatusBytesSize;
1670 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);
1671
1672
1673 __HAL_UNLOCK(hqspi);
1674
1675
1676 __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));
1677
1678 }
1679 else
1680 {
1681
1682 __HAL_UNLOCK(hqspi);
1683 }
1684 }
1685 else
1686 {
1687 status = HAL_BUSY;
1688
1689
1690 __HAL_UNLOCK(hqspi);
1691 }
1692
1693
1694 return status;
1695 }
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)
1706 {
1707 HAL_StatusTypeDef status;
1708 uint32_t tickstart = HAL_GetTick();
1709
1710
1711 assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));
1712 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
1713 {
1714 assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));
1715 }
1716
1717 assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));
1718 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
1719 {
1720 assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));
1721 }
1722
1723 assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));
1724 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
1725 {
1726 assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));
1727 }
1728
1729 assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));
1730 assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));
1731
1732 assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));
1733 assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));
1734 assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));
1735
1736 assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));
1737
1738
1739 __HAL_LOCK(hqspi);
1740
1741 if(hqspi->State == HAL_QSPI_STATE_READY)
1742 {
1743 hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;
1744
1745
1746 hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;
1747
1748
1749 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
1750
1751 if (status == HAL_OK)
1752 {
1753
1754 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);
1755
1756 if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)
1757 {
1758 assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));
1759
1760
1761 WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);
1762
1763
1764 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);
1765
1766
1767 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);
1768 }
1769
1770
1771 QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);
1772 }
1773 }
1774 else
1775 {
1776 status = HAL_BUSY;
1777 }
1778
1779
1780 __HAL_UNLOCK(hqspi);
1781
1782
1783 return status;
1784 }
1785
1786
1787
1788
1789
1790
1791 __weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)
1792 {
1793
1794 UNUSED(hqspi);
1795
1796
1797
1798
1799 }
1800
1801
1802
1803
1804
1805
1806 __weak void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)
1807 {
1808
1809 UNUSED(hqspi);
1810
1811
1812
1813
1814 }
1815
1816
1817
1818
1819
1820
1821 __weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)
1822 {
1823
1824 UNUSED(hqspi);
1825
1826
1827
1828
1829 }
1830
1831
1832
1833
1834
1835
1836 __weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)
1837 {
1838
1839 UNUSED(hqspi);
1840
1841
1842
1843
1844 }
1845
1846
1847
1848
1849
1850
1851 __weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)
1852 {
1853
1854 UNUSED(hqspi);
1855
1856
1857
1858
1859 }
1860
1861
1862
1863
1864
1865
1866
1867 __weak void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)
1868 {
1869
1870 UNUSED(hqspi);
1871
1872
1873
1874
1875 }
1876
1877
1878
1879
1880
1881
1882 __weak void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)
1883 {
1884
1885 UNUSED(hqspi);
1886
1887
1888
1889
1890 }
1891
1892
1893
1894
1895
1896
1897 __weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)
1898 {
1899
1900 UNUSED(hqspi);
1901
1902
1903
1904
1905 }
1906 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926 HAL_StatusTypeDef HAL_QSPI_RegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback)
1927 {
1928 HAL_StatusTypeDef status = HAL_OK;
1929
1930 if(pCallback == NULL)
1931 {
1932
1933 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
1934 return HAL_ERROR;
1935 }
1936
1937
1938 __HAL_LOCK(hqspi);
1939
1940 if(hqspi->State == HAL_QSPI_STATE_READY)
1941 {
1942 switch (CallbackId)
1943 {
1944 case HAL_QSPI_ERROR_CB_ID :
1945 hqspi->ErrorCallback = pCallback;
1946 break;
1947 case HAL_QSPI_ABORT_CB_ID :
1948 hqspi->AbortCpltCallback = pCallback;
1949 break;
1950 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
1951 hqspi->FifoThresholdCallback = pCallback;
1952 break;
1953 case HAL_QSPI_CMD_CPLT_CB_ID :
1954 hqspi->CmdCpltCallback = pCallback;
1955 break;
1956 case HAL_QSPI_RX_CPLT_CB_ID :
1957 hqspi->RxCpltCallback = pCallback;
1958 break;
1959 case HAL_QSPI_TX_CPLT_CB_ID :
1960 hqspi->TxCpltCallback = pCallback;
1961 break;
1962 case HAL_QSPI_STATUS_MATCH_CB_ID :
1963 hqspi->StatusMatchCallback = pCallback;
1964 break;
1965 case HAL_QSPI_TIMEOUT_CB_ID :
1966 hqspi->TimeOutCallback = pCallback;
1967 break;
1968 case HAL_QSPI_MSP_INIT_CB_ID :
1969 hqspi->MspInitCallback = pCallback;
1970 break;
1971 case HAL_QSPI_MSP_DEINIT_CB_ID :
1972 hqspi->MspDeInitCallback = pCallback;
1973 break;
1974 default :
1975
1976 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
1977
1978 status = HAL_ERROR;
1979 break;
1980 }
1981 }
1982 else if (hqspi->State == HAL_QSPI_STATE_RESET)
1983 {
1984 switch (CallbackId)
1985 {
1986 case HAL_QSPI_MSP_INIT_CB_ID :
1987 hqspi->MspInitCallback = pCallback;
1988 break;
1989 case HAL_QSPI_MSP_DEINIT_CB_ID :
1990 hqspi->MspDeInitCallback = pCallback;
1991 break;
1992 default :
1993
1994 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
1995
1996 status = HAL_ERROR;
1997 break;
1998 }
1999 }
2000 else
2001 {
2002
2003 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2004
2005 status = HAL_ERROR;
2006 }
2007
2008
2009 __HAL_UNLOCK(hqspi);
2010 return status;
2011 }
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031 HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId)
2032 {
2033 HAL_StatusTypeDef status = HAL_OK;
2034
2035
2036 __HAL_LOCK(hqspi);
2037
2038 if(hqspi->State == HAL_QSPI_STATE_READY)
2039 {
2040 switch (CallbackId)
2041 {
2042 case HAL_QSPI_ERROR_CB_ID :
2043 hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;
2044 break;
2045 case HAL_QSPI_ABORT_CB_ID :
2046 hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;
2047 break;
2048 case HAL_QSPI_FIFO_THRESHOLD_CB_ID :
2049 hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;
2050 break;
2051 case HAL_QSPI_CMD_CPLT_CB_ID :
2052 hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;
2053 break;
2054 case HAL_QSPI_RX_CPLT_CB_ID :
2055 hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;
2056 break;
2057 case HAL_QSPI_TX_CPLT_CB_ID :
2058 hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;
2059 break;
2060 case HAL_QSPI_STATUS_MATCH_CB_ID :
2061 hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;
2062 break;
2063 case HAL_QSPI_TIMEOUT_CB_ID :
2064 hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;
2065 break;
2066 case HAL_QSPI_MSP_INIT_CB_ID :
2067 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2068 break;
2069 case HAL_QSPI_MSP_DEINIT_CB_ID :
2070 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2071 break;
2072 default :
2073
2074 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2075
2076 status = HAL_ERROR;
2077 break;
2078 }
2079 }
2080 else if (hqspi->State == HAL_QSPI_STATE_RESET)
2081 {
2082 switch (CallbackId)
2083 {
2084 case HAL_QSPI_MSP_INIT_CB_ID :
2085 hqspi->MspInitCallback = HAL_QSPI_MspInit;
2086 break;
2087 case HAL_QSPI_MSP_DEINIT_CB_ID :
2088 hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;
2089 break;
2090 default :
2091
2092 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2093
2094 status = HAL_ERROR;
2095 break;
2096 }
2097 }
2098 else
2099 {
2100
2101 hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;
2102
2103 status = HAL_ERROR;
2104 }
2105
2106
2107 __HAL_UNLOCK(hqspi);
2108 return status;
2109 }
2110 #endif
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140 HAL_QSPI_StateTypeDef HAL_QSPI_GetState(const QSPI_HandleTypeDef *hqspi)
2141 {
2142
2143 return hqspi->State;
2144 }
2145
2146
2147
2148
2149
2150
2151 uint32_t HAL_QSPI_GetError(const QSPI_HandleTypeDef *hqspi)
2152 {
2153 return hqspi->ErrorCode;
2154 }
2155
2156
2157
2158
2159
2160
2161 HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)
2162 {
2163 HAL_StatusTypeDef status = HAL_OK;
2164 uint32_t tickstart = HAL_GetTick();
2165
2166
2167 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2168 {
2169
2170 __HAL_UNLOCK(hqspi);
2171
2172 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2173 {
2174
2175
2176 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2177
2178
2179 status = HAL_MDMA_Abort(hqspi->hmdma);
2180 if(status != HAL_OK)
2181 {
2182 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2183 }
2184 }
2185
2186 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2187 {
2188
2189 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2190
2191
2192 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, hqspi->Timeout);
2193
2194 if (status == HAL_OK)
2195 {
2196 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2197
2198
2199 status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);
2200 }
2201
2202 if (status == HAL_OK)
2203 {
2204
2205 CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);
2206
2207
2208 hqspi->State = HAL_QSPI_STATE_READY;
2209 }
2210 }
2211 else
2212 {
2213
2214 hqspi->State = HAL_QSPI_STATE_READY;
2215 }
2216 }
2217
2218 return status;
2219 }
2220
2221
2222
2223
2224
2225
2226 HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)
2227 {
2228 HAL_StatusTypeDef status = HAL_OK;
2229
2230
2231 if (((uint32_t)hqspi->State & 0x2U) != 0U)
2232 {
2233
2234 __HAL_UNLOCK(hqspi);
2235
2236
2237 hqspi->State = HAL_QSPI_STATE_ABORT;
2238
2239
2240 __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_TO | QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TC | QSPI_IT_TE));
2241
2242 if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)
2243 {
2244
2245
2246 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2247
2248
2249 hqspi->hmdma->XferAbortCallback = QSPI_DMAAbortCplt;
2250 if (HAL_MDMA_Abort_IT(hqspi->hmdma) != HAL_OK)
2251 {
2252
2253 hqspi->State = HAL_QSPI_STATE_READY;
2254
2255
2256 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2257 hqspi->AbortCpltCallback(hqspi);
2258 #else
2259 HAL_QSPI_AbortCpltCallback(hqspi);
2260 #endif
2261 }
2262 }
2263 else
2264 {
2265 if (__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_BUSY) != RESET)
2266 {
2267
2268 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2269
2270
2271 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2272
2273
2274 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2275 }
2276 else
2277 {
2278
2279 hqspi->State = HAL_QSPI_STATE_READY;
2280 }
2281 }
2282 }
2283 return status;
2284 }
2285
2286
2287
2288
2289
2290
2291 void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)
2292 {
2293 hqspi->Timeout = Timeout;
2294 }
2295
2296
2297
2298
2299
2300
2301 HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold)
2302 {
2303 HAL_StatusTypeDef status = HAL_OK;
2304
2305
2306 __HAL_LOCK(hqspi);
2307
2308 if(hqspi->State == HAL_QSPI_STATE_READY)
2309 {
2310
2311 hqspi->Init.FifoThreshold = Threshold;
2312
2313
2314 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,
2315 ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));
2316 }
2317 else
2318 {
2319 status = HAL_BUSY;
2320 }
2321
2322
2323 __HAL_UNLOCK(hqspi);
2324
2325
2326 return status;
2327 }
2328
2329
2330
2331
2332
2333 uint32_t HAL_QSPI_GetFifoThreshold(const QSPI_HandleTypeDef *hqspi)
2334 {
2335 return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> QUADSPI_CR_FTHRES_Pos) + 1U);
2336 }
2337
2338
2339
2340
2341
2342
2343
2344
2345 HAL_StatusTypeDef HAL_QSPI_SetFlashID(QSPI_HandleTypeDef *hqspi, uint32_t FlashID)
2346 {
2347 HAL_StatusTypeDef status = HAL_OK;
2348
2349
2350 assert_param(IS_QSPI_FLASH_ID(FlashID));
2351
2352
2353 __HAL_LOCK(hqspi);
2354
2355 if(hqspi->State == HAL_QSPI_STATE_READY)
2356 {
2357
2358 hqspi->Init.FlashID = FlashID;
2359
2360
2361 MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FSEL, FlashID);
2362 }
2363 else
2364 {
2365 status = HAL_BUSY;
2366 }
2367
2368
2369 __HAL_UNLOCK(hqspi);
2370
2371
2372 return status;
2373 }
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393 static void QSPI_DMARxCplt(MDMA_HandleTypeDef *hmdma)
2394 {
2395 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hmdma->Parent);
2396 hqspi->RxXferCount = 0U;
2397
2398
2399 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2400 }
2401
2402
2403
2404
2405
2406
2407 static void QSPI_DMATxCplt(MDMA_HandleTypeDef *hmdma)
2408 {
2409 QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hmdma->Parent);
2410 hqspi->TxXferCount = 0U;
2411
2412
2413 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2414 }
2415
2416
2417
2418
2419
2420
2421 static void QSPI_DMAError(MDMA_HandleTypeDef *hmdma)
2422 {
2423 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hmdma->Parent);
2424
2425 hqspi->RxXferCount = 0U;
2426 hqspi->TxXferCount = 0U;
2427 hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;
2428
2429
2430
2431 CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);
2432
2433
2434 (void)HAL_QSPI_Abort_IT(hqspi);
2435
2436 }
2437
2438
2439
2440
2441
2442
2443 static void QSPI_DMAAbortCplt(MDMA_HandleTypeDef *hmdma)
2444 {
2445 QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hmdma->Parent);
2446
2447 hqspi->RxXferCount = 0U;
2448 hqspi->TxXferCount = 0U;
2449
2450 if(hqspi->State == HAL_QSPI_STATE_ABORT)
2451 {
2452
2453
2454 __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);
2455
2456
2457 __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);
2458
2459
2460 SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);
2461 }
2462 else
2463 {
2464
2465
2466 hqspi->State = HAL_QSPI_STATE_READY;
2467
2468
2469 #if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)
2470 hqspi->ErrorCallback(hqspi);
2471 #else
2472 HAL_QSPI_ErrorCallback(hqspi);
2473 #endif
2474 }
2475 }
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486 static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,
2487 FlagStatus State, uint32_t Tickstart, uint32_t Timeout)
2488 {
2489
2490 while((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)
2491 {
2492
2493 if (Timeout != HAL_MAX_DELAY)
2494 {
2495 if(((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2496 {
2497 hqspi->State = HAL_QSPI_STATE_ERROR;
2498 hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;
2499
2500 return HAL_ERROR;
2501 }
2502 }
2503 }
2504 return HAL_OK;
2505 }
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519 static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)
2520 {
2521 assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));
2522
2523 if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))
2524 {
2525
2526 WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1U));
2527 }
2528
2529 if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)
2530 {
2531 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2532 {
2533
2534 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2535
2536 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2537 {
2538
2539
2540 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2541 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2542 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2543 cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |
2544 cmd->Instruction | FunctionalMode));
2545
2546 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2547 {
2548
2549 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2550 }
2551 }
2552 else
2553 {
2554
2555
2556 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2557 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2558 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2559 cmd->AddressMode | cmd->InstructionMode |
2560 cmd->Instruction | FunctionalMode));
2561 }
2562 }
2563 else
2564 {
2565 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2566 {
2567
2568
2569 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2570 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2571 cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |
2572 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2573
2574 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2575 {
2576
2577 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2578 }
2579 }
2580 else
2581 {
2582
2583
2584 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2585 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2586 cmd->AlternateByteMode | cmd->AddressMode |
2587 cmd->InstructionMode | cmd->Instruction | FunctionalMode));
2588 }
2589 }
2590 }
2591 else
2592 {
2593 if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)
2594 {
2595
2596 WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);
2597
2598 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2599 {
2600
2601
2602 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2603 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2604 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2605 cmd->AddressSize | cmd->AddressMode |
2606 cmd->InstructionMode | FunctionalMode));
2607
2608 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2609 {
2610
2611 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2612 }
2613 }
2614 else
2615 {
2616
2617
2618 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2619 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2620 cmd->AlternateBytesSize | cmd->AlternateByteMode |
2621 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2622 }
2623 }
2624 else
2625 {
2626 if (cmd->AddressMode != QSPI_ADDRESS_NONE)
2627 {
2628
2629
2630 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2631 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2632 cmd->AlternateByteMode | cmd->AddressSize |
2633 cmd->AddressMode | cmd->InstructionMode | FunctionalMode));
2634
2635 if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)
2636 {
2637
2638 WRITE_REG(hqspi->Instance->AR, cmd->Address);
2639 }
2640 }
2641 else
2642 {
2643
2644 if (cmd->DataMode != QSPI_DATA_NONE)
2645 {
2646
2647 WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |
2648 cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |
2649 cmd->AlternateByteMode | cmd->AddressMode |
2650 cmd->InstructionMode | FunctionalMode));
2651 }
2652 }
2653 }
2654 }
2655 }
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665 #endif
2666
2667
2668
2669
2670
2671
2672
2673
2674 #endif