Subversion Repositories FuelGauge

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 6
Line 56... Line 56...
56
          bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI
56
          bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI
57
          does not initiate a new transfer the following procedure has to be respected:
57
          does not initiate a new transfer the following procedure has to be respected:
58
          (##) HAL_SPI_DeInit()
58
          (##) HAL_SPI_DeInit()
59
          (##) HAL_SPI_Init()
59
          (##) HAL_SPI_Init()
60
     [..]
60
     [..]
61
       Data buffer address alignment restriction:
-
 
62
      (#) In case more than 1 byte is requested to be transferred, the HAL SPI uses 16-bit access for data buffer.
-
 
63
          But there is no support for unaligned accesses on the Cortex-M0 processor.
-
 
64
          So, if the user wants to transfer more than 1 byte, it shall ensure that 16-bit aligned address is used for:
-
 
65
          (##) pData parameter in HAL_SPI_Transmit(), HAL_SPI_Transmit_IT(), HAL_SPI_Receive() and HAL_SPI_Receive_IT()
-
 
66
          (##) pTxData and pRxData parameters in HAL_SPI_TransmitReceive() and HAL_SPI_TransmitReceive_IT()
-
 
67
      (#) There is no such restriction when going through DMA by using HAL_SPI_Transmit_DMA(), HAL_SPI_Receive_DMA()
-
 
68
          and HAL_SPI_TransmitReceive_DMA().
-
 
69
     [..]
-
 
70
       Callback registration:
61
       Callback registration:
71
 
62
 
72
      (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U
63
      (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U
73
          allows the user to configure dynamically the driver callbacks.
64
          allows the user to configure dynamically the driver callbacks.
74
          Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback.
65
          Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback.
Line 138... Line 129...
138
  Additional table :
129
  Additional table :
139
 
130
 
140
       DataSize = SPI_DATASIZE_8BIT:
131
       DataSize = SPI_DATASIZE_8BIT:
141
       +----------------------------------------------------------------------------------------------+
132
       +----------------------------------------------------------------------------------------------+
142
       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |
133
       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |
143
       | Process | Tranfert mode  |---------------------|----------------------|----------------------|
134
       | Process | Transfer mode  |---------------------|----------------------|----------------------|
144
       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |
135
       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |
145
       |==============================================================================================|
136
       |==============================================================================================|
146
       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
137
       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
147
       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
138
       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
148
       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
139
       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
Line 163... Line 154...
163
       +----------------------------------------------------------------------------------------------+
154
       +----------------------------------------------------------------------------------------------+
164
 
155
 
165
       DataSize = SPI_DATASIZE_16BIT:
156
       DataSize = SPI_DATASIZE_16BIT:
166
       +----------------------------------------------------------------------------------------------+
157
       +----------------------------------------------------------------------------------------------+
167
       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |
158
       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |
168
       | Process | Tranfert mode  |---------------------|----------------------|----------------------|
159
       | Process | Transfer mode  |---------------------|----------------------|----------------------|
169
       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |
160
       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |
170
       |==============================================================================================|
161
       |==============================================================================================|
171
       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
162
       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |
172
       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
163
       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|
173
       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
164
       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |
Line 344... Line 335...
344
  assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
335
  assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));
345
  if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)
336
  if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)
346
  {
337
  {
347
    assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
338
    assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));
348
    assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
339
    assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));
-
 
340
 
-
 
341
    if (hspi->Init.Mode == SPI_MODE_MASTER)
-
 
342
    {
-
 
343
      assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
-
 
344
    }
-
 
345
    else
-
 
346
    {
-
 
347
      /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */
-
 
348
      hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
-
 
349
    }
-
 
350
  }
-
 
351
  else
-
 
352
  {
-
 
353
    assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));
-
 
354
 
-
 
355
    /* Force polarity and phase to TI protocaol requirements */
-
 
356
    hspi->Init.CLKPolarity = SPI_POLARITY_LOW;
-
 
357
    hspi->Init.CLKPhase    = SPI_PHASE_1EDGE;
349
  }
358
  }
350
#if (USE_SPI_CRC != 0U)
359
#if (USE_SPI_CRC != 0U)
351
  assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
360
  assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));
352
  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
361
  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
353
  {
362
  {
Line 407... Line 416...
407
  {
416
  {
408
    /* CRC must be disabled */
417
    /* CRC must be disabled */
409
    hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
418
    hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
410
  }
419
  }
411
 
420
 
412
  /* Align the CRC Length on the data size */
-
 
413
  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)
-
 
414
  {
-
 
415
    /* CRC Length aligned on the data size : value set by default */
-
 
416
    if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
-
 
417
    {
-
 
418
      hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT;
-
 
419
    }
-
 
420
    else
-
 
421
    {
-
 
422
      hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT;
-
 
423
    }
-
 
424
  }
-
 
425
 
-
 
426
  /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
421
  /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
427
  /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management,
422
  /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management,
428
  Communication speed, First bit and CRC calculation state */
423
  Communication speed, First bit and CRC calculation state */
429
  WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction |
424
  WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) |
-
 
425
                                  (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) |
430
                                  hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
426
                                  (hspi->Init.CLKPolarity & SPI_CR1_CPOL) |
-
 
427
                                  (hspi->Init.CLKPhase & SPI_CR1_CPHA) |
-
 
428
                                  (hspi->Init.NSS & SPI_CR1_SSM) |
431
                                  hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit  | hspi->Init.CRCCalculation));
429
                                  (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) |
-
 
430
                                  (hspi->Init.FirstBit  & SPI_CR1_LSBFIRST) |
-
 
431
                                  (hspi->Init.CRCCalculation & SPI_CR1_CRCEN)));
432
#if (USE_SPI_CRC != 0U)
432
#if (USE_SPI_CRC != 0U)
433
  /* Configure : CRC Length */
433
  /*---------------------------- SPIx CRCL Configuration -------------------*/
434
  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
434
  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
