3 Replies Latest reply on Feb 22, 2014 8:32 AM by vlvrd

    SPI problem with NFC Shield

    vlvrd

      Hi all, I've been trying to enable a Seeed NFC Shield V2.0 with the Galileo, but with no success. Here's the library that I've been trying to use: File:PN532 SPI V2.zip - Wiki. Also, this is the Seeed-provided code that I've been using (from NFC Shield V2.0 - Wiki):

       

      //This example reads all MIFARE memory block from 0x00 to 0x63.

      //It is tested with a new MIFARE 1K cards. Uses default keys for authenication.

      //Contributed by Seeed Technology Inc (www.seeedstudio.com)

       

      #include <PN532.h>

      #include <SPI.h>

       

      /*Chip select pin can be connected to D10 or D9 which is hareware optional*/

      /*if you the version of NFC Shield from SeeedStudio is v2.0.*/

      #define PN532_CS 10

       

      PN532 nfc(PN532_CS);

       

      #define NFC_DEMO_DEBUG 1

       

      void setup(void) {

      #ifdef NFC_DEMO_DEBUG

        Serial.begin(9600);

        Serial.println("Hello!");

      #endif

        nfc.begin();

       

        uint32_t versiondata = nfc.getFirmwareVersion();

        if (! versiondata) {

      #ifdef NFC_DEMO_DEBUG

         Serial.print("Didn't find PN53x board");

      #endif

         while (1); // halt

        }

      #ifdef NFC_DEMO_DEBUG

        // Got ok data, print it out!

        Serial.print("Found chip PN5");

        Serial.println((versiondata>>24) & 0xFF, HEX);

        Serial.print("Firmware ver. ");

        Serial.print((versiondata>>16) & 0xFF, DEC);

        Serial.print('.');

        Serial.println((versiondata>>8) & 0xFF, DEC);

        Serial.print("Supports ");

        Serial.println(versiondata & 0xFF, HEX);

      #endif

        // configure board to read RFID tags and cards

        nfc.SAMConfig();

      }

       

      void loop(void) {

        uint32_t id;

        // look for MiFare type cards

        id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

       

        if (id != 0)

        {

      #ifdef NFC_DEMO_DEBUG

         Serial.print("Read card #");

         Serial.println(id);

         Serial.println();

      #endif

        uint8_t keys[]= { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };// default key of a fresh card

         for(uint8_t blockn=0;blockn<64;blockn++)

         {

         if(nfc.authenticateBlock(1, id ,blockn,KEY_A,keys)) //authenticate block blockn

         {

         //if authentication successful

        uint8_t block[16];

         //read memory block blockn

         if(nfc.readMemoryBlock(1,blockn,block))

         {

      #ifdef NFC_DEMO_DEBUG

         //if read operation is successful

         for(uint8_t i=0;i<16;i++)

         {

         //print memory block

         Serial.print(block[i],HEX);

         if(block[i] <= 0xF) //Data arrangement / beautify

         {

         Serial.print(" ");

         }

         else

         {

         Serial.print(" ");

         }

         }

       

         Serial.print("| Block ");

         if(blockn <= 9) //Data arrangement / beautify

         {

         Serial.print(" ");

         }

         Serial.print(blockn,DEC);

         Serial.print(" | ");

       

         if(blockn == 0)

         {

         Serial.println("Manufacturer Block");

         }

         else

         {

         if(((blockn + 1) % 4) == 0)

         {

         Serial.println("Sector Trailer");

         }

         else

         {

         Serial.println("Data Block");

         }

         }

      #endif

         }

         }

         }

        }

        delay(2000);

      }

       

      This setup is working fine with Arduino Uno but, apparently, Galileo can't use the Least Significant Bit (LSB) format needed by the PN532 (Intel® Galileo Release Notes), which is also why I can't use this fix: NFC Shield &#171; Circuits@Home. Is there a workaround that would enable me to use this shield with Galileo?