mbed library sources
Fork of mbed-src by
Diff: targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_spi.c
- Revision:
- 106:ced8cbb51063
- Parent:
- 87:085cde657901
- Child:
- 226:b062af740e40
--- a/targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_spi.c Mon Feb 24 10:30:08 2014 +0000 +++ b/targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_spi.c Wed Feb 26 09:45:12 2014 +0000 @@ -2,8 +2,8 @@ ****************************************************************************** * @file stm32f4xx_hal_spi.c * @author MCD Application Team - * @version V1.0.0RC2 - * @date 04-February-2014 + * @version V1.0.0 + * @date 18-February-2014 * @brief SPI HAL module driver. * * This file provides firmware functions to manage the following @@ -98,7 +98,7 @@ /* Private function prototypes -----------------------------------------------*/ static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi); static void SPI_TxISR(SPI_HandleTypeDef *hspi); -static void SPI_RxClose_IRQHandler(SPI_HandleTypeDef *hspi); +static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi); static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi); static void SPI_RxISR(SPI_HandleTypeDef *hspi); static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); @@ -229,6 +229,9 @@ hspi->ErrorCode = HAL_SPI_ERROR_NONE; hspi->State = HAL_SPI_STATE_RESET; + /* Release Lock */ + __HAL_UNLOCK(hspi); + return HAL_OK; } @@ -653,7 +656,7 @@ /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ if(hspi->State == HAL_SPI_STATE_READY) { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; } /* Configure communication */ @@ -1047,7 +1050,7 @@ /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ if(hspi->State == HAL_SPI_STATE_READY) { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; } /* Configure communication */ @@ -1281,7 +1284,7 @@ /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ if(hspi->State == HAL_SPI_STATE_READY) { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; } /* Configure communication */ @@ -1305,9 +1308,15 @@ __HAL_SPI_RESET_CRC(hspi); } - /* Set the SPI Rx DMA transfer complete callback because the last generated transfer request is - the reception request (RXNE) */ - hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ + if(hspi->State == HAL_SPI_STATE_BUSY_RX) + { + hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + } + else + { + hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + } /* Set the DMA error callback */ hspi->hdmarx->XferErrorCallback = SPI_DMAError; @@ -1518,13 +1527,10 @@ */ static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi) { - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLED) + /* Wait until TXE flag is set to send data */ + if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } + hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; } /* Disable TXE interrupt */ @@ -1547,24 +1553,27 @@ __HAL_SPI_CLEAR_OVRFLAG(hspi); } - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - /* Check if Errors has been detected during transfer */ if(hspi->ErrorCode == HAL_SPI_ERROR_NONE) { /* Check if we are in Tx or in Rx/Tx Mode */ if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX) { + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; HAL_SPI_TxRxCpltCallback(hspi); } else { - HAL_SPI_TxRxCpltCallback(hspi); + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; + HAL_SPI_TxCpltCallback(hspi); } } else { + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; /* Call Error call back in case of Error */ HAL_SPI_ErrorCallback(hspi); } @@ -1607,7 +1616,7 @@ * @param hspi: SPI handle * @retval void */ -static void SPI_RxClose_IRQHandler(SPI_HandleTypeDef *hspi) +static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi) { __IO uint16_t tmpreg; @@ -1653,22 +1662,26 @@ __HAL_SPI_DISABLE(hspi); } - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; /* Check if Errors has been detected during transfer */ if(hspi->ErrorCode == HAL_SPI_ERROR_NONE) { /* Check if we are in Rx or in Rx/Tx Mode */ if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX) { + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; HAL_SPI_TxRxCpltCallback(hspi); }else { + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; HAL_SPI_RxCpltCallback(hspi); } } else { + /* Set state to READY before run the Callback Complete */ + hspi->State = HAL_SPI_STATE_READY; /* Call Error call back in case of Error */ HAL_SPI_ErrorCallback(hspi); } @@ -1697,7 +1710,7 @@ if(hspi->RxXferCount==0) { - SPI_RxClose_IRQHandler(hspi); + SPI_RxCloseIRQHandler(hspi); } } @@ -1730,7 +1743,7 @@ if(hspi->RxXferCount == 0) { - SPI_RxClose_IRQHandler(hspi); + SPI_RxCloseIRQHandler(hspi); } }