1 /**************************************************************************/
5 /**************************************************************************/
10 #include "projectconfig.h"
12 // Comment out this line to disable debug output
13 // #define PN532_DEBUGMODE
14 #define PN532_DEBUG(fmt, args...) printf(fmt, ##args)
16 /* Error messages generated by the stack */
17 /* Not to be confused with app level errors from the PN532 */
18 /* These are the errors that are returned by the PN532 driver */
19 typedef enum pn532_error_e
21 PN532_ERROR_NONE
= 0x00,
22 PN532_ERROR_UNABLETOINIT
= 0x01, // Unable to initialise or wakeup the device
23 PN532_ERROR_APPLEVELERROR
= 0x02, // Application level error detected
24 PN532_ERROR_BUSY
= 0x03, // Busy executing a previous command
25 PN532_ERROR_NOACK
= 0x04, // No ack message received
26 PN532_ERROR_INVALIDACK
= 0x05, // Ack != 00 00 FF 00 FF 00
27 PN532_ERROR_PREAMBLEMISMATCH
= 0x06, // Frame preamble + start code mismatch
28 PN532_ERROR_EXTENDEDFRAME
= 0x07, // Extended frames currently unsupported
29 PN532_ERROR_LENCHECKSUMMISMATCH
= 0x08,
30 PN532_ERROR_RESPONSEBUFFEREMPTY
= 0x09, // No response data received
31 PN532_ERROR_READYSTATUSTIMEOUT
= 0x0A, // Timeout waiting for 'ready' status (SPI/I2C only)
32 PN532_ERROR_TIMEOUTWAITINGFORCARD
= 0x0B, // No card detected in field with the specified timeout
33 PN532_ERROR_BLOCKREADFAILED
= 0x0C, // Unexpected response to block read request
34 PN532_ERROR_WRONGCARDTYPE
= 0x0D, // Card is not the expected format (based on SENS_RES/ATQA value)
35 PN532_ERROR_ADDRESSOUTOFRANGE
= 0x0E, // Specified block and page is out of range
36 PN532_ERROR_I2C_NACK
= 0x0F // I2C Bus - No ACK was received for master to slave data transfer
39 typedef enum pn532_modulation_e
41 PN532_MODULATION_ISO14443A_106KBPS
= 0x00,
42 PN532_MODULATION_FELICA_212KBPS
= 0x01,
43 PN532_MODULATION_FELICA_424KBPS
= 0x02,
44 PN532_MODULATION_ISO14443B_106KBPS
= 0x03,
45 PN532_MODULATION_JEWEL_106KBPS
= 0x04
48 /* HW Commands for the PN532. */
49 /* See UM0701-02 - PN532 User Manual */
52 PN532_COMMAND_DIAGNOSE
= 0x00,
53 PN532_COMMAND_GETFIRMWAREVERSION
= 0x02,
54 PN532_COMMAND_GETGENERALSTATUS
= 0x04,
55 PN532_COMMAND_READREGISTER
= 0x06,
56 PN532_COMMAND_WRITEREGISTER
= 0x08,
57 PN532_COMMAND_READGPIO
= 0x0C,
58 PN532_COMMAND_WRITEGPIO
= 0x0E,
59 PN532_COMMAND_SETSERIALBAUDRATE
= 0x10,
60 PN532_COMMAND_SETPARAMETERS
= 0x12,
61 PN532_COMMAND_SAMCONFIGURATION
= 0x14,
62 PN532_COMMAND_POWERDOWN
= 0x16,
63 PN532_COMMAND_RFCONFIGURATION
= 0x32,
64 PN532_COMMAND_RFREGULATIONTEST
= 0x58,
65 PN532_COMMAND_INJUMPFORDEP
= 0x56,
66 PN532_COMMAND_INJUMPFORPSL
= 0x46,
67 PN532_COMMAND_INLISTPASSIVETARGET
= 0x4A,
68 PN532_COMMAND_INATR
= 0x50,
69 PN532_COMMAND_INPSL
= 0x4E,
70 PN532_COMMAND_INDATAEXCHANGE
= 0x40,
71 PN532_COMMAND_INCOMMUNICATETHRU
= 0x42,
72 PN532_COMMAND_INDESELECT
= 0x44,
73 PN532_COMMAND_INRELEASE
= 0x52,
74 PN532_COMMAND_INSELECT
= 0x54,
75 PN532_COMMAND_INAUTOPOLL
= 0x60,
76 PN532_COMMAND_TGINITASTARGET
= 0x8C,
77 PN532_COMMAND_TGSETGENERALBYTES
= 0x92,
78 PN532_COMMAND_TGGETDATA
= 0x86,
79 PN532_COMMAND_TGSETDATA
= 0x8E,
80 PN532_COMMAND_TGSETMETADATA
= 0x94,
81 PN532_COMMAND_TGGETINITIATORCOMMAND
= 0x88,
82 PN532_COMMAND_TGRESPONSETOINITIATOR
= 0x90,
83 PN532_COMMAND_TGGETTARGETSTATUS
= 0x8A
86 /* Application level errors generated by the PN532 chip */
87 /* See UM0701-02 - PN532 User Manual */
90 PN532_APPERROR_NONE
= 0x00,
91 PN532_APPERROR_TIMEOUT
= 0x01,
92 PN532_APPERROR_CRCERROR
= 0x02,
93 PN532_APPERROR_PARITYERROR
= 0x04,
94 PN532_APPERROR_FRAMINGERROR
= 0x05,
95 PN532_APPERROR_BITCOLLISION
= 0x06,
96 PN532_APPERROR_INSUFFICIENTBUFFER
= 0x07,
97 PN532_APPERROR_RFBUFFEROVERFLOW
= 0x09,
98 PN532_APPERROR_RFFIELDTIMEOUT
= 0x0A,
99 PN532_APPERROR_RFPROTOCOLERROR
= 0x0B,
100 PN532_APPERROR_TEMPERROR
= 0x0D,
101 PN532_APPERROR_INTERNBUFFEROVERFLOW
= 0x0E,
102 PN532_APPERROR_INVALIDPARAMETER
= 0x10,
103 PN532_APPERROR_DEP_UNSUPPORTEDCMD
= 0x12,
104 PN532_APPERROR_DEP_INVALIDOFORMAT
= 0x13,
105 PN532_APPERROR_AUTHENTERR
= 0x14,
106 PN532_APPERROR_UIDCCHECKERROR
= 0x23,
107 PN532_APPERROR_DEP_INVALIDDEVSTATE
= 0x25,
108 PN532_APPERROR_OPERATIONNOTALLOWED
= 0x26,
109 PN532_APPERROR_CMDNOTACCEPTABLE
= 0x27,
110 PN532_APPERROR_TARGETRELEASED
= 0x29,
111 PN532_APPERROR_IDMISMATCH
= 0x2A,
112 PN532_APPERROR_CARDDISAPPEARED
= 0x2B,
113 PN532_APPERROR_NFCID3MISMATCH
= 0x2C,
114 PN532_APPERROR_OVERCURRENTEVENT
= 0x2D,
115 PN532_APPERROR_NADMISSINGINDEP
= 0x2E
118 /* Possible states for the PN532 SW Stack */
119 typedef enum pn532_state_e
127 /* PN532 Protocol control block */
132 pn532_modulation_t modulation
;
133 uint32_t lastCommand
;
137 void pn532PrintHex(const byte_t
* pbtData
, const size_t szBytes
);
138 void pn532PrintHexChar(const byte_t
* pbtData
, const size_t szBytes
);
139 pn532_pcb_t
* pn532GetPCB();
141 pn532_error_t
pn532Read(byte_t
*pbtResponse
, size_t * pszLen
);
142 pn532_error_t
pn532Write(byte_t
*abtCommand
, size_t szLen
);