Chapter 7: Hardware & Readers — PN532, ACR122U, SPI/I2C

To interact with NFC tags from a computer or embedded system, you need a reader — hardware that generates the 13.56 MHz field, handles the ISO 14443 protocol layer, and gives you a software interface to send commands and receive responses. This chapter surveys the most common options, how they connect, and when to use each.


7.1 The NFC Reader IC vs the Reader Module

It helps to distinguish between the NFC controller IC (the chip that does the RF work) and the reader module or product (the packaged form factor you actually buy).

The most important NFC controller ICs at 13.56 MHz:

IC Manufacturer Notes
PN532 NXP Most popular in hobbyist/embedded market; UART/SPI/I2C
PN7150 NXP Modern replacement for PN532; USB/I2C; NCI compliant
RC522 (MFRC522) NXP Simple SPI/I2C controller; MIFARE only (no full ISO 14443-4)
TRF7970A Texas Instruments Multi-protocol (ISO 14443, ISO 15693, ISO 18000); SPI
ST25R3911B STMicroelectronics High-performance; SPI/I2C; supports card emulation
CLR663 NXP High-performance; supports ISO 14443, ISO 15693, ISO 18092

7.2 PN532 — The Workhorse

The PN532 is the most widely used NFC controller IC in the hobbyist, maker, and developer space. It supports:

It communicates with a host processor over one of three interfaces (selected by two logic pins):

Mode Interface Speed
0 HSU (UART) up to 1.228 Mbit/s
1 SPI up to 5 Mbit/s
2 I2C up to 400 kHz

Adafruit PN532 Breakout Board (and Shield)

Elechouse PN532 V3 Module

NFC HAT / pHAT for Raspberry Pi

Connecting to a Raspberry Pi (I2C example)

PN532 VCC  → Pi 3.3V (pin 1)
PN532 GND  → Pi GND (pin 6)
PN532 SDA  → Pi SDA (pin 3, GPIO2)
PN532 SCL  → Pi SCL (pin 5, GPIO3)

Enable I2C in raspi-config → Interface Options → I2C. Then verify: i2cdetect -y 1 should show address 0x24.

PN532 Communication Protocol

The PN532 has its own host communication protocol (described in NXP’s PN532 User Manual, UM10232). Commands are frames with a preamble, TFI (Frame Identifier), data, checksum, and postamble:

00 00 FF [LEN] [LCS] [TFI] [CMD] [data...] [DCS] 00

Most libraries (nfcpy, Adafruit’s Arduino library, pn532pi) abstract this entirely.


7.3 ACR122U — USB PC/SC Reader

The ACR122U by Advanced Card Systems is a USB-connected NFC reader that presents as a standard PC/SC smartcard reader. It is the most common reader for desktop/laptop NFC development on Windows, macOS, and Linux.

Key Characteristics

PC/SC Architecture

Application (Python pyscard)
       ↕
PC/SC API (SCard functions)
       ↕
PC/SC Middleware (pcscd on Linux / WinSCard.dll on Windows)
       ↕
CCID Driver (USB class driver)
       ↕
ACR122U hardware (PN532 inside)
       ↕
NFC Tag

The PC/SC layer abstracts the reader hardware. From your application, you call SCardConnect, SCardTransmit (with ISO 7816 APDUs), and SCardDisconnect. The middleware handles routing to the correct reader.

Limitations

The ACR122U is not well-suited for low-level MIFARE Classic work through standard PC/SC. The CCID interface does not expose raw PN532 frames — only APDU-wrapped commands. For raw PN532 access you can use the ACR122U’s vendor-specific pseudo-APDUs (documented in ACS’s API manual) or switch to a libnfc-capable reader.

On Linux, pcscd and libnfc both try to claim the USB device — only one can hold it at a time. A udev rule or blacklist entry may be needed to prevent pcscd from claiming the reader when you want libnfc.


7.4 RFID-RC522 (MFRC522)

The RC522 is a simpler, cheaper NFC chip found on the very widely available Arduino RFID modules (green PCB, typically under $2). It supports:

What it does not support:

The RC522 is suitable for basic MIFARE Classic and Ultralight read/write projects. It is not suitable for DESFire, EMV cards, or any application requiring ISO 14443-4.

Connecting RC522 to Arduino (SPI)

RC522 → Arduino Uno
SDA   → pin 10 (SS)
SCK   → pin 13
MOSI  → pin 11
MISO  → pin 12
IRQ   → (not connected)
GND   → GND
RST   → pin 9
3.3V  → 3.3V

Use the MFRC522 Arduino library (GitHub: miguelbalboa/rfid).


7.5 Proxmark3

The Proxmark3 is a professional-grade RFID research tool supporting LF (125 kHz), HF (13.56 MHz), and is the standard tool for RFID security research and penetration testing.

Capabilities

Versions

Model Notes
Proxmark3 RDV4 Official; excellent hardware; expensive (~$300–400)
Proxmark3 Easy / Clone Cheaper clones from Chinese vendors (~$50–80); variable quality
Proxmark3 RDV4.01 With BT and add-ons

The Proxmark3 ecosystem uses the Iceman fork of the firmware (RRG/Iceman) which is the most actively maintained and feature-rich.


7.6 Reader Selection Guide

Scenario Recommended hardware
Quick desktop NFC development (Python) ACR122U
Raspberry Pi / embedded Linux project PN532 over I2C or SPI
Arduino project, MIFARE only RC522 module
Professional HF+LF research Proxmark3 RDV4
ISO 14443-4 (DESFire, EMV) on embedded PN532 or PN7150
High-volume production reader CLR663 or ST25R3911B with custom firmware
Android app development Smartphone (no extra hardware)

7.7 Reader Antennas

The antenna is as important as the chip. NFC antennas are planar coils tuned to resonate at 13.56 MHz. Key parameters:

PCB antenna designs are well-documented in NXP Application Notes AN10609 (PN532) and AN11019 (general). For most module purchases, the antenna is integrated on the PCB and is adequate for standard 1–5 cm range. For longer range or unusual form factors, you may need to design a custom antenna.


7.8 Raspberry Pi Complete Setup

A complete PN532 + Raspberry Pi setup for NFC development:

Hardware: Raspberry Pi 4B + Waveshare PN532 NFC HAT (I2C mode, DIP switch to I2C)

Software:

sudo apt-get install libnfc-dev libnfc-bin

Create /etc/nfc/libnfc.conf:

device.name = "PN532 over I2C"
device.connstring = "pn532_i2c:/dev/i2c-1"

Test: nfc-list should enumerate any tag in the field.

For Python with nfcpy:

pip install nfcpy

nfcpy auto-detects supported devices including PN532 over I2C on /dev/i2c-1.


Summary


← Chapter 6: Secure NFC Table of Contents Chapter 8: Software Libraries →