Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 5 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /** |
1 | /** |
2 | ****************************************************************************** |
2 | ****************************************************************************** |
3 | * @file stm32f1xx_hal_spi.c |
3 | * @file stm32f1xx_hal_spi.c |
4 | * @author MCD Application Team |
4 | * @author MCD Application Team |
5 | * @version V1.0.1 |
5 | * @version V1.0.4 |
6 | * @date 31-July-2015 |
6 | * @date 29-April-2016 |
7 | * @brief SPI HAL module driver. |
7 | * @brief SPI HAL module driver. |
8 | * |
8 | * |
9 | * This file provides firmware functions to manage the following |
9 | * This file provides firmware functions to manage the following |
10 | * functionalities of the Serial Peripheral Interface (SPI) peripheral: |
10 | * functionalities of the Serial Peripheral Interface (SPI) peripheral: |
11 | * + Initialization and de-initialization functions |
11 | * + Initialization and de-initialization functions |
Line 51... | Line 51... | ||
51 | (##) Master 1Line Rx |
51 | (##) Master 1Line Rx |
52 | (#) The CRC feature is not managed when the DMA circular mode is enabled |
52 | (#) The CRC feature is not managed when the DMA circular mode is enabled |
53 | (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs |
53 | (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs |
54 | the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks |
54 | the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks |
55 | 55 | ||
- | 56 | @endverbatim |
|
- | 57 | ****************************************************************************** |
|
- | 58 | * @attention |
|
- | 59 | * |
|
- | 60 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
|
- | 61 | * |
|
- | 62 | * Redistribution and use in source and binary forms, with or without modification, |
|
- | 63 | * are permitted provided that the following conditions are met: |
|
- | 64 | * 1. Redistributions of source code must retain the above copyright notice, |
|
- | 65 | * this list of conditions and the following disclaimer. |
|
- | 66 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
|
- | 67 | * this list of conditions and the following disclaimer in the documentation |
|
- | 68 | * and/or other materials provided with the distribution. |
|
- | 69 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
|
- | 70 | * may be used to endorse or promote products derived from this software |
|
- | 71 | * without specific prior written permission. |
|
- | 72 | * |
|
- | 73 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
- | 74 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
- | 75 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
- | 76 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
|
- | 77 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
- | 78 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|
- | 79 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
|
- | 80 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|
- | 81 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
- | 82 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
- | 83 | * |
|
- | 84 | ****************************************************************************** |
|
56 | [..] |
85 | */ |
- | 86 | ||
- | 87 | /* |
|
57 | Using the HAL it is not possible to reach all supported SPI frequency with the differents SPI Modes, |
88 | Using the HAL it is not possible to reach all supported SPI frequency with the differents SPI Modes, |
58 | the following table resume the max SPI frequency reached with data size 8bits/16bits, |
89 | the following table resume the max SPI frequency reached with data size 8bits/16bits, |
59 | according to frequency used on APBx Peripheral Clock (fPCLK) used by the SPI instance : |
90 | according to frequency used on APBx Peripheral Clock (fPCLK) used by the SPI instance : |
60 | 91 | ||
61 | For 8 bits SPI data size transfers : |
92 | For 8 bits SPI data size transfers : |
Line 106... | Line 137... | ||
106 | | T | Interrupt | fPCLK/4 | fPCLK/8 | NA | NA | fPCLK/4 | fPCLK/256 | |
137 | | T | Interrupt | fPCLK/4 | fPCLK/8 | NA | NA | fPCLK/4 | fPCLK/256 | |
107 | | X |----------------|-----------|-----------|-----------|-----------|-----------|-----------| |
138 | | X |----------------|-----------|-----------|-----------|-----------|-----------|-----------| |
108 | | | DMA | fPCLK/2 | fPCLK/4 | NA | NA | fPCLK/2 | fPCLK/32 | |
139 | | | DMA | fPCLK/2 | fPCLK/4 | NA | NA | fPCLK/2 | fPCLK/32 | |
109 | +--------------------------------------------------------------------------------------------------+ |
140 | +--------------------------------------------------------------------------------------------------+ |
110 | 141 | ||
- | 142 | note: |
|
111 | @note The max SPI frequency depend on SPI data size (8bits, 16bits), |
143 | The max SPI frequency depend on SPI data size (8bits, 16bits), |
112 | SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). |
144 | SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA). |
- | 145 | ||
113 | @note |
146 | note: |
114 | (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() |
147 | TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA() |
115 | (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() |
148 | RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() |
116 | (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() |
149 | TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA() |
117 | 150 | ||
118 | @endverbatim |
- | |
119 | ****************************************************************************** |
- | |
120 | * @attention |
- | |
121 | * |
- | |
122 | * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> |
- | |
123 | * |
- | |
124 | * Redistribution and use in source and binary forms, with or without modification, |
- | |
125 | * are permitted provided that the following conditions are met: |
- | |
126 | * 1. Redistributions of source code must retain the above copyright notice, |
- | |
127 | * this list of conditions and the following disclaimer. |
- | |
128 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
- | |
129 | * this list of conditions and the following disclaimer in the documentation |
- | |
130 | * and/or other materials provided with the distribution. |
- | |
131 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
- | |
132 | * may be used to endorse or promote products derived from this software |
- | |
133 | * without specific prior written permission. |
- | |
134 | * |
- | |
135 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
- | |
136 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- | |
137 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
- | |
138 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
- | |
139 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
- | |
140 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
- | |
141 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
- | |
142 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
- | |
143 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- | |
144 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- | |
145 | * |
- | |
146 | ****************************************************************************** |
- | |
147 | */ |
151 | */ |
148 | 152 | ||
149 | /* Includes ------------------------------------------------------------------*/ |
153 | /* Includes ------------------------------------------------------------------*/ |
150 | #include "stm32f1xx_hal.h" |
154 | #include "stm32f1xx_hal.h" |
151 | 155 | ||
152 | /** @addtogroup STM32F1xx_HAL_Driver |
156 | /** @addtogroup STM32F1xx_HAL_Driver |
Line 332... | Line 336... | ||
332 | * the configuration information for SPI module. |
336 | * the configuration information for SPI module. |
333 | * @retval None |
337 | * @retval None |
334 | */ |
338 | */ |
335 | __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) |
339 | __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) |
336 | { |
340 | { |
- | 341 | /* Prevent unused argument(s) compilation warning */ |
|
- | 342 | UNUSED(hspi); |
|
337 | /* NOTE : This function Should not be modified, when the callback is needed, |
343 | /* NOTE : This function Should not be modified, when the callback is needed, |
338 | the HAL_SPI_MspInit could be implenetd in the user file |
344 | the HAL_SPI_MspInit could be implenetd in the user file |
339 | */ |
345 | */ |
340 | } |
346 | } |
341 | 347 | ||
Line 345... | Line 351... | ||
345 | * the configuration information for SPI module. |
351 | * the configuration information for SPI module. |
346 | * @retval None |
352 | * @retval None |
347 | */ |
353 | */ |
348 | __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) |
354 | __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) |
349 | { |
355 | { |
- | 356 | /* Prevent unused argument(s) compilation warning */ |
|
- | 357 | UNUSED(hspi); |
|
350 | /* NOTE : This function Should not be modified, when the callback is needed, |
358 | /* NOTE : This function Should not be modified, when the callback is needed, |
351 | the HAL_SPI_MspDeInit could be implenetd in the user file |
359 | the HAL_SPI_MspDeInit could be implenetd in the user file |
352 | */ |
360 | */ |
353 | } |
361 | } |
354 | 362 | ||
Line 1249... | Line 1257... | ||
1249 | hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; |
1257 | hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; |
1250 | 1258 | ||
1251 | /* Set the DMA error callback */ |
1259 | /* Set the DMA error callback */ |
1252 | hspi->hdmatx->XferErrorCallback = SPI_DMAError; |
1260 | hspi->hdmatx->XferErrorCallback = SPI_DMAError; |
1253 | 1261 | ||
1254 | /* Reset content of SPI RxDMA descriptor */ |
- | |
1255 | hspi->hdmarx->XferHalfCpltCallback = 0; |
- | |
1256 | hspi->hdmarx->XferCpltCallback = 0; |
- | |
1257 | hspi->hdmarx->XferErrorCallback = 0; |
- | |
1258 | - | ||
1259 | /* Enable the Tx DMA Channel */ |
1262 | /* Enable the Tx DMA Channel */ |
1260 | HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount); |
1263 | HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount); |
1261 | 1264 | ||
1262 | /* Enable Tx DMA Request */ |
1265 | /* Enable Tx DMA Request */ |
1263 | SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); |
1266 | SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); |
Line 1343... | Line 1346... | ||
1343 | hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; |
1346 | hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; |
1344 | 1347 | ||
1345 | /* Set the DMA error callback */ |
1348 | /* Set the DMA error callback */ |
1346 | hspi->hdmarx->XferErrorCallback = SPI_DMAError; |
1349 | hspi->hdmarx->XferErrorCallback = SPI_DMAError; |
1347 | 1350 | ||
1348 | /* Reset content of SPI TxDMA descriptor */ |
- | |
1349 | hspi->hdmatx->XferHalfCpltCallback = 0; |
- | |
1350 | hspi->hdmatx->XferCpltCallback = 0; |
- | |
1351 | hspi->hdmatx->XferErrorCallback = 0; |
- | |
1352 | - | ||
1353 | /* Enable the Rx DMA Channel */ |
1351 | /* Enable the Rx DMA Channel */ |
1354 | HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount); |
1352 | HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount); |
1355 | 1353 | ||
1356 | /* Enable Rx DMA Request */ |
1354 | /* Enable Rx DMA Request */ |
1357 | SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); |
1355 | SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); |
Line 1628... | Line 1626... | ||
1628 | * the configuration information for SPI module. |
1626 | * the configuration information for SPI module. |
1629 | * @retval None |
1627 | * @retval None |
1630 | */ |
1628 | */ |
1631 | __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) |
1629 | __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) |
1632 | { |
1630 | { |
- | 1631 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1632 | UNUSED(hspi); |
|
1633 | /* NOTE : This function Should not be modified, when the callback is needed, |
1633 | /* NOTE : This function Should not be modified, when the callback is needed, |
1634 | the HAL_SPI_TxCpltCallback could be implenetd in the user file |
1634 | the HAL_SPI_TxCpltCallback could be implenetd in the user file |
1635 | */ |
1635 | */ |
1636 | } |
1636 | } |
1637 | 1637 | ||
Line 1641... | Line 1641... | ||
1641 | * the configuration information for SPI module. |
1641 | * the configuration information for SPI module. |
1642 | * @retval None |
1642 | * @retval None |
1643 | */ |
1643 | */ |
1644 | __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) |
1644 | __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) |
1645 | { |
1645 | { |
- | 1646 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1647 | UNUSED(hspi); |
|
1646 | /* NOTE : This function Should not be modified, when the callback is needed, |
1648 | /* NOTE : This function Should not be modified, when the callback is needed, |
1647 | the HAL_SPI_RxCpltCallback() could be implenetd in the user file |
1649 | the HAL_SPI_RxCpltCallback() could be implenetd in the user file |
1648 | */ |
1650 | */ |
1649 | } |
1651 | } |
1650 | 1652 | ||
Line 1654... | Line 1656... | ||
1654 | * the configuration information for SPI module. |
1656 | * the configuration information for SPI module. |
1655 | * @retval None |
1657 | * @retval None |
1656 | */ |
1658 | */ |
1657 | __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) |
1659 | __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) |
1658 | { |
1660 | { |
- | 1661 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1662 | UNUSED(hspi); |
|
1659 | /* NOTE : This function Should not be modified, when the callback is needed, |
1663 | /* NOTE : This function Should not be modified, when the callback is needed, |
1660 | the HAL_SPI_TxRxCpltCallback() could be implenetd in the user file |
1664 | the HAL_SPI_TxRxCpltCallback() could be implenetd in the user file |
1661 | */ |
1665 | */ |
1662 | } |
1666 | } |
1663 | 1667 | ||
Line 1667... | Line 1671... | ||
1667 | * the configuration information for SPI module. |
1671 | * the configuration information for SPI module. |
1668 | * @retval None |
1672 | * @retval None |
1669 | */ |
1673 | */ |
1670 | __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1674 | __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1671 | { |
1675 | { |
- | 1676 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1677 | UNUSED(hspi); |
|
1672 | /* NOTE : This function Should not be modified, when the callback is needed, |
1678 | /* NOTE : This function Should not be modified, when the callback is needed, |
1673 | the HAL_SPI_TxHalfCpltCallback could be implenetd in the user file |
1679 | the HAL_SPI_TxHalfCpltCallback could be implenetd in the user file |
1674 | */ |
1680 | */ |
1675 | } |
1681 | } |
1676 | 1682 | ||
Line 1680... | Line 1686... | ||
1680 | * the configuration information for SPI module. |
1686 | * the configuration information for SPI module. |
1681 | * @retval None |
1687 | * @retval None |
1682 | */ |
1688 | */ |
1683 | __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1689 | __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1684 | { |
1690 | { |
- | 1691 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1692 | UNUSED(hspi); |
|
1685 | /* NOTE : This function Should not be modified, when the callback is needed, |
1693 | /* NOTE : This function Should not be modified, when the callback is needed, |
1686 | the HAL_SPI_RxHalfCpltCallback() could be implenetd in the user file |
1694 | the HAL_SPI_RxHalfCpltCallback() could be implenetd in the user file |
1687 | */ |
1695 | */ |
1688 | } |
1696 | } |
1689 | 1697 | ||
Line 1693... | Line 1701... | ||
1693 | * the configuration information for SPI module. |
1701 | * the configuration information for SPI module. |
1694 | * @retval None |
1702 | * @retval None |
1695 | */ |
1703 | */ |
1696 | __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1704 | __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) |
1697 | { |
1705 | { |
- | 1706 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1707 | UNUSED(hspi); |
|
1698 | /* NOTE : This function Should not be modified, when the callback is needed, |
1708 | /* NOTE : This function Should not be modified, when the callback is needed, |
1699 | the HAL_SPI_TxRxHalfCpltCallback() could be implenetd in the user file |
1709 | the HAL_SPI_TxRxHalfCpltCallback() could be implenetd in the user file |
1700 | */ |
1710 | */ |
1701 | } |
1711 | } |
1702 | 1712 | ||
Line 1706... | Line 1716... | ||
1706 | * the configuration information for SPI module. |
1716 | * the configuration information for SPI module. |
1707 | * @retval None |
1717 | * @retval None |
1708 | */ |
1718 | */ |
1709 | __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) |
1719 | __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) |
1710 | { |
1720 | { |
- | 1721 | /* Prevent unused argument(s) compilation warning */ |
|
- | 1722 | UNUSED(hspi); |
|
1711 | /* NOTE : - This function Should not be modified, when the callback is needed, |
1723 | /* NOTE : - This function Should not be modified, when the callback is needed, |
1712 | the HAL_SPI_ErrorCallback() could be implenetd in the user file. |
1724 | the HAL_SPI_ErrorCallback() could be implenetd in the user file. |
1713 | - The ErrorCode parameter in the hspi handle is updated by the SPI processes |
1725 | - The ErrorCode parameter in the hspi handle is updated by the SPI processes |
1714 | and user can use HAL_SPI_GetError() API to check the latest error occurred. |
1726 | and user can use HAL_SPI_GetError() API to check the latest error occurred. |
1715 | */ |
1727 | */ |