From NFC Tools
Jump to: navigation, search

How to use a PN532 board with Arduino to make a reader compatible with libnfc


Prepare Libnfc

Download libnfc 1.7.1

git clone
cd libnfc
git checkout libnfc-1.7.1

Download this patch:

--- libnfc/drivers/pn532_uart.c	(unpatched)
+++ libnfc/drivers/pn532_uart.c	(patched)
@@ -48,7 +48,7 @@
 #include "chips/pn53x-internal.h"
 #include "uart.h"
-#define PN532_UART_DEFAULT_SPEED 115200
+#define PN532_UART_DEFAULT_SPEED 230400
 #define PN532_UART_DRIVER_NAME "pn532_uart"
 #define LOG_CATEGORY "libnfc.driver.pn532_uart"
@@ -306,6 +306,7 @@ pn532_uart_wakeup(nfc_device *pnd)
   const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
   int res = uart_send(DRIVER_DATA(pnd)->port, pn532_wakeup_preamble, sizeof(pn532_wakeup_preamble), 0);
   CHIP_DATA(pnd)->power_mode = NORMAL; // PN532 should now be awake
+  sleep(4);
   return res;

This can be done with

wget --content-disposition ""

Then apply it:

patch -p0 < pn532_uart.patch

Compile with pn532_uart driver (or all drivers if you remove "--with-drivers=..."):

autoreconf -vis
./configure --with-drivers=pn532_uart --sysconfdir=/etc --prefix=/usr
make clean all

and install it on your system:

sudo make install

(if libnfc was installed before, it should be deleted before installing it)

Set configuration by creating /etc/nfc/libnfc.conf as

# Allow device auto-detection (default: true)
# Note: if this auto-detection is disabled, user has to set manually a device
# configuration using file or environment variable
allow_autoscan = false
# Allow intrusive auto-detection (default: false)
# Warning: intrusive auto-detection can seriously disturb other devices
# This option is not recommended, user should prefer to add manually his device.
allow_intrusive_scan = false
# Set log level (default: error)
# Valid log levels are (in order of verbosity): 0 (none), 1 (error), 2 (info), 3 (debug)
# Note: if you compiled with --enable-debug option, the default log level is "debug"
log_level = 2
# Manually set default device (no default)
# To set a default device, you must set both name and connstring for your device
# Note: if autoscan is enabled, default device will be the first device available in device list. = "PN532 NFC Board on Arduino"
device.connstring = "pn532_uart:/dev/ttyACM0:230400"

sudo mkdir -p /etc/nfc/devices.d
cd /etc/nfc/
wget --content-disposition ""

All above steps are available in this script

Check if /dev/ttyACM0 is well your Arduino port, else adapt this script.

Prepare Arduino


svn checkout uartnfc
cd uartnfc

now you have the lib and the sketch for your arduino :)

Change baudrate in the uartnfc.ino file to 230400:

void setup(void)
  Serial.begin(230400); //115200, 230400(, 460800, 921600)

Upload the sketch to the Arduino, e.g. via the Arduino IDE.

Prepare hardware

Check if your PN532 board needs some soldering to activate the SPI, then wire it to the Arduino as following:

 Arduino       PN532 board (SPI)
 Pin 13  <-->  SCK
 Pin 12  <-->  MISO
 Pin 11  <-->  MOSI (/SDA/TX)
 Pin 10  <-->  SS   (/NSS/SCL/RX)
 GND     <-->  GND
 3,3V    <-->  3,3V (VCC)


root@kali:~# nfc-list
nfc-list uses libnfc libnfc-1.7.0-91-g491db20
NFC device: pn532_uart:/dev/ttyACM0 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): a5  09  fd  e5  
      SAK (SEL_RES): 08  


Personal tools