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