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:
Mon Apr 28 16:00:08 2014 +0100
Revision:
172:2f4f8c56b261
Parent:
125:23cc3068a9e4
Child:
181:a4cbdfbbd2f4
Synchronized with git revision d57a23dd6e37a8b92073a94ad1daaeecd64865cb

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

[NUCLEO_F401RE] Add LSE configuration for RTC, remove trailing spaces, t...

Who changed what in which revision?

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