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