SILICA TUSA NXP CLRC66301HN1 RFID READER DEMO BOARD

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
andreastradella
Date:
Tue Apr 24 09:40:29 2012 +0000
Commit message:
Working code for Silica TUSA RFID demo board

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d0a023131133 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Apr 24 09:40:29 2012 +0000
@@ -0,0 +1,542 @@
+#include "mbed.h"
+
+SPI spi(p11, p12, p13); // mosi, miso, sclk
+DigitalOut cs(p28); // chip select
+DigitalOut ifsel1(p26); // interface select pin for  CLRC6630
+DigitalOut pdres(p27); // CLRC6630 RESET pin - H = RESET
+DigitalOut led[] = {(LED1) , (LED2) , (LED3) , (LED4)}; // onboard LEDs
+Serial pc(USBTX, USBRX); // tx, rx
+
+char r;
+int w = 0;
+char UID0 , UID1 , UID2 , UID3 , UID4;
+
+ 
+//write SPI registers    
+void write_reg(char n, char o)
+{
+ 
+    cs=0; // device select
+    
+    spi.write (n<<1);
+    spi.write (o);
+    
+    cs=1; // device deselect
+ }
+ 
+
+// read SPI registers
+char read_reg(char n)
+{
+    char t;
+    cs=0; // device select
+    
+    
+    spi.write ((n<<1)|0x01);
+    t=spi.write (0);
+        
+    cs=1; // device deselect
+    
+    return t;
+ }
+ 
+
+//> Terminate any running command. Flush_FiFo
+void terminate_and_flush_FiFo()
+{
+   write_reg( 0x00, 0x00 );
+   write_reg( 0x02, 0xb0 );
+}
+
+
+// Clear all IRQ 0,1 flags
+void clear_IRQ()
+{
+   write_reg( 0x06, 0x7f );
+   write_reg( 0x07, 0x7f );
+} 
+
+
+// Disable Irq 0,1 sources
+void disable_IRQ()
+{
+   write_reg( 0x08, 0x00 );       
+   write_reg( 0x09, 0x00 );
+}
+
+
+//> Wait until the command is finished. Enable IRQ sources.
+void wait_command_and_enable_IRQ()
+{
+   write_reg( 0x08, 0x18 );         // Enable Irqs 0,1
+   write_reg( 0x09, 0x42 );         // Enable the global IRQ to be propagated to the IRQ pin
+            
+   while( (read_reg( 0x07 ) & 0x40)==0);
+}
+
+
+// Read IRQ 0,1 Status register
+void read_IRQ_status()
+{
+   r = read_reg( 0x06 );
+   r = read_reg( 0x07 );
+}
+
+
+// Start tranceive command
+void start_tranceive()
+{
+    write_reg( 0x00, 0x07 );
+    wait(0.001);
+}
+
+ 
+ int main() {
+    
+    while (1) {
+    
+        //  start activity LED;
+        led[3] = 0;
+        led[2] = 0;
+        led[1] = 0;
+        led[0] = 1;
+                
+        // set the comunication method
+        //ifsel1 = 0; // usare questa istruzione per le schede revisione prototipo
+        ifsel1 = 1; // usare questa istruzione per le schede revisione B
+        wait(0.001);
+    
+        // SPI comunication settings
+        spi.format(8,0);
+        spi.frequency(1000000);
+    
+            do {
+                              
+                w = 0;
+    
+                    do {
+                    
+                    wait(0.1);
+                    
+                    //RESET the device
+                    pdres = 1;
+                    wait(0.001);
+                    pdres = 0;
+    
+                    wait(0.005);
+        
+//> =============================================
+//> RC663 Script for (Iso14443-3A protocol):
+//>   * ReqA
+//>   * Get UID (Select: Casade level 1)
+//>   * HaltA 
+//> 
+//> Note: Only one PICC shall be in HF
+//> =============================================
+
+//> =============================================
+//> RC663 ApplyProtocolSettings:  ISO14443A=01
+//> =============================================
+//
+//> Configure Timers 
+//
+// Set Timer-0, T0Control_Reg:
+// Starts at the end of Tx. Stops after Rx of first data. Auto-reloaded. 13.56 MHz input clock.
+   write_reg( 0x0F, 0x98 );    
+
+// Set Timer-1, T1Control_Reg:
+// Starts at the end of Tx. Stops after Rx of first data. Input clock - cascaded with Timer-0.
+   write_reg( 0x14, 0x92 );
+   
+// Set Timer-2, T2Control_Reg:  Timer used for LFO trimming
+   write_reg( 0x19, 0x20 );
+                
+// Set Timer-2 reload value (T2ReloadHi_Reg and T2ReloadLo_Reg)
+   write_reg( 0x1A, 0x03 );
+   write_reg( 0x1B, 0xFF );                            
+    
+// Set Timer-3, T3Control_Reg:
+// Not started automatically. Not reloaded. Input clock 13.56 MHz                
+   write_reg( 0x1E, 0x00 );
+                            
+//> Configure FIFO Size=255 and Water-level
+// Set FifoControl_Reg, Fifo size=255 bytes. Flush FIFO
+   write_reg( 0x02, 0x90 );            
+    
+// Set WaterLevel =(FIFO length -1)
+   write_reg( 0x03, 0xFE );
+                        
+// RxBitCtrl_Reg(0x0c)    Received bit after collision are replaced with 1.
+   write_reg( 0x0C, 0x80 );
+    
+// DrvMod reg(0x28), Tx2Inv=1
+   r = read_reg( 0x28  );    
+   write_reg( 0x28, 0x80 );
+                
+// TxAmp_Reg(0x29)
+   write_reg( 0x29, 0x00 );                
+   
+// DrvCon_Reg(0x2A)
+   write_reg( 0x2A, 0x01 );     
+   
+// TxI_Reg(0x05),(0x05)
+   write_reg( 0x2B, 0x05 );
+                
+// RxSOFD_Reg(0x34),(0x00), 
+   write_reg( 0x34, 0x00 );
+    
+// Rcv_Reg(0x38),(0x12) 
+   write_reg( 0x38, 0x12 );
+//
+//> =============================================
+//> 2. LoadProtocol( bTxProtocol=0, bRxProtocol=0)
+//> =============================================
+
+//> Terminate any running command. Flush_FiFo
+   terminate_and_flush_FiFo();
+
+// Clear all IRQ 0,1 flags
+   clear_IRQ();
+   
+//> Write in Fifo: Tx and Rx protocol numbers(0,0) 
+   r = read_reg( 0x04 );
+   write_reg( 0x05, 0x00 );    // Rx protocol=0
+   write_reg( 0x05, 0x00 );    // Tx prot=0
+
+// Enable IRQ0 interrupt sources 
+// 
+// Idle interrupt(Command terminated), RC663_BIT_IDLEIRQ=0x10
+   r = read_reg( 0x08 );
+   write_reg( 0x08, 0x10 );
+         
+// Enable Global IRQ propagation.
+   r = read_reg( 0x09 );
+   write_reg( 0x09, 0x40 );
+   wait(0.001);
+   r = read_reg( 0x09 );   
+
+//> Start RC663 command "Load Protocol"=0x0d
+   write_reg( 0x00, 0x0D );
+
+//L_LoadProtocol
+
+   while( (read_reg( 0x07 ) & 0x40)==0);
+   
+// Disable Irq 0,1 sources
+   disable_IRQ();
+
+//> Flush Fifo. Read Error Reg
+   write_reg( 0x02, 0xB0 );
+   r = read_reg( 0x0A );
+
+// Apply RegisterSet
+//
+//> Configure CRC-16 calculation, preset value(0x6363) for Tx&Rx
+   write_reg( 0x2C, 0x18 );
+   write_reg( 0x2D, 0x18 );
+   write_reg( 0x2E, 0x08  );
+
+// Length of the pulse modulation in carrier clks+1  
+   write_reg( 0x2F, 0x20 );
+   
+// Symbol 1 and 0 burst lengths = 8 bits.
+   write_reg( 0x30, 0x00 );
+   
+// Start symbol=Symbol2, Stop symbol=Symbol3
+   write_reg( 0x33, 0xCF );
+ 
+// Set Rx Baudrate 106 kBaud    
+   write_reg( 0x35, 0x04 );
+  
+// Set min-levels for Rx and phase shift   
+   write_reg( 0x37, 0x32 );
+   write_reg( 0x39, 0x00 );
+                 
+// Set Rx waiting time  
+   write_reg( 0x36, 0x90 );
+   write_reg( 0x31, 0xC0 );
+   write_reg( 0x32, 0x0B );
+
+// Set Timeout. Write T0,T1 reload values(hi,Low)
+   write_reg( 0x10, 0x08 );
+   write_reg( 0x11, 0xD8 );
+   write_reg( 0x15, 0x00 );
+   write_reg( 0x16, 0x00 );
+   
+// Write DrvMod register   
+   write_reg( 0x28, 0x81 );
+   
+//> MIFARE Crypto1 state is further disabled.
+   write_reg( 0x0B, 0x00 );
+
+//>  FieldOn
+   write_reg( 0x28, 0x89 );
+   
+   wait(0.005);
+   
+//> =============================================
+//>  I14443p3a_Sw_RequestA
+//> =============================================
+   
+//  TxWaitStart at the end of Rx data
+   write_reg( 0x31, 0xC0 );
+   
+// Set min.time between Rx and Tx or between two Tx   
+   write_reg( 0x32, 0x0B );
+         
+//> Set timeout for this command cmd. Init reload values for timers-0,1 
+   write_reg( 0x10, 0x08 );
+   write_reg( 0x11, 0x94 );
+   write_reg( 0x15, 0x00 );           
+   write_reg( 0x16, 0x00 );
+   write_reg( 0x06, 0x08 );
+   write_reg( 0x36, 0x90 );
+   write_reg( 0x2E, 0x0F );    
+
+//> ---------------------
+//> Send the ReqA command  
+//> ---------------------
+
+//> Terminate any running command. FlushFifo
+   terminate_and_flush_FiFo();      
+
+// Clear all IRQ 0,1 flags 
+   clear_IRQ();
+
+//> Write ReqA=26 into FIFO
+   write_reg( 0x05, 0x26 );    
+
+//> Start RC663 command "Transcieve"=0x07. Activate Rx after Tx finishes.
+   write_reg( 0x00, 0x07 );
+   
+//> Wait until the command is finished. Enable IRQ sources.
+   wait_command_and_enable_IRQ();
+   
+// Disable Irq 0,1 sources
+   disable_IRQ();       
+   
+// Return Irq0 status    
+   r = read_reg( 0x06 );   
+
+//> Wait until reception
+   write_reg( 0x08, 0x54 );
+   write_reg( 0x09, 0x42 );
+   wait(0.001);
+   
+   while( (read_reg( 0x07 ) & 0x40)==0);
+   
+   while (w == 0){
+   pc.printf("\nNO CARD DETECTED...\n");
+   pc.printf("WAITING FOR A CARD...\n");
+   w++;
+   }
+   
+   } while ( read_reg( 0x40 == 0 ) );
+   
+   write_reg( 0x08, 0x00 );
+   write_reg( 0x09, 0x00 );
+      
+   r = read_reg( 0x05 );     
+   r = read_reg( 0x05 );    
+               
+// Read the error register            
+   r = read_reg( 0x0a );            
+
+// Reset TxLastBits_Reg
+   write_reg( 0x2E, 0x08 );
+
+//> ------------------------------
+//> Get UID cascade level-1
+//> ------------------------------               
+   write_reg( 0x2E, 0x08 );
+   write_reg( 0x0C, 0x00 );
+
+// Terminate any running command, FlushFifo
+   terminate_and_flush_FiFo();
+
+// Clear all IRQ 0,1 flags 
+    clear_IRQ();
+      
+//> Write "Antcollision CL 1" cmd into FIFO (SEL=93, NVB=20)
+    write_reg( 0x05, 0x93 );
+    write_reg( 0x05, 0x20 );
+      
+// Start tranceive command
+   start_tranceive();
+    
+// Wait until the command is finished 
+   wait_command_and_enable_IRQ();
+    
+// Disable IRQ0 interrupt sources
+   disable_IRQ();
+          
+// Read IRQ 0,1 Status register        
+   read_IRQ_status();    
+  
+//> Read FIFO, Expected - Complete UID (one PICC in HF)
+    r = read_reg( 0x04 );            // FIFO length
+   
+    // Cascade Tag (UID0)
+    pc.printf("\nUID = 0x%02X",  UID0 = read_reg( 0x05 ));
+        
+    // UID1
+    pc.printf("%02X",  UID1 = read_reg( 0x05 ));
+        
+    // UID2
+    pc.printf("%02X",  UID2 =read_reg( 0x05 ));
+        
+    // UID3
+    pc.printf("%02X\n",  UID3 =read_reg( 0x05 ));
+       
+    // BCC
+    pc.printf("BCC = 0x%02X\n",  UID4 =read_reg( 0x05 ));
+       
+    led[1] = 1;
+    
+    w = 1;
+
+//> Read Error register       
+    r = read_reg( 0x0A );
+    
+//> ------------------------------
+//> Select cascade level-1
+//> ------------------------------               
+// Terminate any running command, FlushFifo
+   terminate_and_flush_FiFo();
+   
+   write_reg( 0x2C, 0x19 );          // Enable RX and TX CRC
+   write_reg( 0x2D, 0x19 ); 
+   write_reg( 0x0C, 0x00 ); 
+
+
+// Clear all IRQ 0,1 flags 
+   clear_IRQ();
+      
+//> Write "Select CL 1" cmd into FIFO (SEL=93, NVB=70)
+   write_reg( 0x05, 0x93 );
+   write_reg( 0x05, 0x70 );
+   write_reg( 0x05, UID0 );          // UID bytes ...
+   write_reg( 0x05, UID1 );
+   write_reg( 0x05, UID2 );
+   write_reg( 0x05, UID3 );
+   write_reg( 0x05, UID4 );
+      
+// Start tranceive command 
+   start_tranceive();
+
+// Wait until the command is finished 
+   wait_command_and_enable_IRQ();
+      
+// Disable IRQ0 interrupt sources
+   disable_IRQ();
+          
+// Read IRQ 0,1 Status register        
+   read_IRQ_status();
+      
+//> Read FIFO, Expected - Complete UID (one PICC in HF)
+   r = read_reg( 0x04 );             // FIFO length
+   
+   } while( (read_reg( 0x05 ) & 0x04) == 0 );
+
+   pc.printf("7 BYTE CARD DETECTED\n");
+   
+   led[2] = 1;
+   
+//----------------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------------
+//> ------------------------------
+//> Get UID cascade level-2
+//> ------------------------------               
+   write_reg( 0x2E, 0x08 );
+   write_reg( 0x0C, 0x00 );
+   write_reg( 0x2C, 0x18 );       // TX, RX CRC off
+   write_reg( 0x2D, 0x18 ); 
+
+// Terminate any running command, FlushFifo
+   terminate_and_flush_FiFo();
+
+// Clear all IRQ 0,1 flags 
+   clear_IRQ();
+      
+//> Write "Antcollision CL 2" cmd into FIFO (SEL=95, NVB=20)
+   write_reg( 0x05, 0x95 );
+   write_reg( 0x05, 0x20 );
+      
+// Start tranceive command 
+   start_tranceive();   
+
+// Wait until the command is finished 
+   wait_command_and_enable_IRQ();   
+   
+// Disable IRQ0 interrupt sources
+   disable_IRQ();
+          
+// Read IRQ 0,1 Status register        
+   read_IRQ_status();    
+  
+//> Read FIFO
+   r = read_reg( 0x04 );             // FIFO length
+   
+   // Cascade Tag (UID0)
+    pc.printf("UID = 0x%02X",  UID0 = read_reg( 0x05 ));
+        
+    // UID1
+    pc.printf("%02X",  UID1 = read_reg( 0x05 ));   
+    
+    // UID2
+    pc.printf("%02X",  UID2 =read_reg( 0x05 ));   
+    
+    // UID
+    pc.printf("%02X\n",  UID3 =read_reg( 0x05 ));   
+    
+    // BCC
+    pc.printf("BCC = 0x%02X\n",  UID4 =read_reg( 0x05 ));
+    
+    led[3] = 1;
+
+//> Read Error register       
+   r = read_reg( 0x0A );   
+
+//> ------------------------------
+//> Select cascade level-2
+//> ------------------------------               
+// Terminate any running command, FlushFifo
+   terminate_and_flush_FiFo();
+   
+   write_reg( 0x2C, 0x19 );          // Enable RX and TX CRC
+   write_reg( 0x2D, 0x19 ); 
+   write_reg( 0x0C, 0x00 ); 
+
+// Clear all IRQ 0,1 flags 
+   clear_IRQ();
+      
+//> Write "Select CL 2" cmd into FIFO (SEL=95, NVB=70)
+   write_reg( 0x05, 0x95 );
+   write_reg( 0x05, 0x70 );
+   write_reg( 0x05, UID0 );          // UID bytes ...
+   write_reg( 0x05, UID1 );
+   write_reg( 0x05, UID2 );
+   write_reg( 0x05, UID3 );
+   write_reg( 0x05, UID4 );
+      
+// Start tranceive command 
+   start_tranceive();
+
+// Wait until the command is finished 
+   wait_command_and_enable_IRQ();
+      
+// Disable IRQ0 interrupt sources
+   disable_IRQ();
+          
+// Read IRQ 0,1 Status register
+   read_IRQ_status();
+  
+//> Read FIFO
+   r = read_reg( 0x04 );              // FIFO length
+   
+   r = read_reg( 0x05 );              // Response
+  
+   led[3] = 1 ;
+
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r d0a023131133 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Apr 24 09:40:29 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/b4b9f287a47e