435
  {
435
  {
-
 
436
    /* Align the CRC Length on the data size */
-
 
437
    if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)
-
 
438
    {
-
 
439
      /* CRC Length aligned on the data size : value set by default */
-
 
440
      if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
-
 
441
      {
-
 
442
        hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT;
-
 
443
      }
-
 
444
      else
-
 
445
      {
-
 
446
        hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT;
-
 
447
      }
-
 
448
    }
-
 
449
 
-
 
450
    /* Configure : CRC Length */
-
 
451
    if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
-
 
452
    {
436
    hspi->Instance->CR1 |= SPI_CR1_CRCL;
453
      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCL);
-
 
454
    }
437
  }
455
  }
438
#endif /* USE_SPI_CRC */
456
#endif /* USE_SPI_CRC */
439
 
457
 
440
  /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */
458
  /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */
441
  WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | hspi->Init.TIMode |
459
  WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) |
-
 
460
                                  (hspi->Init.TIMode & SPI_CR2_FRF) |
442
                                  hspi->Init.NSSPMode | hspi->Init.DataSize) | frxth);
461
                                  (hspi->Init.NSSPMode & SPI_CR2_NSSP) |
-
 
462
                                  (hspi->Init.DataSize & SPI_CR2_DS_Msk) |
-
 
463
                                  (frxth & SPI_CR2_FRXTH)));
443
 
464
 
444
#if (USE_SPI_CRC != 0U)
465
#if (USE_SPI_CRC != 0U)
445
  /*---------------------------- SPIx CRCPOLY Configuration ------------------*/
466
  /*---------------------------- SPIx CRCPOLY Configuration ------------------*/
446
  /* Configure : CRC Polynomial */
467
  /* Configure : CRC Polynomial */
447
  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
468
  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
448
  {
469
  {
449
    WRITE_REG(hspi->Instance->CRCPR, hspi->Init.CRCPolynomial);
470
    WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk));
450
  }
471
  }
451
#endif /* USE_SPI_CRC */
472
#endif /* USE_SPI_CRC */
452
 
473
 
453
#if defined(SPI_I2SCFGR_I2SMOD)
474
#if defined(SPI_I2SCFGR_I2SMOD)
454
  /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */
475
  /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */
Line 803... Line 824...
803
{
824
{
804
  uint32_t tickstart;
825
  uint32_t tickstart;
805
  HAL_StatusTypeDef errorcode = HAL_OK;
826
  HAL_StatusTypeDef errorcode = HAL_OK;
806
  uint16_t initial_TxXferCount;
827
  uint16_t initial_TxXferCount;
807
 
828
 
808
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
809
  {
-
 
810
    /* in this case, 16-bit access is performed on Data
-
 
811
       So, check Data is 16-bit aligned address */
-
 
812
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
-
 
813
  }
-
 
814
 
-
 
815
  /* Check Direction parameter */
829
  /* Check Direction parameter */
816
  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
830
  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
817
 
831
 
818
  /* Process Locked */
832
  /* Process Locked */
819
  __HAL_LOCK(hspi);
833
  __HAL_LOCK(hspi);
Line 849... Line 863...
849
  hspi->RxISR       = NULL;
863
  hspi->RxISR       = NULL;
850
 
864
 
851
  /* Configure communication direction : 1Line */
865
  /* Configure communication direction : 1Line */
852
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
866
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
853
  {
867
  {
-
 
868
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
869
    __HAL_SPI_DISABLE(hspi);
854
    SPI_1LINE_TX(hspi);
870
    SPI_1LINE_TX(hspi);
855
  }
871
  }
856
 
872
 
857
#if (USE_SPI_CRC != 0U)
873
#if (USE_SPI_CRC != 0U)
858
  /* Reset CRC Calculation */
874
  /* Reset CRC Calculation */
Line 902... Line 918...
902
  /* Transmit data in 8 Bit mode */
918
  /* Transmit data in 8 Bit mode */
903
  else
919
  else
904
  {
920
  {
905
    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
921
    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
906
    {
922
    {
907
      if (hspi->TxXferCount > 1U)
-
 
908
      {
-
 
909
        /* write on the data register in packing mode */
-
 
910
        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
-
 
911
        hspi->pTxBuffPtr += sizeof(uint16_t);
-
 
912
        hspi->TxXferCount -= 2U;
-
 
913
      }
-
 
914
      else
-
 
915
      {
-
 
916
        *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
923
      *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
917
        hspi->pTxBuffPtr ++;
924
      hspi->pTxBuffPtr += sizeof(uint8_t);
918
        hspi->TxXferCount--;
925
      hspi->TxXferCount--;
919
      }
-
 
920
    }
926
    }
921
    while (hspi->TxXferCount > 0U)
927
    while (hspi->TxXferCount > 0U)
922
    {
928
    {
923
      /* Wait until TXE flag is set to send data */
929
      /* Wait until TXE flag is set to send data */
924
      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
930
      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
925
      {
931
      {
926
        if (hspi->TxXferCount > 1U)
-
 
927
        {
-
 
928
          /* write on the data register in packing mode */
-
 
929
          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
932
        *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
930
          hspi->pTxBuffPtr += sizeof(uint16_t);
933
        hspi->pTxBuffPtr += sizeof(uint8_t);
931
          hspi->TxXferCount -= 2U;
-
 
932
        }
-
 
933
        else
-
 
934
        {
-
 
935
          *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
-
 
936
          hspi->pTxBuffPtr++;
-
 
937
          hspi->TxXferCount--;
934
        hspi->TxXferCount--;
938
        }
-
 
939
      }
935
      }
940
      else
936
      else
941
      {
937
      {
942
        /* Timeout management */
938
        /* Timeout management */
943
        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
939
        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
Line 989... Line 985...
989
  * @param  Timeout Timeout duration
985
  * @param  Timeout Timeout duration
990
  * @retval HAL status
986
  * @retval HAL status
991
  */
987
  */
992
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
988
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
993
{
989
{
-
 
990
#if (USE_SPI_CRC != 0U)
-
 
991
  __IO uint32_t tmpreg = 0U;
-
 
992
  __IO uint8_t  * ptmpreg8;
-
 
993
  __IO uint8_t  tmpreg8 = 0;
-
 
994
#endif /* USE_SPI_CRC */
994
  uint32_t tickstart;
995
  uint32_t tickstart;
995
  HAL_StatusTypeDef errorcode = HAL_OK;
996
  HAL_StatusTypeDef errorcode = HAL_OK;
996
 
997
 
997
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
998
  {
-
 
999
    /* in this case, 16-bit access is performed on Data
-
 
1000
       So, check Data is 16-bit aligned address */
-
 
1001
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
-
 
1002
  }
-
 
1003
 
-
 
1004
  if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
998
  if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))
1005
  {
999
  {
1006
    hspi->State = HAL_SPI_STATE_BUSY_RX;
1000
    hspi->State = HAL_SPI_STATE_BUSY_RX;
1007
    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1001
    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1008
    return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
1002
    return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);
Line 1063... Line 1057...
1063
  }
1057
  }
1064
 
1058
 
1065
  /* Configure communication direction: 1Line */
1059
  /* Configure communication direction: 1Line */
1066
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1060
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1067
  {
1061
  {
-
 
1062
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
1063
    __HAL_SPI_DISABLE(hspi);
1068
    SPI_1LINE_RX(hspi);
1064
    SPI_1LINE_RX(hspi);
1069
  }
1065
  }
1070
 
1066
 
1071
  /* Check if the SPI is already enabled */
1067
  /* Check if the SPI is already enabled */
1072
  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
1068
  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
Line 1160... Line 1156...
1160
 
1156
 
1161
    /* Read CRC to Flush DR and RXNE flag */
1157
    /* Read CRC to Flush DR and RXNE flag */
1162
    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1158
    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1163
    {
1159
    {
1164
      /* Read 16bit CRC */
1160
      /* Read 16bit CRC */
1165
      READ_REG(hspi->Instance->DR);
1161
      tmpreg = READ_REG(hspi->Instance->DR);
-
 
1162
      /* To avoid GCC warning */
-
 
1163
      UNUSED(tmpreg);
1166
    }
1164
    }
1167
    else
1165
    else
1168
    {
1166
    {
-
 
1167
      /* Initialize the 8bit temporary pointer */
-
 
1168
      ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
1169
      /* Read 8bit CRC */
1169
      /* Read 8bit CRC */
-
 
1170
      tmpreg8 = *ptmpreg8;
1170
      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
1171
      /* To avoid GCC warning */
-
 
1172
      UNUSED(tmpreg8);
1171
 
1173
 
1172
      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))
1174
      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))
1173
      {
1175
      {
1174
        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1176
        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1175
        {
1177
        {
Line 1177... Line 1179...
1177
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1179
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1178
          errorcode = HAL_TIMEOUT;
1180
          errorcode = HAL_TIMEOUT;
1179
          goto error;
1181
          goto error;
1180
        }
1182
        }
1181
        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
1183
        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
-
 
1184
        tmpreg8 = *ptmpreg8;
1182
        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
1185
        /* To avoid GCC warning */
-
 
1186
        UNUSED(tmpreg8);
1183
      }
1187
      }
1184
    }
1188
    }
1185
  }
1189
  }
1186
#endif /* USE_SPI_CRC */
1190
#endif /* USE_SPI_CRC */
1187
 
1191
 
Line 1223... Line 1227...
1223
  */
1227
  */
1224
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
1228
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
1225
                                          uint32_t Timeout)
