Mbed SDK for XRange SX1272 LoRa module

Dependents:   XRangePingPong XRange-LoRaWAN-lmic-app lora-transceiver

SX1272 LoRa RF module

https://www.netblocks.eu/xrange-sx1272-lora-datasheet/

Committer:
netblocks
Date:
Thu Jan 07 13:01:25 2016 +0000
Revision:
339:ac6f3fd999f3
Parent:
336:1e18a06a987b
HSE_VALUE set for XTAL 16Mhz

Who changed what in which revision?

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