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.
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 |
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
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.
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.
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.
pcscd on Linux, built-in on Windows/macOS)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.
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.
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.
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).
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.
| 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.
| 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) |
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.
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.
| ← Chapter 6: Secure NFC | Table of Contents | Chapter 8: Software Libraries → |