1229
                                          uint32_t Timeout)
1226
{
1230
{
1227
  uint16_t             initial_TxXferCount;
1231
  uint16_t             initial_TxXferCount;
1228
  uint16_t             initial_RxXferCount;
-
 
1229
  uint32_t             tmp_mode;
1232
  uint32_t             tmp_mode;
1230
  HAL_SPI_StateTypeDef tmp_state;
1233
  HAL_SPI_StateTypeDef tmp_state;
1231
  uint32_t             tickstart;
1234
  uint32_t             tickstart;
1232
#if (USE_SPI_CRC != 0U)
1235
#if (USE_SPI_CRC != 0U)
-
 
1236
  __IO uint32_t tmpreg = 0U;
1233
  uint32_t             spi_cr1;
1237
  uint32_t             spi_cr1;
1234
  uint32_t             spi_cr2;
1238
  uint32_t             spi_cr2;
-
 
1239
  __IO uint8_t  * ptmpreg8;
-
 
1240
  __IO uint8_t  tmpreg8 = 0;
1235
#endif /* USE_SPI_CRC */
1241
#endif /* USE_SPI_CRC */
1236
 
1242
 
1237
  /* Variable used to alternate Rx and Tx during transfer */
1243
  /* Variable used to alternate Rx and Tx during transfer */
1238
  uint32_t             txallowed = 1U;
1244
  uint32_t             txallowed = 1U;
1239
  HAL_StatusTypeDef    errorcode = HAL_OK;
1245
  HAL_StatusTypeDef    errorcode = HAL_OK;
1240
 
1246
 
1241
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
1242
  {
-
 
1243
    /* in this case, 16-bit access is performed on Data
-
 
1244
       So, check Data is 16-bit aligned address */
-
 
1245
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pTxData));
-
 
1246
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pRxData));
-
 
1247
  }
-
 
1248
 
-
 
1249
  /* Check Direction parameter */
1247
  /* Check Direction parameter */
1250
  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1248
  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1251
 
1249
 
1252
  /* Process Locked */
1250
  /* Process Locked */
1253
  __HAL_LOCK(hspi);
1251
  __HAL_LOCK(hspi);
Line 1257... Line 1255...
1257
 
1255
 
1258
  /* Init temporary variables */
1256
  /* Init temporary variables */
1259
  tmp_state           = hspi->State;
1257
  tmp_state           = hspi->State;
1260
  tmp_mode            = hspi->Init.Mode;
1258
  tmp_mode            = hspi->Init.Mode;
