mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
shaoziyang
Date:
Sat Sep 13 14:25:46 2014 +0000
Revision:
323:9e901b0a5aa1
Parent:
235:685d5f11838f
test with CLOCK_SETUP = 0

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