Andrea Stradella
/
SILICATUSA-ISO14443B
SILICA TUSA NXP CLRC66301HN1 RFID READER DEMO BOARD
main.cpp@0:24d5bc0093ad, 2012-04-24 (annotated)
- Committer:
- andreastradella
- Date:
- Tue Apr 24 09:44:29 2012 +0000
- Revision:
- 0:24d5bc0093ad
Working code for Silica TUSA RFID demo board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andreastradella | 0:24d5bc0093ad | 1 | #include "mbed.h" |
andreastradella | 0:24d5bc0093ad | 2 | |
andreastradella | 0:24d5bc0093ad | 3 | SPI spi(p11, p12, p13); // mosi, miso, sclk |
andreastradella | 0:24d5bc0093ad | 4 | DigitalOut cs(p28); // chip select |
andreastradella | 0:24d5bc0093ad | 5 | DigitalOut ifsel1(p26); // interface select pin for CLRC6630 |
andreastradella | 0:24d5bc0093ad | 6 | DigitalOut pdres(p27); // CLRC6630 RESET pin - H = RESET |
andreastradella | 0:24d5bc0093ad | 7 | DigitalOut led[] = {(LED1) , (LED2) , (LED3) , (LED4)}; // onboard LEDs |
andreastradella | 0:24d5bc0093ad | 8 | Serial pc(USBTX, USBRX); // tx, rx |
andreastradella | 0:24d5bc0093ad | 9 | |
andreastradella | 0:24d5bc0093ad | 10 | char r; |
andreastradella | 0:24d5bc0093ad | 11 | int w = 0; |
andreastradella | 0:24d5bc0093ad | 12 | //char ATQB0 , ATQB1 , ATQB2 , ATQB3 , ATQB4, ATQB5 , ATQB6 , ATQB7 , ATQB8 , ATQB9, ATQB10 , ATQB11 , ATQB12 , ATQB13 , ATQB14, ATQB15 , ATQB16 , ATQB17 , ATQB18; |
andreastradella | 0:24d5bc0093ad | 13 | |
andreastradella | 0:24d5bc0093ad | 14 | |
andreastradella | 0:24d5bc0093ad | 15 | //write SPI registers |
andreastradella | 0:24d5bc0093ad | 16 | void write_reg(char n, char o) |
andreastradella | 0:24d5bc0093ad | 17 | { |
andreastradella | 0:24d5bc0093ad | 18 | |
andreastradella | 0:24d5bc0093ad | 19 | cs=0; // device select |
andreastradella | 0:24d5bc0093ad | 20 | |
andreastradella | 0:24d5bc0093ad | 21 | spi.write (n<<1); |
andreastradella | 0:24d5bc0093ad | 22 | spi.write (o); |
andreastradella | 0:24d5bc0093ad | 23 | |
andreastradella | 0:24d5bc0093ad | 24 | cs=1; // device deselect |
andreastradella | 0:24d5bc0093ad | 25 | } |
andreastradella | 0:24d5bc0093ad | 26 | |
andreastradella | 0:24d5bc0093ad | 27 | |
andreastradella | 0:24d5bc0093ad | 28 | // read SPI registers |
andreastradella | 0:24d5bc0093ad | 29 | char read_reg(char n) |
andreastradella | 0:24d5bc0093ad | 30 | { |
andreastradella | 0:24d5bc0093ad | 31 | char t; |
andreastradella | 0:24d5bc0093ad | 32 | cs=0; // device select |
andreastradella | 0:24d5bc0093ad | 33 | |
andreastradella | 0:24d5bc0093ad | 34 | |
andreastradella | 0:24d5bc0093ad | 35 | spi.write ((n<<1)|0x01); |
andreastradella | 0:24d5bc0093ad | 36 | t=spi.write (0); |
andreastradella | 0:24d5bc0093ad | 37 | |
andreastradella | 0:24d5bc0093ad | 38 | cs=1; // device deselect |
andreastradella | 0:24d5bc0093ad | 39 | |
andreastradella | 0:24d5bc0093ad | 40 | return t; |
andreastradella | 0:24d5bc0093ad | 41 | } |
andreastradella | 0:24d5bc0093ad | 42 | |
andreastradella | 0:24d5bc0093ad | 43 | |
andreastradella | 0:24d5bc0093ad | 44 | //> Terminate any running command. Flush_FiFo |
andreastradella | 0:24d5bc0093ad | 45 | void terminate_and_flush_FiFo() |
andreastradella | 0:24d5bc0093ad | 46 | { |
andreastradella | 0:24d5bc0093ad | 47 | write_reg( 0x00, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 48 | write_reg( 0x02, 0xB0 ); |
andreastradella | 0:24d5bc0093ad | 49 | } |
andreastradella | 0:24d5bc0093ad | 50 | |
andreastradella | 0:24d5bc0093ad | 51 | |
andreastradella | 0:24d5bc0093ad | 52 | // Clear all IRQ 0,1 flags |
andreastradella | 0:24d5bc0093ad | 53 | void clear_IRQ() |
andreastradella | 0:24d5bc0093ad | 54 | { |
andreastradella | 0:24d5bc0093ad | 55 | write_reg( 0x06, 0x7F ); |
andreastradella | 0:24d5bc0093ad | 56 | write_reg( 0x07, 0x7F ); |
andreastradella | 0:24d5bc0093ad | 57 | } |
andreastradella | 0:24d5bc0093ad | 58 | |
andreastradella | 0:24d5bc0093ad | 59 | |
andreastradella | 0:24d5bc0093ad | 60 | // Disable Irq 0,1 sources |
andreastradella | 0:24d5bc0093ad | 61 | void disable_IRQ() |
andreastradella | 0:24d5bc0093ad | 62 | { |
andreastradella | 0:24d5bc0093ad | 63 | write_reg( 0x08, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 64 | write_reg( 0x09, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 65 | } |
andreastradella | 0:24d5bc0093ad | 66 | |
andreastradella | 0:24d5bc0093ad | 67 | |
andreastradella | 0:24d5bc0093ad | 68 | //> Wait until the command is finished. Enable IRQ sources. |
andreastradella | 0:24d5bc0093ad | 69 | void wait_command_and_enable_IRQ() |
andreastradella | 0:24d5bc0093ad | 70 | { |
andreastradella | 0:24d5bc0093ad | 71 | write_reg( 0x08, 0x18 ); // Enable Irqs 0,1 |
andreastradella | 0:24d5bc0093ad | 72 | write_reg( 0x09, 0x42 ); // Enable the global IRQ to be propagated to the IRQ pin |
andreastradella | 0:24d5bc0093ad | 73 | |
andreastradella | 0:24d5bc0093ad | 74 | while( (read_reg( 0x07 ) & 0x40)==0); |
andreastradella | 0:24d5bc0093ad | 75 | } |
andreastradella | 0:24d5bc0093ad | 76 | |
andreastradella | 0:24d5bc0093ad | 77 | |
andreastradella | 0:24d5bc0093ad | 78 | // Read IRQ 0,1 Status register |
andreastradella | 0:24d5bc0093ad | 79 | void read_IRQ_status() |
andreastradella | 0:24d5bc0093ad | 80 | { |
andreastradella | 0:24d5bc0093ad | 81 | r = read_reg( 0x06 ); |
andreastradella | 0:24d5bc0093ad | 82 | r = read_reg( 0x07 ); |
andreastradella | 0:24d5bc0093ad | 83 | } |
andreastradella | 0:24d5bc0093ad | 84 | |
andreastradella | 0:24d5bc0093ad | 85 | |
andreastradella | 0:24d5bc0093ad | 86 | // Start tranceive command |
andreastradella | 0:24d5bc0093ad | 87 | void start_tranceive() |
andreastradella | 0:24d5bc0093ad | 88 | { |
andreastradella | 0:24d5bc0093ad | 89 | write_reg( 0x00, 0x07 ); |
andreastradella | 0:24d5bc0093ad | 90 | wait(0.001); |
andreastradella | 0:24d5bc0093ad | 91 | } |
andreastradella | 0:24d5bc0093ad | 92 | |
andreastradella | 0:24d5bc0093ad | 93 | |
andreastradella | 0:24d5bc0093ad | 94 | int main() { |
andreastradella | 0:24d5bc0093ad | 95 | |
andreastradella | 0:24d5bc0093ad | 96 | // start activity LED; |
andreastradella | 0:24d5bc0093ad | 97 | led[3] = 0; |
andreastradella | 0:24d5bc0093ad | 98 | led[2] = 0; |
andreastradella | 0:24d5bc0093ad | 99 | led[1] = 0; |
andreastradella | 0:24d5bc0093ad | 100 | led[0] = 1; |
andreastradella | 0:24d5bc0093ad | 101 | |
andreastradella | 0:24d5bc0093ad | 102 | // set the comunication method |
andreastradella | 0:24d5bc0093ad | 103 | //ifsel1 = 0; // usare questa istruzione per le schede revisione prototipo |
andreastradella | 0:24d5bc0093ad | 104 | ifsel1 = 1; // usare questa istruzione per le schede revisione B |
andreastradella | 0:24d5bc0093ad | 105 | wait(0.001); |
andreastradella | 0:24d5bc0093ad | 106 | |
andreastradella | 0:24d5bc0093ad | 107 | // SPI comunication settings |
andreastradella | 0:24d5bc0093ad | 108 | spi.format(8,0); |
andreastradella | 0:24d5bc0093ad | 109 | spi.frequency(1000000); |
andreastradella | 0:24d5bc0093ad | 110 | do { |
andreastradella | 0:24d5bc0093ad | 111 | //RESET the device |
andreastradella | 0:24d5bc0093ad | 112 | pdres = 1; |
andreastradella | 0:24d5bc0093ad | 113 | wait(0.001); |
andreastradella | 0:24d5bc0093ad | 114 | pdres = 0; |
andreastradella | 0:24d5bc0093ad | 115 | |
andreastradella | 0:24d5bc0093ad | 116 | wait(0.005); |
andreastradella | 0:24d5bc0093ad | 117 | |
andreastradella | 0:24d5bc0093ad | 118 | //> Load Protocol |
andreastradella | 0:24d5bc0093ad | 119 | write_reg( 0x0F, 0x98 ); // Timer0 Timer starts at the end of transmission |
andreastradella | 0:24d5bc0093ad | 120 | write_reg( 0x37, 0xFF ); |
andreastradella | 0:24d5bc0093ad | 121 | write_reg( 0x14, 0x92 ); //Timer1 Timer starts at the end of transmission |
andreastradella | 0:24d5bc0093ad | 122 | write_reg( 0x19, 0x20 ); //Timer2 |
andreastradella | 0:24d5bc0093ad | 123 | write_reg( 0x1A, 0x03 ); //TReload Hi |
andreastradella | 0:24d5bc0093ad | 124 | write_reg( 0x1B, 0xFF ); //TReload Lo |
andreastradella | 0:24d5bc0093ad | 125 | write_reg( 0x1E, 0x00 ); //Timer3 |
andreastradella | 0:24d5bc0093ad | 126 | write_reg( 0x02, 0x90 ); //FIFO control register ->sets FIFO size to 255bytes |
andreastradella | 0:24d5bc0093ad | 127 | write_reg( 0x03, 0xFE ); //Waterlevel settings |
andreastradella | 0:24d5bc0093ad | 128 | write_reg( 0x0C, 0x80 ); //RXBitCtrl (Values AfterColl) |
andreastradella | 0:24d5bc0093ad | 129 | write_reg( 0x28, 0x87 ); //DrvMode_Reg both driver pins enable, invert one driver |
andreastradella | 0:24d5bc0093ad | 130 | write_reg( 0x29, 0xCC ); //00 TXAmp_Reg: set continous wave amplitude, set residual carrier |
andreastradella | 0:24d5bc0093ad | 131 | write_reg( 0x2A, 0x01 ); //DrvCon_Reg: sets driver config to TXEnvelope |
andreastradella | 0:24d5bc0093ad | 132 | write_reg( 0x2B, 0x05 ); //Txl_Reg: sets iiLoad, was auch immer das ist |
andreastradella | 0:24d5bc0093ad | 133 | write_reg( 0x34, 0x00 ); //RxSofD_Reg: Subcarrier and SOF detection off |
andreastradella | 0:24d5bc0093ad | 134 | write_reg( 0x38, 0x12 ); //Rcv_Reg: defines input for signal processing and defines collision level |
andreastradella | 0:24d5bc0093ad | 135 | |
andreastradella | 0:24d5bc0093ad | 136 | write_reg( 0x00, 0x00 ); //Idle commmand |
andreastradella | 0:24d5bc0093ad | 137 | wait(0.02); |
andreastradella | 0:24d5bc0093ad | 138 | |
andreastradella | 0:24d5bc0093ad | 139 | write_reg( 0x02, 0xB0 ); //FIFO Control |
andreastradella | 0:24d5bc0093ad | 140 | |
andreastradella | 0:24d5bc0093ad | 141 | write_reg( 0x06, 0x7F ); //IRQ0_Reg: |
andreastradella | 0:24d5bc0093ad | 142 | write_reg( 0x07, 0x7F ); //IRQ1_Reg: |
andreastradella | 0:24d5bc0093ad | 143 | write_reg( 0x05, 0x04 ); // write Tx and RX protocol numbers (04 for ISO14443B) |
andreastradella | 0:24d5bc0093ad | 144 | write_reg( 0x05, 0x04 ); // write Tx and RX protocol numbers (04 for ISO14443B) |
andreastradella | 0:24d5bc0093ad | 145 | write_reg( 0x08, 0x10 ); //IRQ0En_Reg: IdleIrq is enable propagated to GlobalIRQ |
andreastradella | 0:24d5bc0093ad | 146 | write_reg( 0x09, 0x40 ); //IRQ1En_Reg: GlobalIrq propagated to the interrupt pin |
andreastradella | 0:24d5bc0093ad | 147 | write_reg( 0x00, 0x0D ); //LoadProtocol |
andreastradella | 0:24d5bc0093ad | 148 | wait(0.02); |
andreastradella | 0:24d5bc0093ad | 149 | |
andreastradella | 0:24d5bc0093ad | 150 | write_reg( 0x08, 0x00 ); //Reset IRQ0 |
andreastradella | 0:24d5bc0093ad | 151 | write_reg( 0x09, 0x00 ); //Reset IRQ1 |
andreastradella | 0:24d5bc0093ad | 152 | write_reg( 0x02, 0xB0 ); //FIFO Control |
andreastradella | 0:24d5bc0093ad | 153 | |
andreastradella | 0:24d5bc0093ad | 154 | // Init registers. |
andreastradella | 0:24d5bc0093ad | 155 | write_reg( 0x2C, 0x7B ); |
andreastradella | 0:24d5bc0093ad | 156 | write_reg( 0x2D, 0x7B ); |
andreastradella | 0:24d5bc0093ad | 157 | write_reg( 0x2E, 0x08 ); |
andreastradella | 0:24d5bc0093ad | 158 | write_reg( 0x2F, 0x0A ); //00 |
andreastradella | 0:24d5bc0093ad | 159 | write_reg( 0x30, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 160 | write_reg( 0x31, 0x01 ); |
andreastradella | 0:24d5bc0093ad | 161 | write_reg( 0x33, 0x05 ); //05 |
andreastradella | 0:24d5bc0093ad | 162 | write_reg( 0x34, 0xB2 ); |
andreastradella | 0:24d5bc0093ad | 163 | write_reg( 0x35, 0x34 ); |
andreastradella | 0:24d5bc0093ad | 164 | write_reg( 0x37, 0x3F ); //3F |
andreastradella | 0:24d5bc0093ad | 165 | write_reg( 0x38, 0x12 ); // 12 |
andreastradella | 0:24d5bc0093ad | 166 | write_reg( 0x39, 0x0A ); //0A |
andreastradella | 0:24d5bc0093ad | 167 | // End of load protocol |
andreastradella | 0:24d5bc0093ad | 168 | |
andreastradella | 0:24d5bc0093ad | 169 | // start activity LED; |
andreastradella | 0:24d5bc0093ad | 170 | led[3] = 0; |
andreastradella | 0:24d5bc0093ad | 171 | led[2] = 0; |
andreastradella | 0:24d5bc0093ad | 172 | led[1] = 1; |
andreastradella | 0:24d5bc0093ad | 173 | led[0] = 0; |
andreastradella | 0:24d5bc0093ad | 174 | |
andreastradella | 0:24d5bc0093ad | 175 | //> ============================================== |
andreastradella | 0:24d5bc0093ad | 176 | //> Field Reset |
andreastradella | 0:24d5bc0093ad | 177 | //> ============================================== |
andreastradella | 0:24d5bc0093ad | 178 | |
andreastradella | 0:24d5bc0093ad | 179 | // Field off: Read out DrvMod register. Disable Drivers |
andreastradella | 0:24d5bc0093ad | 180 | r = read_reg( 0x28 ); // Response: 87 |
andreastradella | 0:24d5bc0093ad | 181 | |
andreastradella | 0:24d5bc0093ad | 182 | write_reg( 0x47, 0x04 ); // DEBUG |
andreastradella | 0:24d5bc0093ad | 183 | //> phhalHw_FieldOn |
andreastradella | 0:24d5bc0093ad | 184 | write_reg( 0x28, 0x8F ); |
andreastradella | 0:24d5bc0093ad | 185 | //SLP 100 |
andreastradella | 0:24d5bc0093ad | 186 | wait(0.02); |
andreastradella | 0:24d5bc0093ad | 187 | |
andreastradella | 0:24d5bc0093ad | 188 | //> Send REQB command |
andreastradella | 0:24d5bc0093ad | 189 | write_reg( 0x31, 0xC1 ); |
andreastradella | 0:24d5bc0093ad | 190 | write_reg( 0x32, 0x0B ); |
andreastradella | 0:24d5bc0093ad | 191 | write_reg( 0x00, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 192 | write_reg( 0x02, 0xB0 ); |
andreastradella | 0:24d5bc0093ad | 193 | write_reg( 0x06, 0x7F ); |
andreastradella | 0:24d5bc0093ad | 194 | write_reg( 0x07, 0x7F ); |
andreastradella | 0:24d5bc0093ad | 195 | |
andreastradella | 0:24d5bc0093ad | 196 | write_reg( 0x05, 0x06 ); // SR176 |
andreastradella | 0:24d5bc0093ad | 197 | write_reg( 0x05, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 198 | |
andreastradella | 0:24d5bc0093ad | 199 | /*write_reg( 0x05, 0x00 ); // GMTL |
andreastradella | 0:24d5bc0093ad | 200 | write_reg( 0x05, 0x0B ); |
andreastradella | 0:24d5bc0093ad | 201 | write_reg( 0x05, 0x3F ); |
andreastradella | 0:24d5bc0093ad | 202 | write_reg( 0x05, 0x80 ); */ |
andreastradella | 0:24d5bc0093ad | 203 | |
andreastradella | 0:24d5bc0093ad | 204 | /*write_reg( 0x05, 0x05 ); //ISO14443B |
andreastradella | 0:24d5bc0093ad | 205 | write_reg( 0x05, 0x00 ); |
andreastradella | 0:24d5bc0093ad | 206 | write_reg( 0x05, 0x00 );*/ |
andreastradella | 0:24d5bc0093ad | 207 | |
andreastradella | 0:24d5bc0093ad | 208 | write_reg( 0x00, 0x07 ); // Response: 00 |
andreastradella | 0:24d5bc0093ad | 209 | |
andreastradella | 0:24d5bc0093ad | 210 | //SLP 100 |
andreastradella | 0:24d5bc0093ad | 211 | wait(0.02); |
andreastradella | 0:24d5bc0093ad | 212 | |
andreastradella | 0:24d5bc0093ad | 213 | //RE 04 0C // Read FIFOLevel (12 bytes) |
andreastradella | 0:24d5bc0093ad | 214 | r = read_reg( 0x04 ); |
andreastradella | 0:24d5bc0093ad | 215 | //if (r != 0x1B) return; |
andreastradella | 0:24d5bc0093ad | 216 | |
andreastradella | 0:24d5bc0093ad | 217 | if( r != 0 ) |
andreastradella | 0:24d5bc0093ad | 218 | { |
andreastradella | 0:24d5bc0093ad | 219 | // start activity LED; |
andreastradella | 0:24d5bc0093ad | 220 | led[3] = 1; |
andreastradella | 0:24d5bc0093ad | 221 | led[2] = 0; |
andreastradella | 0:24d5bc0093ad | 222 | led[1] = 0; |
andreastradella | 0:24d5bc0093ad | 223 | led[0] = 0; |
andreastradella | 0:24d5bc0093ad | 224 | pc.printf("received = 0x%02X bytes: ", r); |
andreastradella | 0:24d5bc0093ad | 225 | while( read_reg( 0x04 ) ) |
andreastradella | 0:24d5bc0093ad | 226 | { |
andreastradella | 0:24d5bc0093ad | 227 | pc.printf("%02X ", r = read_reg( 0x05 )); |
andreastradella | 0:24d5bc0093ad | 228 | } |
andreastradella | 0:24d5bc0093ad | 229 | pc.printf("\r\n", r); |
andreastradella | 0:24d5bc0093ad | 230 | } |
andreastradella | 0:24d5bc0093ad | 231 | else |
andreastradella | 0:24d5bc0093ad | 232 | pc.printf("NO CARD\r\n"); |
andreastradella | 0:24d5bc0093ad | 233 | |
andreastradella | 0:24d5bc0093ad | 234 | } while( -1 ); |
andreastradella | 0:24d5bc0093ad | 235 | } |