1261
  initial_TxXferCount = Size;
1259
  initial_TxXferCount = Size;
1262
  initial_RxXferCount = Size;
-
 
1263
#if (USE_SPI_CRC != 0U)
1260
#if (USE_SPI_CRC != 0U)
1264
  spi_cr1             = READ_REG(hspi->Instance->CR1);
1261
  spi_cr1             = READ_REG(hspi->Instance->CR1);
1265
  spi_cr2             = READ_REG(hspi->Instance->CR2);
1262
  spi_cr2             = READ_REG(hspi->Instance->CR2);
1266
#endif /* USE_SPI_CRC */
1263
#endif /* USE_SPI_CRC */
1267
 
1264
 
Line 1304... Line 1301...
1304
    SPI_RESET_CRC(hspi);
1301
    SPI_RESET_CRC(hspi);
1305
  }
1302
  }
1306
#endif /* USE_SPI_CRC */
1303
#endif /* USE_SPI_CRC */
1307
 
1304
 
1308
  /* Set the Rx Fifo threshold */
1305
  /* Set the Rx Fifo threshold */
1309
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U))
1306
  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
1310
  {
1307
  {
1311
    /* Set fiforxthreshold according the reception data length: 16bit */
1308
    /* Set fiforxthreshold according the reception data length: 16bit */
1312
    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1309
    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
1313
  }
1310
  }
1314
  else
1311
  else
Line 1377... Line 1374...
1377
  /* Transmit and Receive data in 8 Bit mode */
1374
  /* Transmit and Receive data in 8 Bit mode */
1378
  else
1375
  else
1379
  {
1376
  {
1380
    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
1377
    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))
1381
    {
1378
    {
1382
      if (hspi->TxXferCount > 1U)
-
 
1383
      {
-
 
1384
        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
1379
      *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
1385
        hspi->pTxBuffPtr += sizeof(uint16_t);
1380
      hspi->pTxBuffPtr += sizeof(uint8_t);
1386
        hspi->TxXferCount -= 2U;
-
 
1387
      }
-
 
1388
      else
-
 
1389
      {
-
 
1390
        *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
-
 
1391
        hspi->pTxBuffPtr++;
-
 
1392
        hspi->TxXferCount--;
1381
      hspi->TxXferCount--;
1393
      }
-
 
1394
    }
1382
    }
1395
    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))
1383
    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))
1396
    {
1384
    {
1397
      /* Check TXE flag */
1385
      /* Check TXE flag */
1398
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))
1386
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))
1399
      {
1387
      {
1400
        if (hspi->TxXferCount > 1U)
-
 
1401
        {
-
 
1402
          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);
-
 
1403
          hspi->pTxBuffPtr += sizeof(uint16_t);
-
 
1404
          hspi->TxXferCount -= 2U;
-
 
1405
        }
-
 
1406
        else
-
 
1407
        {
-
 
1408
          *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
1388
        *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);
1409
          hspi->pTxBuffPtr++;
1389
        hspi->pTxBuffPtr++;
1410
          hspi->TxXferCount--;
1390
        hspi->TxXferCount--;
1411
        }
-
 
1412
        /* Next Data is a reception (Rx). Tx not allowed */
1391
        /* Next Data is a reception (Rx). Tx not allowed */
1413
        txallowed = 0U;
1392
        txallowed = 0U;
1414
 
1393
 
1415
#if (USE_SPI_CRC != 0U)
1394
#if (USE_SPI_CRC != 0U)
1416
        /* Enable CRC Transmission */
1395
        /* Enable CRC Transmission */
Line 1427... Line 1406...
1427
      }
1406
      }
1428
 
1407
 
1429
      /* Wait until RXNE flag is reset */
1408
      /* Wait until RXNE flag is reset */
1430
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))
1409
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))
1431
      {
1410
      {
1432
        if (hspi->RxXferCount > 1U)
-
 
1433
        {
-
 
1434
          *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;
-
 
1435
          hspi->pRxBuffPtr += sizeof(uint16_t);
-
 
1436
          hspi->RxXferCount -= 2U;
-
 
1437
          if (hspi->RxXferCount <= 1U)
-
 
1438
          {
-
 
1439
            /* Set RX Fifo threshold before to switch on 8 bit data size */
-
 
1440
            SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
-
 
1441
          }
-
 
1442
        }
-
 
1443
        else
-
 
1444
        {
-
 
1445
          (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;
1411
        (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;
1446
          hspi->pRxBuffPtr++;
1412
        hspi->pRxBuffPtr++;
1447
          hspi->RxXferCount--;
1413
        hspi->RxXferCount--;
1448
        }
-
 
1449
        /* Next Data is a Transmission (Tx). Tx is allowed */
1414
        /* Next Data is a Transmission (Tx). Tx is allowed */
1450
        txallowed = 1U;
1415
        txallowed = 1U;
1451
      }
1416
      }
1452
      if ((((HAL_GetTick() - tickstart) >=  Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U))
1417
      if ((((HAL_GetTick() - tickstart) >=  Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U))
1453
      {
1418
      {
Line 1471... Line 1436...
1471
    }
1436
    }
1472
    /* Read CRC */
1437
    /* Read CRC */
1473
    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1438
    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)
1474
    {
1439
    {
1475
      /* Read 16bit CRC */
1440
      /* Read 16bit CRC */
1476
      READ_REG(hspi->Instance->DR);
1441
      tmpreg = READ_REG(hspi->Instance->DR);
-
 
1442
      /* To avoid GCC warning */
-
 
1443
      UNUSED(tmpreg);
1477
    }
1444
    }
1478
    else
1445
    else
1479
    {
1446
    {
-
 
1447
      /* Initialize the 8bit temporary pointer */
-
 
1448
      ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
1480
      /* Read 8bit CRC */
1449
      /* Read 8bit CRC */
-
 
1450
      tmpreg8 = *ptmpreg8;
1481
      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
1451
      /* To avoid GCC warning */
-
 
1452
      UNUSED(tmpreg8);
1482
 
1453
 
1483
      if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
1454
      if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
1484
      {
1455
      {
1485
        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1456
        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)
1486
        {
1457
        {
Line 1488... Line 1459...
1488
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1459
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
1489
          errorcode = HAL_TIMEOUT;
1460
          errorcode = HAL_TIMEOUT;
1490
          goto error;
1461
          goto error;
1491
        }
1462
        }
1492
        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
1463
        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
-
 
1464
        tmpreg8 = *ptmpreg8;
1493
        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
1465
        /* To avoid GCC warning */
-
 
1466
        UNUSED(tmpreg8);
1494
      }
1467
      }
1495
    }
1468
    }
1496
  }
1469
  }
