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 Jul 29 19:00:07 2014 +0100
Revision:
268:402bcc0c870b
Parent:
235:685d5f11838f
Child:
404:cbc7dfcb0ce9
Synchronized with git revision 490d1a6606b3138f165c5edf2f2370ca616587c0

Full URL: https://github.com/mbedmicro/mbed/commit/490d1a6606b3138f165c5edf2f2370ca616587c0/

[LPC1114] Sleep fix + some device.h settings

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 235:685d5f11838f 1 /* mbed Microcontroller Library
mbed_official 235:685d5f11838f 2 *******************************************************************************
mbed_official 235:685d5f11838f 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 235:685d5f11838f 4 * All rights reserved.
mbed_official 235:685d5f11838f 5 *
mbed_official 235:685d5f11838f 6 * Redistribution and use in source and binary forms, with or without
mbed_official 235:685d5f11838f 7 * modification, are permitted provided that the following conditions are met:
mbed_official 235:685d5f11838f 8 *
mbed_official 235:685d5f11838f 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 235:685d5f11838f 10 * this list of conditions and the following disclaimer.
mbed_official 235:685d5f11838f 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 235:685d5f11838f 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 235:685d5f11838f 13 * and/or other materials provided with the distribution.
mbed_official 235:685d5f11838f 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 235:685d5f11838f 15 * may be used to endorse or promote products derived from this software
mbed_official 235:685d5f11838f 16 * without specific prior written permission.
mbed_official 235:685d5f11838f 17 *
mbed_official 235:685d5f11838f 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 235:685d5f11838f 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 235:685d5f11838f 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 235:685d5f11838f 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 235:685d5f11838f 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 235:685d5f11838f 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 235:685d5f11838f 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 235:685d5f11838f 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 235:685d5f11838f 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 235:685d5f11838f 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 235:685d5f11838f 28 *******************************************************************************
mbed_official 235:685d5f11838f 29 */
mbed_official 235:685d5f11838f 30 #include "mbed_assert.h"
mbed_official 235:685d5f11838f 31 #include "spi_api.h"
mbed_official 235:685d5f11838f 32
mbed_official 235:685d5f11838f 33 #if DEVICE_SPI
mbed_official 235:685d5f11838f 34
mbed_official 235:685d5f11838f 35 #include <math.h>
mbed_official 235:685d5f11838f 36 #include "cmsis.h"
mbed_official 235:685d5f11838f 37 #include "pinmap.h"
mbed_official 235:685d5f11838f 38
mbed_official 235:685d5f11838f 39 static const PinMap PinMap_SPI_MOSI[] = {
mbed_official 235:685d5f11838f 40 {PA_1, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)},
mbed_official 235:685d5f11838f 41 {PA_7, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
mbed_official 235:685d5f11838f 42 {PA_10, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI5)},
mbed_official 235:685d5f11838f 43 // {PB_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
mbed_official 235:685d5f11838f 44 {PB_5, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 45 {PB_8, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI5)},
mbed_official 235:685d5f11838f 46 {PB_15, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 47 {PC_3, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 48 {PC_12, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 49 {NC, NC, 0}
mbed_official 235:685d5f11838f 50 };
mbed_official 235:685d5f11838f 51
mbed_official 235:685d5f11838f 52 static const PinMap PinMap_SPI_MISO[] = {
mbed_official 235:685d5f11838f 53 {PA_6, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
mbed_official 235:685d5f11838f 54 {PA_11, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI4)},
mbed_official 235:685d5f11838f 55 {PA_12, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI5)},
mbed_official 235:685d5f11838f 56 // {PB_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
mbed_official 235:685d5f11838f 57 {PB_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 58 {PB_14, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 59 {PC_2, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 60 {PC_11, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 61 {NC, NC, 0}
mbed_official 235:685d5f11838f 62 };
mbed_official 235:685d5f11838f 63
mbed_official 235:685d5f11838f 64 static const PinMap PinMap_SPI_SCLK[] = {
mbed_official 235:685d5f11838f 65 {PA_5, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, // ARDUINO
mbed_official 235:685d5f11838f 66 {PB_0, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI5)},
mbed_official 235:685d5f11838f 67 // {PB_3, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)},
mbed_official 235:685d5f11838f 68 {PB_3, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 69 {PB_10, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 70 // {PB_12, SPI_3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF7_SPI3)}, // Warning: also on NSS
mbed_official 235:685d5f11838f 71 {PB_13, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 72 // {PB_13, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI4)},
mbed_official 235:685d5f11838f 73 {PC_7, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 74 {PC_10, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 75 {NC, NC, 0}
mbed_official 235:685d5f11838f 76 };
mbed_official 235:685d5f11838f 77
mbed_official 235:685d5f11838f 78 static const PinMap PinMap_SPI_SSEL[] = {
mbed_official 235:685d5f11838f 79 {PA_4, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
mbed_official 235:685d5f11838f 80 // {PA_4, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 81 {PA_15, SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},
mbed_official 235:685d5f11838f 82 // {PA_15, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},
mbed_official 235:685d5f11838f 83 {PB_1, SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI5)},
mbed_official 235:685d5f11838f 84 {PB_9, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},
mbed_official 235:685d5f11838f 85 {PB_12, SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Warning: also on SCLK
mbed_official 235:685d5f11838f 86 // {PB_12, SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)}, // Warning: also on SCLK
mbed_official 235:685d5f11838f 87 {NC, NC, 0}
mbed_official 235:685d5f11838f 88 };
mbed_official 235:685d5f11838f 89
mbed_official 235:685d5f11838f 90 static SPI_HandleTypeDef SpiHandle;
mbed_official 235:685d5f11838f 91
mbed_official 235:685d5f11838f 92 static void init_spi(spi_t *obj)
mbed_official 235:685d5f11838f 93 {
mbed_official 235:685d5f11838f 94 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 95
mbed_official 235:685d5f11838f 96 __HAL_SPI_DISABLE(&SpiHandle);
mbed_official 235:685d5f11838f 97
mbed_official 235:685d5f11838f 98 SpiHandle.Init.Mode = obj->mode;
mbed_official 235:685d5f11838f 99 SpiHandle.Init.BaudRatePrescaler = obj->br_presc;
mbed_official 235:685d5f11838f 100 SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
mbed_official 235:685d5f11838f 101 SpiHandle.Init.CLKPhase = obj->cpha;
mbed_official 235:685d5f11838f 102 SpiHandle.Init.CLKPolarity = obj->cpol;
mbed_official 235:685d5f11838f 103 SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
mbed_official 235:685d5f11838f 104 SpiHandle.Init.CRCPolynomial = 7;
mbed_official 235:685d5f11838f 105 SpiHandle.Init.DataSize = obj->bits;
mbed_official 235:685d5f11838f 106 SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
mbed_official 235:685d5f11838f 107 SpiHandle.Init.NSS = obj->nss;
mbed_official 235:685d5f11838f 108 SpiHandle.Init.TIMode = SPI_TIMODE_DISABLED;
mbed_official 235:685d5f11838f 109
mbed_official 235:685d5f11838f 110 HAL_SPI_Init(&SpiHandle);
mbed_official 235:685d5f11838f 111
mbed_official 235:685d5f11838f 112 __HAL_SPI_ENABLE(&SpiHandle);
mbed_official 235:685d5f11838f 113 }
mbed_official 235:685d5f11838f 114
mbed_official 235:685d5f11838f 115 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
mbed_official 235:685d5f11838f 116 {
mbed_official 235:685d5f11838f 117 // Determine the SPI to use
mbed_official 235:685d5f11838f 118 SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 235:685d5f11838f 119 SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 235:685d5f11838f 120 SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 235:685d5f11838f 121 SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 235:685d5f11838f 122
mbed_official 235:685d5f11838f 123 SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
mbed_official 235:685d5f11838f 124 SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
mbed_official 235:685d5f11838f 125
mbed_official 235:685d5f11838f 126 obj->spi = (SPIName)pinmap_merge(spi_data, spi_cntl);
mbed_official 235:685d5f11838f 127 MBED_ASSERT(obj->spi != (SPIName)NC);
mbed_official 235:685d5f11838f 128
mbed_official 235:685d5f11838f 129 // Enable SPI clock
mbed_official 235:685d5f11838f 130 if (obj->spi == SPI_1) {
mbed_official 235:685d5f11838f 131 __SPI1_CLK_ENABLE();
mbed_official 235:685d5f11838f 132 }
mbed_official 235:685d5f11838f 133 if (obj->spi == SPI_2) {
mbed_official 235:685d5f11838f 134 __SPI2_CLK_ENABLE();
mbed_official 235:685d5f11838f 135 }
mbed_official 235:685d5f11838f 136 if (obj->spi == SPI_3) {
mbed_official 235:685d5f11838f 137 __SPI3_CLK_ENABLE();
mbed_official 235:685d5f11838f 138 }
mbed_official 235:685d5f11838f 139 if (obj->spi == SPI_4) {
mbed_official 235:685d5f11838f 140 __SPI4_CLK_ENABLE();
mbed_official 235:685d5f11838f 141 }
mbed_official 235:685d5f11838f 142 if (obj->spi == SPI_5) {
mbed_official 235:685d5f11838f 143 __SPI5_CLK_ENABLE();
mbed_official 235:685d5f11838f 144 }
mbed_official 235:685d5f11838f 145
mbed_official 235:685d5f11838f 146 // Configure the SPI pins
mbed_official 235:685d5f11838f 147 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 235:685d5f11838f 148 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 235:685d5f11838f 149 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 235:685d5f11838f 150
mbed_official 235:685d5f11838f 151 // Save new values
mbed_official 235:685d5f11838f 152 obj->bits = SPI_DATASIZE_8BIT;
mbed_official 235:685d5f11838f 153 obj->cpol = SPI_POLARITY_LOW;
mbed_official 235:685d5f11838f 154 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 235:685d5f11838f 155 obj->br_presc = SPI_BAUDRATEPRESCALER_256;
mbed_official 235:685d5f11838f 156
mbed_official 235:685d5f11838f 157 obj->pin_miso = miso;
mbed_official 235:685d5f11838f 158 obj->pin_mosi = mosi;
mbed_official 235:685d5f11838f 159 obj->pin_sclk = sclk;
mbed_official 235:685d5f11838f 160 obj->pin_ssel = ssel;
mbed_official 235:685d5f11838f 161
mbed_official 235:685d5f11838f 162 if (ssel == NC) { // SW NSS Master mode
mbed_official 235:685d5f11838f 163 obj->mode = SPI_MODE_MASTER;
mbed_official 235:685d5f11838f 164 obj->nss = SPI_NSS_SOFT;
mbed_official 235:685d5f11838f 165 } else { // Slave
mbed_official 235:685d5f11838f 166 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 235:685d5f11838f 167 obj->mode = SPI_MODE_SLAVE;
mbed_official 235:685d5f11838f 168 obj->nss = SPI_NSS_HARD_INPUT;
mbed_official 235:685d5f11838f 169 }
mbed_official 235:685d5f11838f 170
mbed_official 235:685d5f11838f 171 init_spi(obj);
mbed_official 235:685d5f11838f 172 }
mbed_official 235:685d5f11838f 173
mbed_official 235:685d5f11838f 174 void spi_free(spi_t *obj)
mbed_official 235:685d5f11838f 175 {
mbed_official 235:685d5f11838f 176 // Reset SPI and disable clock
mbed_official 235:685d5f11838f 177 if (obj->spi == SPI_1) {
mbed_official 235:685d5f11838f 178 __SPI1_FORCE_RESET();
mbed_official 235:685d5f11838f 179 __SPI1_RELEASE_RESET();
mbed_official 235:685d5f11838f 180 __SPI1_CLK_DISABLE();
mbed_official 235:685d5f11838f 181 }
mbed_official 235:685d5f11838f 182 if (obj->spi == SPI_2) {
mbed_official 235:685d5f11838f 183 __SPI2_FORCE_RESET();
mbed_official 235:685d5f11838f 184 __SPI2_RELEASE_RESET();
mbed_official 235:685d5f11838f 185 __SPI2_CLK_DISABLE();
mbed_official 235:685d5f11838f 186 }
mbed_official 235:685d5f11838f 187 if (obj->spi == SPI_3) {
mbed_official 235:685d5f11838f 188 __SPI3_FORCE_RESET();
mbed_official 235:685d5f11838f 189 __SPI3_RELEASE_RESET();
mbed_official 235:685d5f11838f 190 __SPI3_CLK_DISABLE();
mbed_official 235:685d5f11838f 191 }
mbed_official 235:685d5f11838f 192 if (obj->spi == SPI_4) {
mbed_official 235:685d5f11838f 193 __SPI4_FORCE_RESET();
mbed_official 235:685d5f11838f 194 __SPI4_RELEASE_RESET();
mbed_official 235:685d5f11838f 195 __SPI4_CLK_DISABLE();
mbed_official 235:685d5f11838f 196 }
mbed_official 235:685d5f11838f 197 if (obj->spi == SPI_5) {
mbed_official 235:685d5f11838f 198 __SPI5_FORCE_RESET();
mbed_official 235:685d5f11838f 199 __SPI5_RELEASE_RESET();
mbed_official 235:685d5f11838f 200 __SPI5_CLK_DISABLE();
mbed_official 235:685d5f11838f 201 }
mbed_official 235:685d5f11838f 202
mbed_official 235:685d5f11838f 203 // Configure GPIOs
mbed_official 235:685d5f11838f 204 pin_function(obj->pin_miso, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 235:685d5f11838f 205 pin_function(obj->pin_mosi, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 235:685d5f11838f 206 pin_function(obj->pin_sclk, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 235:685d5f11838f 207 pin_function(obj->pin_ssel, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
mbed_official 235:685d5f11838f 208 }
mbed_official 235:685d5f11838f 209
mbed_official 235:685d5f11838f 210 void spi_format(spi_t *obj, int bits, int mode, int slave)
mbed_official 235:685d5f11838f 211 {
mbed_official 235:685d5f11838f 212 // Save new values
mbed_official 235:685d5f11838f 213 if (bits == 16) {
mbed_official 235:685d5f11838f 214 obj->bits = SPI_DATASIZE_16BIT;
mbed_official 235:685d5f11838f 215 } else {
mbed_official 235:685d5f11838f 216 obj->bits = SPI_DATASIZE_8BIT;
mbed_official 235:685d5f11838f 217 }
mbed_official 235:685d5f11838f 218
mbed_official 235:685d5f11838f 219 switch (mode) {
mbed_official 235:685d5f11838f 220 case 0:
mbed_official 235:685d5f11838f 221 obj->cpol = SPI_POLARITY_LOW;
mbed_official 235:685d5f11838f 222 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 235:685d5f11838f 223 break;
mbed_official 235:685d5f11838f 224 case 1:
mbed_official 235:685d5f11838f 225 obj->cpol = SPI_POLARITY_LOW;
mbed_official 235:685d5f11838f 226 obj->cpha = SPI_PHASE_2EDGE;
mbed_official 235:685d5f11838f 227 break;
mbed_official 235:685d5f11838f 228 case 2:
mbed_official 235:685d5f11838f 229 obj->cpol = SPI_POLARITY_HIGH;
mbed_official 235:685d5f11838f 230 obj->cpha = SPI_PHASE_1EDGE;
mbed_official 235:685d5f11838f 231 break;
mbed_official 235:685d5f11838f 232 default:
mbed_official 235:685d5f11838f 233 obj->cpol = SPI_POLARITY_HIGH;
mbed_official 235:685d5f11838f 234 obj->cpha = SPI_PHASE_2EDGE;
mbed_official 235:685d5f11838f 235 break;
mbed_official 235:685d5f11838f 236 }
mbed_official 235:685d5f11838f 237
mbed_official 235:685d5f11838f 238 if (slave == 0) {
mbed_official 235:685d5f11838f 239 obj->mode = SPI_MODE_MASTER;
mbed_official 235:685d5f11838f 240 obj->nss = SPI_NSS_SOFT;
mbed_official 235:685d5f11838f 241 } else {
mbed_official 235:685d5f11838f 242 obj->mode = SPI_MODE_SLAVE;
mbed_official 235:685d5f11838f 243 obj->nss = SPI_NSS_HARD_INPUT;
mbed_official 235:685d5f11838f 244 }
mbed_official 235:685d5f11838f 245
mbed_official 235:685d5f11838f 246 init_spi(obj);
mbed_official 235:685d5f11838f 247 }
mbed_official 235:685d5f11838f 248
mbed_official 235:685d5f11838f 249 void spi_frequency(spi_t *obj, int hz)
mbed_official 235:685d5f11838f 250 {
mbed_official 235:685d5f11838f 251 // Values depend of PCLK2: 100 MHz
mbed_official 235:685d5f11838f 252 if ((obj->spi == SPI_1) || (obj->spi == SPI_4) || (obj->spi == SPI_5)) {
mbed_official 235:685d5f11838f 253 if (hz < 700000) {
mbed_official 235:685d5f11838f 254 obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 391 kHz
mbed_official 235:685d5f11838f 255 } else if ((hz >= 700000) && (hz < 1000000)) {
mbed_official 235:685d5f11838f 256 obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 781 kHz
mbed_official 235:685d5f11838f 257 } else if ((hz >= 1000000) && (hz < 3000000)) {
mbed_official 235:685d5f11838f 258 obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 1.56 MHz
mbed_official 235:685d5f11838f 259 } else if ((hz >= 3000000) && (hz < 6000000)) {
mbed_official 235:685d5f11838f 260 obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 3.13 MHz
mbed_official 235:685d5f11838f 261 } else if ((hz >= 6000000) && (hz < 12000000)) {
mbed_official 235:685d5f11838f 262 obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 6.25 MHz
mbed_official 235:685d5f11838f 263 } else if ((hz >= 12000000) && (hz < 25000000)) {
mbed_official 235:685d5f11838f 264 obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 12.5 MHz
mbed_official 235:685d5f11838f 265 } else if ((hz >= 25000000) && (hz < 50000000)) {
mbed_official 235:685d5f11838f 266 obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 25 MHz
mbed_official 235:685d5f11838f 267 } else { // >= 50000000
mbed_official 235:685d5f11838f 268 obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 50 MHz
mbed_official 235:685d5f11838f 269 }
mbed_official 235:685d5f11838f 270 }
mbed_official 235:685d5f11838f 271
mbed_official 235:685d5f11838f 272 // Values depend of PCLK1: 50 MHz
mbed_official 235:685d5f11838f 273 if ((obj->spi == SPI_2) || (obj->spi == SPI_3)) {
mbed_official 235:685d5f11838f 274 if (hz < 400000) {
mbed_official 235:685d5f11838f 275 obj->br_presc = SPI_BAUDRATEPRESCALER_256; // 195 kHz
mbed_official 235:685d5f11838f 276 } else if ((hz >= 400000) && (hz < 700000)) {
mbed_official 235:685d5f11838f 277 obj->br_presc = SPI_BAUDRATEPRESCALER_128; // 391 kHz
mbed_official 235:685d5f11838f 278 } else if ((hz >= 700000) && (hz < 1000000)) {
mbed_official 235:685d5f11838f 279 obj->br_presc = SPI_BAUDRATEPRESCALER_64; // 781 MHz
mbed_official 235:685d5f11838f 280 } else if ((hz >= 1000000) && (hz < 3000000)) {
mbed_official 235:685d5f11838f 281 obj->br_presc = SPI_BAUDRATEPRESCALER_32; // 1.56 MHz
mbed_official 235:685d5f11838f 282 } else if ((hz >= 3000000) && (hz < 6000000)) {
mbed_official 235:685d5f11838f 283 obj->br_presc = SPI_BAUDRATEPRESCALER_16; // 3.13 MHz
mbed_official 235:685d5f11838f 284 } else if ((hz >= 6000000) && (hz < 12000000)) {
mbed_official 235:685d5f11838f 285 obj->br_presc = SPI_BAUDRATEPRESCALER_8; // 6.25 MHz
mbed_official 235:685d5f11838f 286 } else if ((hz >= 12000000) && (hz < 25000000)) {
mbed_official 235:685d5f11838f 287 obj->br_presc = SPI_BAUDRATEPRESCALER_4; // 12.5 MHz
mbed_official 235:685d5f11838f 288 } else { // >= 25000000
mbed_official 235:685d5f11838f 289 obj->br_presc = SPI_BAUDRATEPRESCALER_2; // 25 MHz
mbed_official 235:685d5f11838f 290 }
mbed_official 235:685d5f11838f 291 }
mbed_official 235:685d5f11838f 292
mbed_official 235:685d5f11838f 293 init_spi(obj);
mbed_official 235:685d5f11838f 294 }
mbed_official 235:685d5f11838f 295
mbed_official 235:685d5f11838f 296 static inline int ssp_readable(spi_t *obj)
mbed_official 235:685d5f11838f 297 {
mbed_official 235:685d5f11838f 298 int status;
mbed_official 235:685d5f11838f 299 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 300 // Check if data is received
mbed_official 235:685d5f11838f 301 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_RXNE) != RESET) ? 1 : 0);
mbed_official 235:685d5f11838f 302 return status;
mbed_official 235:685d5f11838f 303 }
mbed_official 235:685d5f11838f 304
mbed_official 235:685d5f11838f 305 static inline int ssp_writeable(spi_t *obj)
mbed_official 235:685d5f11838f 306 {
mbed_official 235:685d5f11838f 307 int status;
mbed_official 235:685d5f11838f 308 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 309 // Check if data is transmitted
mbed_official 235:685d5f11838f 310 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_TXE) != RESET) ? 1 : 0);
mbed_official 235:685d5f11838f 311 return status;
mbed_official 235:685d5f11838f 312 }
mbed_official 235:685d5f11838f 313
mbed_official 235:685d5f11838f 314 static inline void ssp_write(spi_t *obj, int value)
mbed_official 235:685d5f11838f 315 {
mbed_official 235:685d5f11838f 316 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 317 while (!ssp_writeable(obj));
mbed_official 235:685d5f11838f 318 spi->DR = (uint16_t)value;
mbed_official 235:685d5f11838f 319 }
mbed_official 235:685d5f11838f 320
mbed_official 235:685d5f11838f 321 static inline int ssp_read(spi_t *obj)
mbed_official 235:685d5f11838f 322 {
mbed_official 235:685d5f11838f 323 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 324 while (!ssp_readable(obj));
mbed_official 235:685d5f11838f 325 return (int)spi->DR;
mbed_official 235:685d5f11838f 326 }
mbed_official 235:685d5f11838f 327
mbed_official 235:685d5f11838f 328 static inline int ssp_busy(spi_t *obj)
mbed_official 235:685d5f11838f 329 {
mbed_official 235:685d5f11838f 330 int status;
mbed_official 235:685d5f11838f 331 SpiHandle.Instance = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 332 status = ((__HAL_SPI_GET_FLAG(&SpiHandle, SPI_FLAG_BSY) != RESET) ? 1 : 0);
mbed_official 235:685d5f11838f 333 return status;
mbed_official 235:685d5f11838f 334 }
mbed_official 235:685d5f11838f 335
mbed_official 235:685d5f11838f 336 int spi_master_write(spi_t *obj, int value)
mbed_official 235:685d5f11838f 337 {
mbed_official 235:685d5f11838f 338 ssp_write(obj, value);
mbed_official 235:685d5f11838f 339 return ssp_read(obj);
mbed_official 235:685d5f11838f 340 }
mbed_official 235:685d5f11838f 341
mbed_official 235:685d5f11838f 342 int spi_slave_receive(spi_t *obj)
mbed_official 235:685d5f11838f 343 {
mbed_official 235:685d5f11838f 344 return ((ssp_readable(obj) && !ssp_busy(obj)) ? 1 : 0);
mbed_official 235:685d5f11838f 345 };
mbed_official 235:685d5f11838f 346
mbed_official 235:685d5f11838f 347 int spi_slave_read(spi_t *obj)
mbed_official 235:685d5f11838f 348 {
mbed_official 235:685d5f11838f 349 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 350 while (!ssp_readable(obj));
mbed_official 235:685d5f11838f 351 return (int)spi->DR;
mbed_official 235:685d5f11838f 352 }
mbed_official 235:685d5f11838f 353
mbed_official 235:685d5f11838f 354 void spi_slave_write(spi_t *obj, int value)
mbed_official 235:685d5f11838f 355 {
mbed_official 235:685d5f11838f 356 SPI_TypeDef *spi = (SPI_TypeDef *)(obj->spi);
mbed_official 235:685d5f11838f 357 while (!ssp_writeable(obj));
mbed_official 235:685d5f11838f 358 spi->DR = (uint16_t)value;
mbed_official 235:685d5f11838f 359 }
mbed_official 235:685d5f11838f 360
mbed_official 235:685d5f11838f 361 int spi_busy(spi_t *obj)
mbed_official 235:685d5f11838f 362 {
mbed_official 235:685d5f11838f 363 return ssp_busy(obj);
mbed_official 235:685d5f11838f 364 }
mbed_official 235:685d5f11838f 365
mbed_official 235:685d5f11838f 366 #endif