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 Dec 16 08:15:08 2014 +0000
Revision:
440:8a0b45cd594f
Parent:
428:4ddf7f7eabbb
Synchronized with git revision 67fbbf0b635d0c0d93fbe433306c537c2ad206aa

Full URL: https://github.com/mbedmicro/mbed/commit/67fbbf0b635d0c0d93fbe433306c537c2ad206aa/

Targets: nrf51 - updating app_timer.c from Norid'c SDKv7.1.0

Who changed what in which revision?

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