1497
 
1470
 
1498
  /* Check if CRC error occurred */
1471
  /* Check if CRC error occurred */
Line 1529... Line 1502...
1529
  */
1502
  */
1530
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1503
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1531
{
1504
{
1532
  HAL_StatusTypeDef errorcode = HAL_OK;
1505
  HAL_StatusTypeDef errorcode = HAL_OK;
1533
 
1506
 
1534
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
1535
  {
-
 
1536
    /* in this case, 16-bit access is performed on Data
-
 
1537
       So, check Data is 16-bit aligned address */
-
 
1538
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
-
 
1539
  }
-
 
1540
 
-
 
1541
  /* Check Direction parameter */
1507
  /* Check Direction parameter */
1542
  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
1508
  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
1543
 
1509
 
1544
  /* Process Locked */
1510
  /* Process Locked */
1545
  __HAL_LOCK(hspi);
1511
  __HAL_LOCK(hspi);
Line 1580... Line 1546...
1580
  }
1546
  }
1581
 
1547
 
1582
  /* Configure communication direction : 1Line */
1548
  /* Configure communication direction : 1Line */
1583
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1549
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1584
  {
1550
  {
-
 
1551
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
1552
    __HAL_SPI_DISABLE(hspi);
1585
    SPI_1LINE_TX(hspi);
1553
    SPI_1LINE_TX(hspi);
1586
  }
1554
  }
1587
 
1555
 
1588
#if (USE_SPI_CRC != 0U)
1556
#if (USE_SPI_CRC != 0U)
1589
  /* Reset CRC Calculation */
1557
  /* Reset CRC Calculation */
Line 1619... Line 1587...
1619
  */
1587
  */
1620
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1588
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
1621
{
1589
{
1622
  HAL_StatusTypeDef errorcode = HAL_OK;
1590
  HAL_StatusTypeDef errorcode = HAL_OK;
1623
 
1591
 
1624
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
1625
  {
-
 
1626
    /* in this case, 16-bit access is performed on Data
-
 
1627
       So, check Data is 16-bit aligned address */
-
 
1628
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
-
 
1629
  }
-
 
1630
 
-
 
1631
  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
1592
  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
1632
  {
1593
  {
1633
    hspi->State = HAL_SPI_STATE_BUSY_RX;
1594
    hspi->State = HAL_SPI_STATE_BUSY_RX;
1634
    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1595
    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
1635
    return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
1596
    return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
Line 1678... Line 1639...
1678
  }
1639
  }
1679
 
1640
 
1680
  /* Configure communication direction : 1Line */
1641
  /* Configure communication direction : 1Line */
1681
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1642
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1682
  {
1643
  {
-
 
1644
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
1645
    __HAL_SPI_DISABLE(hspi);
1683
    SPI_1LINE_RX(hspi);
1646
    SPI_1LINE_RX(hspi);
1684
  }
1647
  }
1685
 
1648
 
1686
#if (USE_SPI_CRC != 0U)
1649
#if (USE_SPI_CRC != 0U)
1687
  /* Reset CRC Calculation */
1650
  /* Reset CRC Calculation */
Line 1733... Line 1696...
1733
{
1696
{
1734
  uint32_t             tmp_mode;
1697
  uint32_t             tmp_mode;
1735
  HAL_SPI_StateTypeDef tmp_state;
1698
  HAL_SPI_StateTypeDef tmp_state;
1736
  HAL_StatusTypeDef    errorcode = HAL_OK;
1699
  HAL_StatusTypeDef    errorcode = HAL_OK;
1737
 
1700
 
1738
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (Size > 1U)))
-
 
1739
  {
-
 
1740
    /* in this case, 16-bit access is performed on Data
-
 
1741
       So, check Data is 16-bit aligned address */
-
 
1742
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pTxData));
-
 
1743
    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pRxData));
-
 
1744
  }
-
 
1745
 
-
 
1746
  /* Check Direction parameter */
1701
  /* Check Direction parameter */
1747
  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1702
  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
1748
 
1703
 
1749
  /* Process locked */
1704
  /* Process locked */
1750
  __HAL_LOCK(hspi);
1705
  __HAL_LOCK(hspi);
Line 1886... Line 1841...
1886
  hspi->RxXferCount = 0U;
1841
  hspi->RxXferCount = 0U;
1887
 
1842
 
1888
  /* Configure communication direction : 1Line */
1843
  /* Configure communication direction : 1Line */
1889
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1844
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1890
  {
1845
  {
-
 
1846
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
1847
    __HAL_SPI_DISABLE(hspi);
1891
    SPI_1LINE_TX(hspi);
1848
    SPI_1LINE_TX(hspi);
1892
  }
1849
  }
1893
 
1850
 
1894
#if (USE_SPI_CRC != 0U)
1851
#if (USE_SPI_CRC != 0U)
1895
  /* Reset CRC Calculation */
1852
  /* Reset CRC Calculation */
Line 2016... Line 1973...
2016
  hspi->TxXferCount = 0U;
1973
  hspi->TxXferCount = 0U;
2017
 
1974
 
2018
  /* Configure communication direction : 1Line */
1975
  /* Configure communication direction : 1Line */
2019
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
1976
  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)
2020
  {
1977
  {
-
 
1978
    /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */
-
 
1979
    __HAL_SPI_DISABLE(hspi);
2021
    SPI_1LINE_RX(hspi);
1980
    SPI_1LINE_RX(hspi);
2022
  }
1981
  }
