mbed library sources(for async_print)

Dependents:   AsyncPrint

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Jul 06 09:00:34 2015 +0100
Revision:
582:a89625bcd809
Parent:
573:ad23fe03a082
Synchronized with git revision 45004fb61e4af8f74f4e916318df5207fcf6076d

Full URL: https://github.com/mbedmicro/mbed/commit/45004fb61e4af8f74f4e916318df5207fcf6076d/

DISCO_F746NG - Fix several issues

Who changed what in which revision?

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