mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Tue Nov 18 10:30:06 2014 +0000
Revision:
406:7b834b41c730
Parent:
404:cbc7dfcb0ce9
Synchronized with git revision 34eccbf435e41c79d1c9b64a1b395c692fd64445

Full URL: https://github.com/mbedmicro/mbed/commit/34eccbf435e41c79d1c9b64a1b395c692fd64445/

Targets: NUCLEO_F4xx - Add PeripheralPins.c/h file

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /* mbed Microcontroller Library
mbed_official 87:085cde657901 2 *******************************************************************************
mbed_official 87:085cde657901 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 87:085cde657901 4 * All rights reserved.
mbed_official 87:085cde657901 5 *
mbed_official 87:085cde657901 6 * Redistribution and use in source and binary forms, with or without
mbed_official 87:085cde657901 7 * modification, are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 8 *
mbed_official 87:085cde657901 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 10 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 13 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 15 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 16 * without specific prior written permission.
mbed_official 87:085cde657901 17 *
mbed_official 87:085cde657901 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 28 *******************************************************************************
mbed_official 87:085cde657901 29 */
mbed_official 227:7bd0639b8911 30 #include "mbed_assert.h"
mbed_official 87:085cde657901 31 #include "spi_api.h"
mbed_official 87:085cde657901 32
mbed_official 87:085cde657901 33 #if DEVICE_SPI
mbed_official 87:085cde657901 34
mbed_official 87:085cde657901 35 #include <math.h>
mbed_official 87:085cde657901 36 #include "cmsis.h"
mbed_official 87:085cde657901 37 #include "pinmap.h"
mbed_official 406:7b834b41c730 38 #include "PeripheralPins.h"
mbed_official 87:085cde657901 39
mbed_official 87:085cde657901 40 static SPI_HandleTypeDef SpiHandle;
mbed_official 87:085cde657901 41
mbed_official 402:09075a3b15e3 42 static void init_spi(spi_t *obj)
mbed_official 402:09075a3b15e3 43 {
mbed_official 87:085cde657901 44 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 172:2f4f8c56b261 45
mbed_official 87:085cde657901 46 __HAL_SPI_DISABLE(&SpiHandle);
mbed_official 87:085cde657901 47
mbed_official 87:085cde657901 48 SpiHandle.Init.Mode = obj->mode;
mbed_official 87:085cde657901 49 SpiHandle.Init.BaudRatePrescaler = obj->br_presc;
mbed_official 87:085cde657901 50 SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
mbed_official 87:085cde657901 51 SpiHandle.Init.CLKPhase = obj->cpha;
mbed_official 87:085cde657901 52 SpiHandle.Init.CLKPolarity = obj->cpol;
mbed_official 87:085cde657901 53 SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
mbed_official 87:085cde657901 54 SpiHandle.Init.CRCPolynomial = 7;
mbed_official 87:085cde657901 55 SpiHandle.Init.DataSize = obj->bits;
mbed_official 87:085cde657901 56 SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
mbed_official 87:085cde657901 57 SpiHandle.Init.NSS = obj->nss;
mbed_official 87:085cde657901 58 SpiHandle.Init.TIMode = SPI_TIMODE_DISABLED;
mbed_official 172:2f4f8c56b261 59
mbed_official 87:085cde657901 60 HAL_SPI_Init(&SpiHandle);
mbed_official 87:085cde657901 61
mbed_official 87:085cde657901 62 __HAL_SPI_ENABLE(&SpiHandle);
mbed_official 87:085cde657901 63 }
mbed_official 87:085cde657901 64
mbed_official 402:09075a3b15e3 65 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
mbed_official 402:09075a3b15e3 66 {
mbed_official 87:085cde657901 67 // Determine the SPI to use
mbed_official 87:085cde657901 68 SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 87:085cde657901 69 SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 87:085cde657901 70 SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 87:085cde657901 71 SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 172:2f4f8c56b261 72
mbed_official 87:085cde657901 73 SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
mbed_official 87:085cde657901 74 SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
mbed_official 172:2f4f8c56b261 75
mbed_official 87:085cde657901 76 obj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl);
mbed_official 227:7bd0639b8911 77 MBED_ASSERT(obj->spi != (SPIName)NC);
mbed_official 172:2f4f8c56b261 78
mbed_official 87:085cde657901 79 // Enable SPI clock
mbed_official 87:085cde657901 80 if (obj->spi == SPI_1) {
mbed_official 87:085cde657901 81 __SPI1_CLK_ENABLE();
mbed_official 87:085cde657901 82 }
mbed_official 404:cbc7dfcb0ce9 83
mbed_official 115:4f0cb9cdc478 84 if (obj->spi == SPI_2) {
mbed_official 115:4f0cb9cdc478 85 __SPI2_CLK_ENABLE();
mbed_official 115:4f0cb9cdc478 86 }
mbed_official 404:cbc7dfcb0ce9 87
mbed_official 115:4f0cb9cdc478 88 if (obj->spi == SPI_3) {
mbed_official 115:4f0cb9cdc478 89 __SPI3_CLK_ENABLE();
mbed_official 115:4f0cb9cdc478 90 }
mbed_official 172:2f4f8c56b261 91
mbed_official 87:085cde657901 92 // Configure the SPI pins
mbed_official 87:085cde657901 93 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 87:085cde657901 94 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 87:085cde657901 95 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 172:2f4f8c56b261 96
mbed_official 87:085cde657901 97 // Save new values
mbed_official 87:085cde657901 98 obj->bits = SPI_DATASIZE_8BIT;
mbed_official 87:085cde657901 99 obj->cpol = SPI_POLARITY_LOW;
mbed_official 87:085cde657901 100 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 125:23cc3068a9e4 101 obj->br_presc = SPI_BAUDRATEPRESCALER_256;
mbed_official 172:2f4f8c56b261 102
mbed_official 215:83cf97a28428 103 obj->pin_miso = miso;
mbed_official 215:83cf97a28428 104 obj->pin_mosi = mosi;
mbed_official 215:83cf97a28428 105 obj->pin_sclk = sclk;
mbed_official 215:83cf97a28428 106 obj->pin_ssel = ssel;
mbed_official 215:83cf97a28428 107
mbed_official 115:4f0cb9cdc478 108 if (ssel == NC) { // SW NSS Master mode
mbed_official 87:085cde657901 109 obj->mode = SPI_MODE_MASTER;
mbed_official 87:085cde657901 110 obj->nss = SPI_NSS_SOFT;
mbed_official 172:2f4f8c56b261 111 } else { // Slave
mbed_official 87:085cde657901 112 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 87:085cde657901 113 obj->mode = SPI_MODE_SLAVE;
mbed_official 87:085cde657901 114 obj->nss = SPI_NSS_HARD_INPUT;
mbed_official 87:085cde657901 115 }
mbed_official 87:085cde657901 116
mbed_official 87:085cde657901 117 init_spi(obj);
mbed_official 87:085cde657901 118 }
mbed_official 87:085cde657901 119
mbed_official 402:09075a3b15e3 120 void spi_free(spi_t *obj)
mbed_official 402:09075a3b15e3 121 {
mbed_official 215:83cf97a28428 122 // Reset SPI and disable clock
mbed_official 215:83cf97a28428 123 if (obj->spi == SPI_1) {
mbed_official 215:83cf97a28428 124 __SPI1_FORCE_RESET();
mbed_official 215:83cf97a28428 125 __SPI1_RELEASE_RESET();
mbed_official 215:83cf97a28428 126 __SPI1_CLK_DISABLE();
mbed_official 215:83cf97a28428 127 }
mbed_official 215:83cf97a28428 128
mbed_official 215:83cf97a28428 129 if (obj->spi == SPI_2) {
mbed_official 215:83cf97a28428 130 __SPI2_FORCE_RESET();
mbed_official 215:83cf97a28428 131 __SPI2_RELEASE_RESET();
mbed_official 215:83cf97a28428 132 __SPI2_CLK_DISABLE();
mbed_official 215:83cf97a28428 133 }
mbed_official 215:83cf97a28428 134
mbed_official 215:83cf97a28428 135 if (obj->spi == SPI_3) {
mbed_official 215:83cf97a28428 136 __SPI3_FORCE_RESET();
mbed_official 215:83cf97a28428 137 __SPI3_RELEASE_RESET();
mbed_official 215:83cf97a28428 138 __SPI3_CLK_DISABLE();
mbed_official 215:83cf97a28428 139 }
mbed_official 215:83cf97a28428 140
mbed_official 215:83cf97a28428 141 // Configure GPIOs
mbed_official 215:83cf97a28428 142 pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 215:83cf97a28428 143 pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 215:83cf97a28428 144 pin_function(obj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 215:83cf97a28428 145 pin_function(obj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 87:085cde657901 146 }
mbed_official 87:085cde657901 147
mbed_official 402:09075a3b15e3 148 void spi_format(spi_t *obj, int bits, int mode, int slave)
mbed_official 402:09075a3b15e3 149 {
mbed_official 87:085cde657901 150 // Save new values
mbed_official 233:1bbc1451db33 151 if (bits == 16) {
mbed_official 233:1bbc1451db33 152 obj->bits = SPI_DATASIZE_16BIT;
mbed_official 233:1bbc1451db33 153 } else {
mbed_official 87:085cde657901 154 obj->bits = SPI_DATASIZE_8BIT;
mbed_official 87:085cde657901 155 }
mbed_official 172:2f4f8c56b261 156
mbed_official 87:085cde657901 157 switch (mode) {
mbed_official 87:085cde657901 158 case 0:
mbed_official 172:2f4f8c56b261 159 obj->cpol = SPI_POLARITY_LOW;
mbed_official 172:2f4f8c56b261 160 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 172:2f4f8c56b261 161 break;
mbed_official 87:085cde657901 162 case 1:
mbed_official 172:2f4f8c56b261 163 obj->cpol = SPI_POLARITY_LOW;
mbed_official 172:2f4f8c56b261 164 obj->cpha = SPI_PHASE_2EDGE;
mbed_official 172:2f4f8c56b261 165 break;
mbed_official 87:085cde657901 166 case 2:
mbed_official 172:2f4f8c56b261 167 obj->cpol = SPI_POLARITY_HIGH;
mbed_official 172:2f4f8c56b261 168 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 172:2f4f8c56b261 169 break;
mbed_official 87:085cde657901 170 default:
mbed_official 172:2f4f8c56b261 171 obj->cpol = SPI_POLARITY_HIGH;
mbed_official 172:2f4f8c56b261 172 obj->cpha = SPI_PHASE_2EDGE;
mbed_official 172:2f4f8c56b261 173 break;
mbed_official 87:085cde657901 174 }
mbed_official 172:2f4f8c56b261 175
mbed_official 87:085cde657901 176 if (slave == 0) {
mbed_official 87:085cde657901 177 obj->mode = SPI_MODE_MASTER;
mbed_official 87:085cde657901 178 obj->nss = SPI_NSS_SOFT;
mbed_official 172:2f4f8c56b261 179 } else {
mbed_official 87:085cde657901 180 obj->mode = SPI_MODE_SLAVE;
mbed_official 172:2f4f8c56b261 181 obj->nss = SPI_NSS_HARD_INPUT;
mbed_official 87:085cde657901 182 }
mbed_official 172:2f4f8c56b261 183
mbed_official 87:085cde657901 184 init_spi(obj);
mbed_official 87:085cde657901 185 }
mbed_official 87:085cde657901 186
mbed_official 402:09075a3b15e3 187 void spi_frequency(spi_t *obj, int hz)
mbed_official 402:09075a3b15e3 188 {
mbed_official 125:23cc3068a9e4 189 // Note: The frequencies are obtained with SPI1 clock = 84 MHz (APB2 clock)
mbed_official 125:23cc3068a9e4 190 if (hz < 600000) {
mbed_official 125:23cc3068a9e4 191 obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 330 kHz
mbed_official 172:2f4f8c56b261 192 } else if ((hz >= 600000) && (hz < 1000000)) {
mbed_official 125:23cc3068a9e4 193 obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 656 kHz
mbed_official 172:2f4f8c56b261 194 } else if ((hz >= 1000000) && (hz < 2000000)) {
mbed_official 125:23cc3068a9e4 195 obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.3 MHz
mbed_official 172:2f4f8c56b261 196 } else if ((hz >= 2000000) && (hz < 5000000)) {
mbed_official 125:23cc3068a9e4 197 obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 2.6 MHz
mbed_official 172:2f4f8c56b261 198 } else if ((hz >= 5000000) && (hz < 10000000)) {
mbed_official 125:23cc3068a9e4 199 obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 5.25 MHz
mbed_official 172:2f4f8c56b261 200 } else if ((hz >= 10000000) && (hz < 21000000)) {
mbed_official 125:23cc3068a9e4 201 obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 10.5 MHz
mbed_official 172:2f4f8c56b261 202 } else if ((hz >= 21000000) && (hz < 42000000)) {
mbed_official 125:23cc3068a9e4 203 obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 21 MHz
mbed_official 172:2f4f8c56b261 204 } else { // >= 42000000
mbed_official 125:23cc3068a9e4 205 obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 42 MHz
mbed_official 125:23cc3068a9e4 206 }
mbed_official 87:085cde657901 207 init_spi(obj);
mbed_official 87:085cde657901 208 }
mbed_official 87:085cde657901 209
mbed_official 402:09075a3b15e3 210 static inline int ssp_readable(spi_t *obj)
mbed_official 402:09075a3b15e3 211 {
mbed_official 87:085cde657901 212 int status;
mbed_official 87:085cde657901 213 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 214 // Check if data is received
mbed_official 87:085cde657901 215 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 172:2f4f8c56b261 216 return status;
mbed_official 87:085cde657901 217 }
mbed_official 87:085cde657901 218
mbed_official 402:09075a3b15e3 219 static inline int ssp_writeable(spi_t *obj)
mbed_official 402:09075a3b15e3 220 {
mbed_official 87:085cde657901 221 int status;
mbed_official 87:085cde657901 222 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 223 // Check if data is transmitted
mbed_official 87:085cde657901 224 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 87:085cde657901 225 return status;
mbed_official 87:085cde657901 226 }
mbed_official 87:085cde657901 227
mbed_official 402:09075a3b15e3 228 static inline void ssp_write(spi_t *obj, int value)
mbed_official 402:09075a3b15e3 229 {
mbed_official 87:085cde657901 230 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 231 while (!ssp_writeable(obj));
mbed_official 125:23cc3068a9e4 232 spi->DR = (uint16_t)value;
mbed_official 87:085cde657901 233 }
mbed_official 87:085cde657901 234
mbed_official 402:09075a3b15e3 235 static inline int ssp_read(spi_t *obj)
mbed_official 402:09075a3b15e3 236 {
mbed_official 87:085cde657901 237 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 238 while (!ssp_readable(obj));
mbed_official 87:085cde657901 239 return (int)spi->DR;
mbed_official 87:085cde657901 240 }
mbed_official 87:085cde657901 241
mbed_official 402:09075a3b15e3 242 static inline int ssp_busy(spi_t *obj)
mbed_official 402:09075a3b15e3 243 {
mbed_official 87:085cde657901 244 int status;
mbed_official 87:085cde657901 245 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 246 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_BSY) != RESET) ? 1 : 0);
mbed_official 87:085cde657901 247 return status;
mbed_official 87:085cde657901 248 }
mbed_official 87:085cde657901 249
mbed_official 402:09075a3b15e3 250 int spi_master_write(spi_t *obj, int value)
mbed_official 402:09075a3b15e3 251 {
mbed_official 87:085cde657901 252 ssp_write(obj, value);
mbed_official 87:085cde657901 253 return ssp_read(obj);
mbed_official 87:085cde657901 254 }
mbed_official 87:085cde657901 255
mbed_official 402:09075a3b15e3 256 int spi_slave_receive(spi_t *obj)
mbed_official 402:09075a3b15e3 257 {
mbed_official 233:1bbc1451db33 258 return ((ssp_readable(obj) && !ssp_busy(obj)) ? 1 : 0);
mbed_official 87:085cde657901 259 };
mbed_official 87:085cde657901 260
mbed_official 402:09075a3b15e3 261 int spi_slave_read(spi_t *obj)
mbed_official 402:09075a3b15e3 262 {
mbed_official 87:085cde657901 263 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 172:2f4f8c56b261 264 while (!ssp_readable(obj));
mbed_official 87:085cde657901 265 return (int)spi->DR;
mbed_official 87:085cde657901 266 }
mbed_official 87:085cde657901 267
mbed_official 402:09075a3b15e3 268 void spi_slave_write(spi_t *obj, int value)
mbed_official 402:09075a3b15e3 269 {
mbed_official 87:085cde657901 270 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 87:085cde657901 271 while (!ssp_writeable(obj));
mbed_official 125:23cc3068a9e4 272 spi->DR = (uint16_t)value;
mbed_official 87:085cde657901 273 }
mbed_official 87:085cde657901 274
mbed_official 402:09075a3b15e3 275 int spi_busy(spi_t *obj)
mbed_official 402:09075a3b15e3 276 {
mbed_official 87:085cde657901 277 return ssp_busy(obj);
mbed_official 87:085cde657901 278 }
mbed_official 87:085cde657901 279
mbed_official 87:085cde657901 280 #endif