2023
 
1982
 
2024
#if (USE_SPI_CRC != 0U)
1983
#if (USE_SPI_CRC != 0U)
2025
  /* Reset CRC Calculation */
1984
  /* Reset CRC Calculation */
Line 2035... Line 1994...
2035
  {
1994
  {
2036
    /* Restriction the DMA data received is not allowed in this mode */
1995
    /* Restriction the DMA data received is not allowed in this mode */
2037
    errorcode = HAL_ERROR;
1996
    errorcode = HAL_ERROR;
2038
    goto error;
1997
    goto error;
2039
  }
1998
  }
2040
#endif
-
 
-
 
1999
#endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F058xx */
2041
 
2000
 
2042
  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2001
  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);
2043
  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
2002
  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
2044
  {
2003
  {
2045
    /* Set RX Fifo threshold according the reception data length: 16bit */
2004
    /* Set RX Fifo threshold according the reception data length: 16bit */
Line 2188... Line 2147...
2188
  {
2147
  {
2189
    /* Restriction the DMA data received is not allowed in this mode */
2148
    /* Restriction the DMA data received is not allowed in this mode */
2190
    errorcode = HAL_ERROR;
2149
    errorcode = HAL_ERROR;
2191
    goto error;
2150
    goto error;
2192
  }
2151
  }
2193
#endif
-
 
-
 
2152
#endif /* STM32F030x6 || STM32F030x8 || STM32F031x6 || STM32F038xx || STM32F051x8 || STM32F058xx */
2194
 
2153
 
2195
  /* Reset the threshold bit */
2154
  /* Reset the threshold bit */
2196
  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX);
2155
  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX);
2197
 
2156
 
2198
  /* The packing mode management is enabled by the DMA settings according the spi data size */
2157
  /* The packing mode management is enabled by the DMA settings according the spi data size */
Line 3076... Line 3035...
3076
  */
3035
  */
3077
static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
3036
static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
3078
{
3037
{
3079
  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3038
  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3080
  uint32_t tickstart;
3039
  uint32_t tickstart;
-
 
3040
#if (USE_SPI_CRC != 0U)
-
 
3041
  __IO uint32_t tmpreg = 0U;
-
 
3042
  __IO uint8_t  * ptmpreg8;
-
 
3043
  __IO uint8_t  tmpreg8 = 0;
-
 
3044
#endif /* USE_SPI_CRC */
3081
 
3045
 
3082
  /* Init tickstart for timeout management*/
3046
  /* Init tickstart for timeout management*/
3083
  tickstart = HAL_GetTick();
3047
  tickstart = HAL_GetTick();
3084
 
3048
 
3085
  /* DMA Normal Mode */
3049
  /* DMA Normal Mode */
Line 3100... Line 3064...
3100
      }
3064
      }
3101
      /* Read CRC */
3065
      /* Read CRC */
3102
      if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
3066
      if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
3103
      {
3067
      {
3104
        /* Read 16bit CRC */
3068
        /* Read 16bit CRC */
3105
        READ_REG(hspi->Instance->DR);
3069
        tmpreg = READ_REG(hspi->Instance->DR);
-
 
3070
        /* To avoid GCC warning */
-
 
3071
        UNUSED(tmpreg);
3106
      }
3072
      }
3107
      else
3073
      else
3108
      {
3074
      {
-
 
3075
        /* Initialize the 8bit temporary pointer */
-
 
3076
        ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3109
        /* Read 8bit CRC */
3077
        /* Read 8bit CRC */
-
 
3078
        tmpreg8 = *ptmpreg8;
3110
        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
3079
        /* To avoid GCC warning */
-
 
3080
        UNUSED(tmpreg8);
3111
 
3081
 
3112
        if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
3082
        if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)
3113
        {
3083
        {
3114
          if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3084
          if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3115
          {
3085
          {
3116
            /* Error on the CRC reception */
3086
            /* Error on the CRC reception */
3117
            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3087
            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3118
          }
3088
          }
3119
          /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
3089
          /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */
-
 
3090
          tmpreg8 = *ptmpreg8;
3120
          READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
3091
          /* To avoid GCC warning */
-
 
3092
          UNUSED(tmpreg8);
3121
        }
3093
        }
3122
      }
3094
      }
3123
    }
3095
    }
3124
#endif /* USE_SPI_CRC */
3096
#endif /* USE_SPI_CRC */
3125
 
3097
 
-
 
3098
    /* Check if we are in Master RX 2 line mode */
-
 
3099
    if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
-
 
3100
    {
3126
    /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */
3101
      /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */
3127
    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
3102
      CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
-
 
3103
    }
-
 
3104
    else
-
 
3105
    {
-
 
3106
      /* Normal case */
-
 
3107
      CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);
-
 
3108
    }
3128
 
3109
 
3129
    /* Check the end of the transaction */
3110
    /* Check the end of the transaction */
3130
    if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3111
    if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3131
    {
3112
    {
3132
      hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
3113
      hspi->ErrorCode = HAL_SPI_ERROR_FLAG;
Line 3171... Line 3152...
3171
  */
3152
  */
3172
static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3153
static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
3173
{
3154
{
3174
  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3155
  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */
3175
  uint32_t tickstart;
3156
  uint32_t tickstart;
-
 
3157
#if (USE_SPI_CRC != 0U)
-
 
3158
  __IO uint32_t tmpreg = 0U;
-
 
3159
  __IO uint8_t  * ptmpreg8;
-
 
3160
  __IO uint8_t  tmpreg8 = 0;
-
 
3161
#endif /* USE_SPI_CRC */
3176
 
3162
 
3177
  /* Init tickstart for timeout management*/
3163
  /* Init tickstart for timeout management*/
3178
  tickstart = HAL_GetTick();
3164
  tickstart = HAL_GetTick();
3179
 
3165
 
3180
  /* DMA Normal Mode */
3166
  /* DMA Normal Mode */
Line 3193... Line 3179...
3193
                                          tickstart) != HAL_OK)
3179
                                          tickstart) != HAL_OK)
