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:
Wed May 27 13:30:08 2015 +0100
Revision:
552:a1b9575155a3
Parent:
544:1af5f1c39e80
Synchronized with git revision a74a8f14fd8c4bf3dc09980c4bf9498ebcf4c207

Full URL: https://github.com/mbedmicro/mbed/commit/a74a8f14fd8c4bf3dc09980c4bf9498ebcf4c207/

Who changed what in which revision?

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