AppNearMe µNFC stack for the NXP PN532 chip License: You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Dependents:   IOT_sensor_nfc AppNearMe_MuNFC_PN532_Test p2p_nfc_test NFCMoodLamp ... more

License

You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Committer:
AppNearMe
Date:
Thu Aug 16 15:35:56 2012 +0000
Revision:
6:15b1c45d50d4
Parent:
3:0b949b2d3b55
Child:
9:621a03f8d2f3
Fixes for LPC11U24 compatibility

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AppNearMe 6:15b1c45d50d4 1 /*
AppNearMe 6:15b1c45d50d4 2 MuNFCMbedPlatform.cpp
AppNearMe 6:15b1c45d50d4 3 Copyright (c) Donatien Garnier 2012
AppNearMe 6:15b1c45d50d4 4 donatien.garnier@appnearme.com
AppNearMe 6:15b1c45d50d4 5 http://www.appnearme.com/
AppNearMe 6:15b1c45d50d4 6 */
AppNearMe 6:15b1c45d50d4 7
AppNearMe 6:15b1c45d50d4 8 #include "mbed.h"
AppNearMe 6:15b1c45d50d4 9
AppNearMe 6:15b1c45d50d4 10 #include "MuNFCConfig.h"
AppNearMe 6:15b1c45d50d4 11 #include "munfc/nfc_config.h"
AppNearMe 6:15b1c45d50d4 12
AppNearMe 6:15b1c45d50d4 13 #if MUNFC_RTOS
AppNearMe 6:15b1c45d50d4 14 #include "rtos/rtos.h"
AppNearMe 6:15b1c45d50d4 15 #endif
AppNearMe 6:15b1c45d50d4 16
AppNearMe 6:15b1c45d50d4 17 //DigitalIn* nfc_irq_pin_int;
AppNearMe 6:15b1c45d50d4 18 InterruptIn* nfc_irq_pin_isr;
AppNearMe 6:15b1c45d50d4 19 DigitalOut* nfc_cs_pin;
AppNearMe 6:15b1c45d50d4 20 SPI* nfc_spi;
AppNearMe 6:15b1c45d50d4 21
AppNearMe 6:15b1c45d50d4 22 extern "C"
AppNearMe 6:15b1c45d50d4 23 {
AppNearMe 6:15b1c45d50d4 24 #if NFC_CONTROLLER == PN512
AppNearMe 6:15b1c45d50d4 25 #include "munfc/platform/pn512_platform.h"
AppNearMe 6:15b1c45d50d4 26 #elif NFC_CONTROLLER == PN532
AppNearMe 6:15b1c45d50d4 27 #include "munfc/platform/pn532_platform.h"
AppNearMe 6:15b1c45d50d4 28 #endif
AppNearMe 6:15b1c45d50d4 29 #include "munfc/platform/rtos.h"
AppNearMe 6:15b1c45d50d4 30
AppNearMe 6:15b1c45d50d4 31 #if NFC_CONTROLLER == PN512
AppNearMe 6:15b1c45d50d4 32 void pn512_io_init()
AppNearMe 6:15b1c45d50d4 33 {
AppNearMe 6:15b1c45d50d4 34 nfc_irq_pin_isr->rise(pn512_irq);
AppNearMe 6:15b1c45d50d4 35 *nfc_cs_pin = 1;
AppNearMe 6:15b1c45d50d4 36 }
AppNearMe 6:15b1c45d50d4 37
AppNearMe 6:15b1c45d50d4 38 /*
AppNearMe 6:15b1c45d50d4 39 * Get the IRQ pin's state
AppNearMe 6:15b1c45d50d4 40 */
AppNearMe 6:15b1c45d50d4 41 bool pn512_irq_pin_get()
AppNearMe 6:15b1c45d50d4 42 {
AppNearMe 6:15b1c45d50d4 43 //return (nfc_irq_pin_int->read() ? true : false);
AppNearMe 6:15b1c45d50d4 44 return (nfc_irq_pin_isr->read() ? true : false);
AppNearMe 6:15b1c45d50d4 45 }
AppNearMe 6:15b1c45d50d4 46
AppNearMe 6:15b1c45d50d4 47 /*
AppNearMe 6:15b1c45d50d4 48 * Set the CS pin to 0 (active low)
AppNearMe 6:15b1c45d50d4 49 */
AppNearMe 6:15b1c45d50d4 50 void pn512_cs_set()
AppNearMe 6:15b1c45d50d4 51 {
AppNearMe 6:15b1c45d50d4 52 *nfc_cs_pin = 0;
AppNearMe 6:15b1c45d50d4 53 }
AppNearMe 6:15b1c45d50d4 54
AppNearMe 6:15b1c45d50d4 55 /*
AppNearMe 6:15b1c45d50d4 56 * Set the CS pin to 1 (active high)
AppNearMe 6:15b1c45d50d4 57 */
AppNearMe 6:15b1c45d50d4 58 void pn512_cs_clear()
AppNearMe 6:15b1c45d50d4 59 {
AppNearMe 6:15b1c45d50d4 60 *nfc_cs_pin = 1;
AppNearMe 6:15b1c45d50d4 61 }
AppNearMe 6:15b1c45d50d4 62
AppNearMe 6:15b1c45d50d4 63 /*
AppNearMe 6:15b1c45d50d4 64 * You MUST call pn512_irq() on each raising front of IRQ pin
AppNearMe 6:15b1c45d50d4 65 */
AppNearMe 6:15b1c45d50d4 66 #endif
AppNearMe 6:15b1c45d50d4 67
AppNearMe 6:15b1c45d50d4 68 #if NFC_CONTROLLER == PN532
AppNearMe 6:15b1c45d50d4 69 /*
AppNearMe 6:15b1c45d50d4 70 * Init
AppNearMe 6:15b1c45d50d4 71 */
AppNearMe 6:15b1c45d50d4 72 void pn532_io_init(void)
AppNearMe 6:15b1c45d50d4 73 {
AppNearMe 6:15b1c45d50d4 74 #if defined( TARGET_LPC11U24 )
AppNearMe 6:15b1c45d50d4 75 nfc_irq_pin_isr->rise(pn532_irq); //Cannot trigger on falling edge
AppNearMe 6:15b1c45d50d4 76 #else
AppNearMe 6:15b1c45d50d4 77 nfc_irq_pin_isr->fall(pn532_irq);
AppNearMe 6:15b1c45d50d4 78 #endif
AppNearMe 6:15b1c45d50d4 79 *nfc_cs_pin = 1;
AppNearMe 6:15b1c45d50d4 80 }
AppNearMe 6:15b1c45d50d4 81
AppNearMe 6:15b1c45d50d4 82 /*
AppNearMe 6:15b1c45d50d4 83 * Get the IRQ pin's state
AppNearMe 6:15b1c45d50d4 84 */
AppNearMe 6:15b1c45d50d4 85 bool pn532_irq_pin_get(void)
AppNearMe 6:15b1c45d50d4 86 {
AppNearMe 6:15b1c45d50d4 87 //return (nfc_irq_pin_int->read() ? false : true);
AppNearMe 6:15b1c45d50d4 88 #if defined( TARGET_LPC11U24 )
AppNearMe 6:15b1c45d50d4 89 return (nfc_irq_pin_isr->read() ? true : false);
AppNearMe 6:15b1c45d50d4 90 #else
AppNearMe 6:15b1c45d50d4 91 return (nfc_irq_pin_isr->read() ? false : true);
AppNearMe 6:15b1c45d50d4 92 #endif
AppNearMe 6:15b1c45d50d4 93 }
AppNearMe 6:15b1c45d50d4 94
AppNearMe 6:15b1c45d50d4 95 /*
AppNearMe 6:15b1c45d50d4 96 * Set the CS pin to 0 (active low)
AppNearMe 6:15b1c45d50d4 97 */
AppNearMe 6:15b1c45d50d4 98 void pn532_cs_set(void)
AppNearMe 6:15b1c45d50d4 99 {
AppNearMe 6:15b1c45d50d4 100 *nfc_cs_pin = 0;
AppNearMe 6:15b1c45d50d4 101 }
AppNearMe 6:15b1c45d50d4 102
AppNearMe 6:15b1c45d50d4 103 /*
AppNearMe 6:15b1c45d50d4 104 * Set the CS pin to 1 (active high)
AppNearMe 6:15b1c45d50d4 105 */
AppNearMe 6:15b1c45d50d4 106 void pn532_cs_clear(void)
AppNearMe 6:15b1c45d50d4 107 {
AppNearMe 6:15b1c45d50d4 108 *nfc_cs_pin = 1;
AppNearMe 6:15b1c45d50d4 109 //wait_us(10);
AppNearMe 6:15b1c45d50d4 110 }
AppNearMe 6:15b1c45d50d4 111
AppNearMe 6:15b1c45d50d4 112 /*
AppNearMe 6:15b1c45d50d4 113 * You MUST call pn532_irq() on each falling front of IRQ pin
AppNearMe 6:15b1c45d50d4 114 */
AppNearMe 6:15b1c45d50d4 115 #endif
AppNearMe 6:15b1c45d50d4 116
AppNearMe 6:15b1c45d50d4 117 #if MUNFC_RTOS
AppNearMe 6:15b1c45d50d4 118 struct rtos_semaphore //To be defined by impl
AppNearMe 6:15b1c45d50d4 119 {
AppNearMe 6:15b1c45d50d4 120 Semaphore* s;
AppNearMe 6:15b1c45d50d4 121 };
AppNearMe 6:15b1c45d50d4 122
AppNearMe 6:15b1c45d50d4 123 struct rtos_semaphore* rtos_semaphore_new() //Should return NULL if fails
AppNearMe 6:15b1c45d50d4 124 {
AppNearMe 6:15b1c45d50d4 125 struct rtos_semaphore* pSem;
AppNearMe 6:15b1c45d50d4 126 pSem = new struct rtos_semaphore;
AppNearMe 6:15b1c45d50d4 127 pSem->s = new Semaphore(1);
AppNearMe 6:15b1c45d50d4 128 pSem->s->wait(osWaitForever);
AppNearMe 6:15b1c45d50d4 129 return pSem;
AppNearMe 6:15b1c45d50d4 130 }
AppNearMe 6:15b1c45d50d4 131
AppNearMe 6:15b1c45d50d4 132 DigitalOut led1(LED2);
AppNearMe 6:15b1c45d50d4 133 DigitalOut led2(LED3);
AppNearMe 6:15b1c45d50d4 134 DigitalOut led3(LED4);
AppNearMe 6:15b1c45d50d4 135 int rtos_semaphore_produce(struct rtos_semaphore* pSem)
AppNearMe 6:15b1c45d50d4 136 {
AppNearMe 6:15b1c45d50d4 137 static int count = 0;
AppNearMe 6:15b1c45d50d4 138 count ++;
AppNearMe 6:15b1c45d50d4 139 if(count >= 8)
AppNearMe 6:15b1c45d50d4 140 count = 0;
AppNearMe 6:15b1c45d50d4 141
AppNearMe 6:15b1c45d50d4 142 led1 = (count&1)?1:0;
AppNearMe 6:15b1c45d50d4 143 led2 = (count&2)?1:0;
AppNearMe 6:15b1c45d50d4 144 led3 = (count&4)?1:0;
AppNearMe 6:15b1c45d50d4 145
AppNearMe 6:15b1c45d50d4 146 pSem->s->release();
AppNearMe 6:15b1c45d50d4 147 return OK;
AppNearMe 6:15b1c45d50d4 148 }
AppNearMe 6:15b1c45d50d4 149
AppNearMe 6:15b1c45d50d4 150 int rtos_semaphore_consume(struct rtos_semaphore* pSem, int timeout)
AppNearMe 6:15b1c45d50d4 151 {
AppNearMe 6:15b1c45d50d4 152 int resid;
AppNearMe 6:15b1c45d50d4 153 if(timeout == -1)
AppNearMe 6:15b1c45d50d4 154 {
AppNearMe 6:15b1c45d50d4 155 resid = pSem->s->wait(osWaitForever);
AppNearMe 6:15b1c45d50d4 156 }
AppNearMe 6:15b1c45d50d4 157 else
AppNearMe 6:15b1c45d50d4 158 {
AppNearMe 6:15b1c45d50d4 159 resid = pSem->s->wait(timeout);
AppNearMe 6:15b1c45d50d4 160 }
AppNearMe 6:15b1c45d50d4 161 if(resid>0)
AppNearMe 6:15b1c45d50d4 162 {
AppNearMe 6:15b1c45d50d4 163 while( pSem->s->wait(0) > 0 );
AppNearMe 6:15b1c45d50d4 164 //printf("S\n");
AppNearMe 6:15b1c45d50d4 165 return OK;
AppNearMe 6:15b1c45d50d4 166 }
AppNearMe 6:15b1c45d50d4 167 else
AppNearMe 6:15b1c45d50d4 168 {
AppNearMe 6:15b1c45d50d4 169 //printf("T\n");
AppNearMe 6:15b1c45d50d4 170 return ERR_TIMEOUT;
AppNearMe 6:15b1c45d50d4 171 }
AppNearMe 6:15b1c45d50d4 172 }
AppNearMe 6:15b1c45d50d4 173 #else
AppNearMe 6:15b1c45d50d4 174 struct rtos_semaphore //To be defined by impl
AppNearMe 6:15b1c45d50d4 175 {
AppNearMe 6:15b1c45d50d4 176 volatile int p;
AppNearMe 6:15b1c45d50d4 177 };
AppNearMe 6:15b1c45d50d4 178
AppNearMe 6:15b1c45d50d4 179 struct rtos_semaphore* rtos_semaphore_new() //Should return NULL if fails
AppNearMe 6:15b1c45d50d4 180 {
AppNearMe 6:15b1c45d50d4 181 struct rtos_semaphore* pSem;
AppNearMe 6:15b1c45d50d4 182 pSem = new struct rtos_semaphore;
AppNearMe 6:15b1c45d50d4 183 pSem->p = 1;
AppNearMe 6:15b1c45d50d4 184 return pSem;
AppNearMe 6:15b1c45d50d4 185 }
AppNearMe 6:15b1c45d50d4 186
AppNearMe 6:15b1c45d50d4 187 //Will only be called from ISR
AppNearMe 6:15b1c45d50d4 188 int rtos_semaphore_produce(struct rtos_semaphore* pSem)
AppNearMe 6:15b1c45d50d4 189 {
AppNearMe 6:15b1c45d50d4 190 pSem->p++;
AppNearMe 6:15b1c45d50d4 191 return OK;
AppNearMe 6:15b1c45d50d4 192 }
AppNearMe 6:15b1c45d50d4 193
AppNearMe 6:15b1c45d50d4 194 void ___voidf(void)
AppNearMe 6:15b1c45d50d4 195 {
AppNearMe 6:15b1c45d50d4 196
AppNearMe 6:15b1c45d50d4 197 }
AppNearMe 6:15b1c45d50d4 198
AppNearMe 6:15b1c45d50d4 199 int rtos_semaphore_consume(struct rtos_semaphore* pSem, int timeout)
AppNearMe 6:15b1c45d50d4 200 {
AppNearMe 6:15b1c45d50d4 201 if(timeout == -1)
AppNearMe 6:15b1c45d50d4 202 {
AppNearMe 6:15b1c45d50d4 203 while(!pSem->p)
AppNearMe 6:15b1c45d50d4 204 {
AppNearMe 6:15b1c45d50d4 205 __WFI();
AppNearMe 6:15b1c45d50d4 206 }
AppNearMe 6:15b1c45d50d4 207 pSem->p--;
AppNearMe 6:15b1c45d50d4 208 }
AppNearMe 6:15b1c45d50d4 209 else if(timeout == 0)
AppNearMe 6:15b1c45d50d4 210 {
AppNearMe 6:15b1c45d50d4 211 if(pSem->p)
AppNearMe 6:15b1c45d50d4 212 {
AppNearMe 6:15b1c45d50d4 213 pSem->p--;
AppNearMe 6:15b1c45d50d4 214 }
AppNearMe 6:15b1c45d50d4 215 else
AppNearMe 6:15b1c45d50d4 216 {
AppNearMe 6:15b1c45d50d4 217 return ERR_TIMEOUT;
AppNearMe 6:15b1c45d50d4 218 }
AppNearMe 6:15b1c45d50d4 219 }
AppNearMe 6:15b1c45d50d4 220 else
AppNearMe 6:15b1c45d50d4 221 {
AppNearMe 6:15b1c45d50d4 222 Timer t;
AppNearMe 6:15b1c45d50d4 223 t.start();
AppNearMe 6:15b1c45d50d4 224 Ticker t_isr;
AppNearMe 6:15b1c45d50d4 225 t_isr.attach_us(&___voidf, 1000); //Just to generate an interrupt periodically
AppNearMe 6:15b1c45d50d4 226 while(!pSem->p)
AppNearMe 6:15b1c45d50d4 227 {
AppNearMe 6:15b1c45d50d4 228 __WFI();
AppNearMe 6:15b1c45d50d4 229 if(t.read_ms()>=timeout)
AppNearMe 6:15b1c45d50d4 230 {
AppNearMe 6:15b1c45d50d4 231 return ERR_TIMEOUT;
AppNearMe 6:15b1c45d50d4 232 }
AppNearMe 6:15b1c45d50d4 233 }
AppNearMe 6:15b1c45d50d4 234 pSem->p--;
AppNearMe 6:15b1c45d50d4 235 }
AppNearMe 6:15b1c45d50d4 236 return OK;
AppNearMe 6:15b1c45d50d4 237 }
AppNearMe 6:15b1c45d50d4 238 #endif
AppNearMe 6:15b1c45d50d4 239
AppNearMe 6:15b1c45d50d4 240
AppNearMe 6:15b1c45d50d4 241 //These functions must be implemented for each platform
AppNearMe 6:15b1c45d50d4 242
AppNearMe 6:15b1c45d50d4 243 #if NFC_CONTROLLER == PN512
AppNearMe 6:15b1c45d50d4 244 /*
AppNearMe 6:15b1c45d50d4 245 * Initialize SPI
AppNearMe 6:15b1c45d50d4 246 */
AppNearMe 6:15b1c45d50d4 247 int pn512_spi_init()
AppNearMe 6:15b1c45d50d4 248 {
AppNearMe 6:15b1c45d50d4 249 nfc_spi->format(8, 3);
AppNearMe 6:15b1c45d50d4 250 nfc_spi->frequency(10000000); //To change to 10000000
AppNearMe 6:15b1c45d50d4 251 return 0;
AppNearMe 6:15b1c45d50d4 252 }
AppNearMe 6:15b1c45d50d4 253 #endif
AppNearMe 6:15b1c45d50d4 254
AppNearMe 6:15b1c45d50d4 255 #if NFC_CONTROLLER == PN532
AppNearMe 6:15b1c45d50d4 256 /*
AppNearMe 6:15b1c45d50d4 257 * Initialize SPI
AppNearMe 6:15b1c45d50d4 258 */
AppNearMe 6:15b1c45d50d4 259 int pn532_spi_init()
AppNearMe 6:15b1c45d50d4 260 {
AppNearMe 6:15b1c45d50d4 261 nfc_spi->format(8, 0);
AppNearMe 6:15b1c45d50d4 262 nfc_spi->frequency(5000000);
AppNearMe 6:15b1c45d50d4 263 return 0;
AppNearMe 6:15b1c45d50d4 264 }
AppNearMe 6:15b1c45d50d4 265 #endif
AppNearMe 6:15b1c45d50d4 266
AppNearMe 6:15b1c45d50d4 267 #define reverse(x) ( (x & 0x01) << 7 \
AppNearMe 6:15b1c45d50d4 268 | (x & 0x02) << 5 \
AppNearMe 6:15b1c45d50d4 269 | (x & 0x04) << 3 \
AppNearMe 6:15b1c45d50d4 270 | (x & 0x08) << 1 \
AppNearMe 6:15b1c45d50d4 271 | (x & 0x10) >> 1 \
AppNearMe 6:15b1c45d50d4 272 | (x & 0x20) >> 3 \
AppNearMe 6:15b1c45d50d4 273 | (x & 0x40) >> 5 \
AppNearMe 6:15b1c45d50d4 274 | (x & 0x80) >> 7 )
AppNearMe 6:15b1c45d50d4 275
AppNearMe 6:15b1c45d50d4 276 /*
AppNearMe 6:15b1c45d50d4 277 * After skipping outSkip bytes, write outLen bytes
AppNearMe 6:15b1c45d50d4 278 * After skipping inSkip bytes, read inLen bytes
AppNearMe 6:15b1c45d50d4 279 * This will generate MAX(outSkip + outLen, inSkip + inLen) transfers on the SPI bus
AppNearMe 6:15b1c45d50d4 280 */
AppNearMe 6:15b1c45d50d4 281 int spi_transfer(uint8_t* outBuf, size_t outLen, size_t outSkip, uint8_t* inBuf,
AppNearMe 6:15b1c45d50d4 282 size_t inLen, size_t inSkip)
AppNearMe 6:15b1c45d50d4 283 {
AppNearMe 6:15b1c45d50d4 284 int len;
AppNearMe 6:15b1c45d50d4 285 int writeb;
AppNearMe 6:15b1c45d50d4 286 int readb;
AppNearMe 6:15b1c45d50d4 287 int outPos;
AppNearMe 6:15b1c45d50d4 288 int inPos;
AppNearMe 6:15b1c45d50d4 289
AppNearMe 6:15b1c45d50d4 290 outPos = inPos = 0;
AppNearMe 6:15b1c45d50d4 291
AppNearMe 6:15b1c45d50d4 292 len =
AppNearMe 6:15b1c45d50d4 293 (outSkip + outLen) > (inSkip + inLen) ? (outSkip + outLen) :
AppNearMe 6:15b1c45d50d4 294 (inSkip + inLen);
AppNearMe 6:15b1c45d50d4 295
AppNearMe 6:15b1c45d50d4 296 while (len--)
AppNearMe 6:15b1c45d50d4 297 {
AppNearMe 6:15b1c45d50d4 298 if (outSkip)
AppNearMe 6:15b1c45d50d4 299 {
AppNearMe 6:15b1c45d50d4 300 writeb = 0x00;
AppNearMe 6:15b1c45d50d4 301 outSkip--;
AppNearMe 6:15b1c45d50d4 302 }
AppNearMe 6:15b1c45d50d4 303 else if (outPos < outLen)
AppNearMe 6:15b1c45d50d4 304 {
AppNearMe 6:15b1c45d50d4 305 writeb = outBuf[outPos];
AppNearMe 6:15b1c45d50d4 306 outPos++;
AppNearMe 6:15b1c45d50d4 307 }
AppNearMe 6:15b1c45d50d4 308 else
AppNearMe 6:15b1c45d50d4 309 {
AppNearMe 6:15b1c45d50d4 310 writeb = 0x00;
AppNearMe 6:15b1c45d50d4 311 }
AppNearMe 6:15b1c45d50d4 312
AppNearMe 6:15b1c45d50d4 313 #if NFC_CONTROLLER == PN532
AppNearMe 6:15b1c45d50d4 314 writeb = reverse(writeb);
AppNearMe 6:15b1c45d50d4 315 #endif
AppNearMe 6:15b1c45d50d4 316
AppNearMe 6:15b1c45d50d4 317 #if defined( TARGET_LPC11U24 )
AppNearMe 6:15b1c45d50d4 318 //wait_us(30);
AppNearMe 6:15b1c45d50d4 319 #endif
AppNearMe 6:15b1c45d50d4 320
AppNearMe 6:15b1c45d50d4 321 readb = nfc_spi->write(writeb);
AppNearMe 6:15b1c45d50d4 322
AppNearMe 6:15b1c45d50d4 323 #if NFC_CONTROLLER == PN532
AppNearMe 6:15b1c45d50d4 324 readb = reverse(readb);
AppNearMe 6:15b1c45d50d4 325 #endif
AppNearMe 6:15b1c45d50d4 326
AppNearMe 6:15b1c45d50d4 327 if (inSkip)
AppNearMe 6:15b1c45d50d4 328 {
AppNearMe 6:15b1c45d50d4 329 inSkip--;
AppNearMe 6:15b1c45d50d4 330 }
AppNearMe 6:15b1c45d50d4 331 else if (inPos < inLen)
AppNearMe 6:15b1c45d50d4 332 {
AppNearMe 6:15b1c45d50d4 333 inBuf[inPos] = readb;
AppNearMe 6:15b1c45d50d4 334 inPos++;
AppNearMe 6:15b1c45d50d4 335 }
AppNearMe 6:15b1c45d50d4 336 }
AppNearMe 6:15b1c45d50d4 337 return 0;
AppNearMe 6:15b1c45d50d4 338 }
AppNearMe 6:15b1c45d50d4 339
AppNearMe 6:15b1c45d50d4 340 /*
AppNearMe 6:15b1c45d50d4 341 * Write outLen bytes
AppNearMe 6:15b1c45d50d4 342 */
AppNearMe 6:15b1c45d50d4 343 int spi_write(uint8_t* outBuf, size_t outLen)
AppNearMe 6:15b1c45d50d4 344 {
AppNearMe 6:15b1c45d50d4 345 return spi_transfer(outBuf, outLen, 0, (uint8_t*) NULL, 0, 0);
AppNearMe 6:15b1c45d50d4 346 }
AppNearMe 6:15b1c45d50d4 347
AppNearMe 6:15b1c45d50d4 348 /*
AppNearMe 6:15b1c45d50d4 349 * Read inLen bytes
AppNearMe 6:15b1c45d50d4 350 */
AppNearMe 6:15b1c45d50d4 351 int spi_read(uint8_t* inBuf, size_t inLen)
AppNearMe 6:15b1c45d50d4 352 {
AppNearMe 6:15b1c45d50d4 353 return spi_transfer((uint8_t*) NULL, 0, 0, inBuf, inLen, 0);
AppNearMe 6:15b1c45d50d4 354 }
AppNearMe 6:15b1c45d50d4 355
AppNearMe 6:15b1c45d50d4 356 /*
AppNearMe 6:15b1c45d50d4 357 * Skip len bytes
AppNearMe 6:15b1c45d50d4 358 */
AppNearMe 6:15b1c45d50d4 359 int spi_skip(size_t len)
AppNearMe 6:15b1c45d50d4 360 {
AppNearMe 6:15b1c45d50d4 361 return spi_transfer((uint8_t*) NULL, 0, len, (uint8_t*) NULL, 0, len);
AppNearMe 6:15b1c45d50d4 362 }
AppNearMe 6:15b1c45d50d4 363
AppNearMe 6:15b1c45d50d4 364 }
AppNearMe 6:15b1c45d50d4 365