3194
        {
3180
        {
3195
          /* Error on the CRC reception */
3181
          /* Error on the CRC reception */
3196
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3182
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3197
        }
3183
        }
3198
        /* Read CRC to Flush DR and RXNE flag */
3184
        /* Initialize the 8bit temporary pointer */
3199
        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
3185
        ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
-
 
3186
        /* Read 8bit CRC */
-
 
3187
        tmpreg8 = *ptmpreg8;
-
 
3188
        /* To avoid GCC warning */
-
 
3189
        UNUSED(tmpreg8);
3200
      }
3190
      }
3201
      else
3191
      else
3202
      {
3192
      {
3203
        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3193
        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)
3204
        {
3194
        {
3205
          /* Error on the CRC reception */
3195
          /* Error on the CRC reception */
3206
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3196
          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);
3207
        }
3197
        }
3208
        /* Read CRC to Flush DR and RXNE flag */
3198
        /* Read CRC to Flush DR and RXNE flag */
3209
        READ_REG(hspi->Instance->DR);
3199
        tmpreg = READ_REG(hspi->Instance->DR);
-
 
3200
        /* To avoid GCC warning */
-
 
3201
        UNUSED(tmpreg);
3210
      }
3202
      }
3211
    }
3203
    }
3212
#endif /* USE_SPI_CRC */
3204
#endif /* USE_SPI_CRC */
3213
 
3205
 
3214
    /* Check the end of the transaction */
3206
    /* Check the end of the transaction */
Line 3539... Line 3531...
3539
  *               the configuration information for SPI module.
3531
  *               the configuration information for SPI module.
3540
  * @retval None
3532
  * @retval None
3541
  */
3533
  */
3542
static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3534
static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3543
{
3535
{
-
 
3536
  __IO uint8_t  * ptmpreg8;
-
 
3537
  __IO uint8_t  tmpreg8 = 0;
-
 
3538
 
3544
  /* Read 8bit CRC to flush Data Regsiter */
3539
  /* Initialize the 8bit temporary pointer */
3545
  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
3540
  ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
-
 
3541
  /* Read 8bit CRC to flush Data Register */
-
 
3542
  tmpreg8 = *ptmpreg8;
-
 
3543
  /* To avoid GCC warning */
-
 
3544
  UNUSED(tmpreg8);
3546
 
3545
 
3547
  hspi->CRCSize--;
3546
  hspi->CRCSize--;
3548
 
3547
 
3549
  /* Check end of the reception */
3548
  /* Check end of the reception */
3550
  if (hspi->CRCSize == 0U)
3549
  if (hspi->CRCSize == 0U)
Line 3647... Line 3646...
3647
  *               the configuration information for SPI module.
3646
  *               the configuration information for SPI module.
3648
  * @retval None
3647
  * @retval None
3649
  */
3648
  */
3650
static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3649
static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3651
{
3650
{
-
 
3651
  __IO uint32_t tmpreg = 0U;
-
 
3652
 
3652
  /* Read 16bit CRC to flush Data Regsiter */
3653
  /* Read 16bit CRC to flush Data Register */
3653
  READ_REG(hspi->Instance->DR);
3654
  tmpreg = READ_REG(hspi->Instance->DR);
-
 
3655
  /* To avoid GCC warning */
-
 
3656
  UNUSED(tmpreg);  
3654
 
3657
 
3655
  /* Disable RXNE interrupt */
3658
  /* Disable RXNE interrupt */
3656
  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);
3659
  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);
3657
 
3660
 
3658
  SPI_CloseRxTx_ISR(hspi);
3661
  SPI_CloseRxTx_ISR(hspi);
Line 3703... Line 3706...
3703
  *               the configuration information for SPI module.
3706
  *               the configuration information for SPI module.
3704
  * @retval None
3707
  * @retval None
3705
  */
3708
  */
3706
static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3709
static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)
3707
{
3710
{
-
 
3711
  __IO uint8_t  * ptmpreg8;
-
 
3712
  __IO uint8_t  tmpreg8 = 0;
-
 
3713
 
-
 
3714
  /* Initialize the 8bit temporary pointer */
-
 
3715
  ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
3708
  /* Read 8bit CRC to flush Data Register */
3716
  /* Read 8bit CRC to flush Data Register */
-
 
3717
  tmpreg8 = *ptmpreg8;
3709
  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);
3718
  /* To avoid GCC warning */
-
 
3719
  UNUSED(tmpreg8);
3710
 
3720
 
3711
  hspi->CRCSize--;
3721
  hspi->CRCSize--;
3712
 
3722
 
3713
  if (hspi->CRCSize == 0U)
3723
  if (hspi->CRCSize == 0U)
3714
  {
3724
  {
Line 3757... Line 3767...
3757
  *               the configuration information for SPI module.
3767
  *               the configuration information for SPI module.
3758
  * @retval None
3768
  * @retval None
3759
  */
3769
  */
3760
static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3770
static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)
3761
{
3771
{
-
 
3772
  __IO uint32_t tmpreg = 0U;
-
 
3773
 
3762
  /* Read 16bit CRC to flush Data Register */
3774
  /* Read 16bit CRC to flush Data Register */
3763
  READ_REG(hspi->Instance->DR);
3775
  tmpreg = READ_REG(hspi->Instance->DR);
-
 
3776
  /* To avoid GCC warning */
-
 
3777
  UNUSED(tmpreg);
3764
 
3778
 
3765
  /* Disable RXNE and ERR interrupt */
3779
  /* Disable RXNE and ERR interrupt */
3766
  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
3780
  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));
3767
 
3781
 
3768
  SPI_CloseRx_ISR(hspi);
3782
  SPI_CloseRx_ISR(hspi);
Line 3864... Line 3878...
3864
  * @retval HAL status
3878
  * @retval HAL status
3865
  */
3879
  */
3866
static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,
3880
static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,
3867
                                                       uint32_t Timeout, uint32_t Tickstart)
3881
                                                       uint32_t Timeout, uint32_t Tickstart)
3868
{
3882
{
-
 
3883
  __IO uint32_t count;
-
 
3884
  uint32_t tmp_timeout;
-
 
3885
  uint32_t tmp_tickstart;
-
 
3886
 
-
 
3887
  /* Adjust Timeout value  in case of end of transfer */
-
 
3888
  tmp_timeout   = Timeout - (HAL_GetTick() - Tickstart);
-
 
3889
  tmp_tickstart = HAL_GetTick();
-
 
3890
 
-
 
3891
  /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */
-
 
3892
  count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U);
-
 
3893
 
3869
  while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State)
3894
  while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State)
