First commit
[hackover2013-badge-firmware.git] / tools / examples / sensors / pn532 / ISO14443A_ID / main.c
1 /**************************************************************************/
2 /*!
3 @file main.c
4 @author K. Townsend (microBuilder.eu)
5
6 @section LICENSE
7
8 Software License Agreement (BSD License)
9
10 Copyright (c) 2010, microBuilder SARL
11 All rights reserved.
12
13 Redistribution and use in source and binary forms, with or without
14 modification, are permitted provided that the following conditions are met:
15 1. Redistributions of source code must retain the above copyright
16 notice, this list of conditions and the following disclaimer.
17 2. Redistributions in binary form must reproduce the above copyright
18 notice, this list of conditions and the following disclaimer in the
19 documentation and/or other materials provided with the distribution.
20 3. Neither the name of the copyright holders nor the
21 names of its contributors may be used to endorse or promote products
22 derived from this software without specific prior written permission.
23
24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
25 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
28 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35 /**************************************************************************/
36 #include <stdio.h>
37
38 #include "projectconfig.h"
39 #include "sysinit.h"
40
41 #include "drivers/rf/pn532/pn532.h"
42 #include "drivers/rf/pn532/pn532_bus.h"
43
44 /**************************************************************************/
45 /*!
46 Main program entry point. After reset, normal code execution will
47 begin here.
48
49 Note: CFG_INTERFACE is normally enabled by default. If you wish to
50 enable the blinking LED code in main, you will need to open
51 projectconfig.h, comment out "#define CFG_INTERFACE" and
52 rebuild the project.
53 */
54 /**************************************************************************/
55 int main (void)
56 {
57 #ifdef CFG_INTERFACE
58 //#error "CFG_INTERFACE must be disabled in projectconfig.h for this demo"
59 #endif
60 #if !defined CFG_PRINTF_USBCDC
61 #error "CFG_PRINTF_USBCDC must be enabled in projectconfig.h for this demo"
62 #endif
63
64 // Configure cpu and mandatory peripherals
65 systemInit();
66
67 // Wait a bit for someone to open the USB connection for printf
68 systickDelay(5000);
69
70 // Initialise the PN532
71 pn532Init();
72
73 pn532_error_t error;
74 byte_t response[64];
75 size_t responseLen;
76
77 // Setup command to initialise a single ISO14443A target at 106kbps (Mifare Classic, Ultralight, etc.)
78 byte_t abtCommand[] = { PN532_COMMAND_INLISTPASSIVETARGET, 0x01, PN532_MODULATION_ISO14443A_106KBPS };
79
80 while (1)
81 {
82 printf("%s", CFG_PRINTF_NEWLINE);
83 printf("Waiting for an ISO14443A card (Mifare Classic, etc.)%s", CFG_PRINTF_NEWLINE);
84
85 // Send the command (and handle the most common errors)
86 error = pn532Write(abtCommand, sizeof(abtCommand));
87 if (error)
88 {
89 // Something went wrong sending the command (probably the bus selection or wiring)
90 switch(error)
91 {
92 case (PN532_ERROR_NOACK):
93 case (PN532_ERROR_INVALIDACK):
94 // No ACK response frame received from the PN532
95 printf("Ooops ... No valid ACK frame received!%s", CFG_PRINTF_NEWLINE);
96 break;
97 case (PN532_ERROR_I2C_NACK):
98 // No ACK bit received to I2C start ... not same as PN532 ACK frame (bus pins not set correctly?)
99 printf("Ooops ... No I2C ACK received! Are the bus select pins sets to I2C?%s", CFG_PRINTF_NEWLINE);
100 break;
101 case (PN532_ERROR_READYSTATUSTIMEOUT):
102 // Timed out waiting for the ready bit to clear ... this can be intentional, though, in the
103 // case of PN532_COMMAND_INLISTPASSIVETARGET since it will only clear when a card
104 // enters the magnetic field! Handle with caution because it isn't always an error
105 // Note: Only valid for I2C and SPI
106 printf("Timed out waiting for Ready/IRQ%s", CFG_PRINTF_NEWLINE);
107 break;
108 default:
109 printf("Ooops ... something went wrong! [PN532 Error Code: 0x%02X]%s", error, CFG_PRINTF_NEWLINE);
110 break;
111 }
112 }
113 else
114 {
115 // Commmand seems to have gone through ...
116 do
117 {
118 // Keep reading until we get a response or an unexpected error condition
119 error = pn532Read(response, &responseLen);
120 systickDelay(25);
121 }
122 while (error == PN532_ERROR_RESPONSEBUFFEREMPTY);
123
124 printf("%s", CFG_PRINTF_NEWLINE);
125 printf("%-12s: ", "Received");
126 pn532PrintHex(response, responseLen);
127
128 // Try to handle some potential frame errors
129 // Unhandled errors are caught further down
130 switch (error)
131 {
132 case (PN532_ERROR_PREAMBLEMISMATCH):
133 // Frame should start with 0x00 0x00 0xFF!
134 printf("Response frame doesn't start with expected preamble (00 00 FF)%s", CFG_PRINTF_NEWLINE);
135 break;
136 case (PN532_ERROR_APPLEVELERROR):
137 printf("Application level error reported by PN532%s", CFG_PRINTF_NEWLINE);
138 break;
139 case (PN532_ERROR_LENCHECKSUMMISMATCH):
140 printf("Frame length check/checksum mismatch%s", CFG_PRINTF_NEWLINE);
141 break;
142 default:
143 // Other errors handled below
144 break;
145 }
146
147 // Print the card details if possible
148 if (!error)
149 {
150 /* Response for ISO14443A 106KBPS (Mifare Classic, etc.)
151 See UM0701-02 section 7.3.5 for more information
152
153 byte Description
154 ------------- ------------------------------------------
155 b7 Tags Found
156 b8 Tag Number (only one used in this example)
157 b9..10 SENS_RES
158 b11 SEL_RES
159 b12 NFCID Length
160 b13..NFCIDLen NFCID
161
162 SENS_RES SEL_RES Manufacturer/Card Type NFCID Len
163 -------- ------- ----------------------- ---------
164 00 04 08 NXP Mifare Classic 1K 4 bytes */
165
166 printf("%-12s: %d %s", "Tags Found", response[7], CFG_PRINTF_NEWLINE);
167 printf("%-12s: %02X %02X %s", "SENS_RES", response[9], response[10], CFG_PRINTF_NEWLINE);
168 printf("%-12s: %02X %s", "SEL_RES", response[11], CFG_PRINTF_NEWLINE);
169 printf("%-12s: ", "NFCID");
170 size_t pos;
171 for (pos=0; pos < response[12]; pos++)
172 {
173 printf("%02x ", response[13 + pos]);
174 }
175 printf(CFG_PRINTF_NEWLINE);
176 if ((response[9] == 0x00) && (response[10] == 0x04) && (response[11] == 0x08))
177 {
178 printf("Seems to be a Mifare Classic 1K Card%s", CFG_PRINTF_NEWLINE);
179 }
180 }
181 else
182 {
183 // Oops .... something bad happened. Check 'error'
184 printf("Ooops! Error %02X %s", error, CFG_PRINTF_NEWLINE);
185 }
186 }
187
188 // Wait at least one second before trying again
189 systickDelay(1000);
190 }
191 }
This page took 0.053952 seconds and 5 git commands to generate.