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@6:15b1c45d50d4, 2012-08-16 (annotated)
- 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?
User | Revision | Line number | New 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 |