3870
  {
3895
  {
3871
    if (Timeout != HAL_MAX_DELAY)
3896
    if (Timeout != HAL_MAX_DELAY)
3872
    {
3897
    {
3873
      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))
3898
      if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U))
3874
      {
3899
      {
3875
        /* Disable the SPI and reset the CRC: the CRC value should be cleared
3900
        /* Disable the SPI and reset the CRC: the CRC value should be cleared
3876
        on both master and slave sides in order to resynchronize the master
3901
           on both master and slave sides in order to resynchronize the master
3877
        and slave for their respective CRC calculation */
3902
           and slave for their respective CRC calculation */
3878
 
3903
 
3879
        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
3904
        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */
3880
        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
3905
        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));
3881
 
3906
 
3882
        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
3907
        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)
Line 3897... Line 3922...
3897
        /* Process Unlocked */
3922
        /* Process Unlocked */
3898
        __HAL_UNLOCK(hspi);
3923
        __HAL_UNLOCK(hspi);
3899
 
3924
 
3900
        return HAL_TIMEOUT;
3925
        return HAL_TIMEOUT;
3901
      }
3926
      }
-
 
3927
      /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */
-
 
3928
      if(count == 0U)
-
 
3929
      {
-
 
3930
        tmp_timeout = 0U;
-
 
3931
      }
-
 
3932
      count--;
3902
    }
3933
    }
3903
  }
3934
  }
3904
 
3935
 
3905
  return HAL_OK;
3936
  return HAL_OK;
3906
}
3937
}
Line 3916... Line 3947...
3916
  * @retval HAL status
3947
  * @retval HAL status
3917
  */
3948
  */
3918
static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,
3949
static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,
3919
                                                       uint32_t Timeout, uint32_t Tickstart)
3950
                                                       uint32_t Timeout, uint32_t Tickstart)
3920
{
3951
{
-
 
3952
  __IO uint32_t count;
-
 
3953
  uint32_t tmp_timeout;
-
 
3954
  uint32_t tmp_tickstart;
-
 
3955
  __IO uint8_t  * ptmpreg8;
-
 
3956
  __IO uint8_t  tmpreg8 = 0;
-
 
3957
 
-
 
3958
  /* Adjust Timeout value  in case of end of transfer */
-
 
3959
  tmp_timeout = Timeout - (HAL_GetTick() - Tickstart);
-
 
3960
  tmp_tickstart = HAL_GetTick();
-
 
3961
 
-
 
3962
  /* Initialize the 8bit temporary pointer */
-
 
3963
  ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR;
-
 
3964
 
-
 
3965
  /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */
-
 
3966
  count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U);
-
 
3967
 
3921
  while ((hspi->Instance->SR & Fifo) != State)
3968
  while ((hspi->Instance->SR & Fifo) != State)
3922
  {
3969
  {
3923
    if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY))
3970
    if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY))
3924
    {
3971
    {
3925
      /* Read 8bit CRC to flush Data Register */
3972
      /* Flush Data Register by a blank read */
-
 
3973
      tmpreg8 = *ptmpreg8;
3926
      READ_REG(*((__IO uint8_t *)&hspi->Instance->DR));
3974
      /* To avoid GCC warning */
-
 
3975
      UNUSED(tmpreg8);
3927
    }
3976
    }
3928
 
3977
 
3929
    if (Timeout != HAL_MAX_DELAY)
3978
    if (Timeout != HAL_MAX_DELAY)
3930
    {
3979
    {
3931
      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))
3980
      if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U))
3932
      {
3981
      {
3933
        /* Disable the SPI and reset the CRC: the CRC value should be cleared
3982
        /* Disable the SPI and reset the CRC: the CRC value should be cleared
3934
           on both master and slave sides in order to resynchronize the master
3983
           on both master and slave sides in order to resynchronize the master
3935
           and slave for their respective CRC calculation */
3984
           and slave for their respective CRC calculation */
3936
 
3985
 
Line 3955... Line 4004...
3955
        /* Process Unlocked */
4004
        /* Process Unlocked */
3956
        __HAL_UNLOCK(hspi);
4005
        __HAL_UNLOCK(hspi);
3957
 
4006
 
3958
        return HAL_TIMEOUT;
4007
        return HAL_TIMEOUT;
3959
      }
4008
      }
-
 
4009
      /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */
-
 
4010
      if(count == 0U)
-
 
4011
      {
-
 
4012
        tmp_timeout = 0U;
-
 
4013
      }      
-
 
4014
      count--;
3960
    }
4015
    }
3961
  }
4016
  }
3962
 
4017
 
3963
  return HAL_OK;
4018
  return HAL_OK;
3964
}
4019
}
Line 4041... Line 4096...
4041
  */
4096
  */
4042
static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi)
4097
static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi)
4043
{
4098
{
4044
  uint32_t tickstart;
4099
  uint32_t tickstart;
4045
 
4100
 
4046
  /* Init tickstart for timeout managment*/
4101
  /* Init tickstart for timeout management */
4047
  tickstart = HAL_GetTick();
4102
  tickstart = HAL_GetTick();
4048
 
4103
 
4049
  /* Disable ERR interrupt */
4104
  /* Disable ERR interrupt */
4050
  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
4105
  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);
4051
 
4106