I use CircuitPython for basically everything. Not many people do, so half the time the chip I want either has no library or has one that barely works.
So I write them. Both libraries below are a single file with no dependencies,
and both are in the Community Bundle, so circup install pn7150 is the whole
install.
circuitpython-pn7150
github.com/TheFilipcom4607/circuitpython-pn7150
The NFC reader on the Challenger RP2040 NFC. There was already a library for it, but it only really tells you that a tag was there: no NDEF, and UIDs for one of the four RF technologies.
Mine reads NTAG, Mifare Classic, DESFire, ISO15693 and FeliCa, and decodes and writes NDEF on all of them, so links, Wi-Fi credentials, contacts and Bluetooth pairing. It also goes the other way and pretends to be a tag, which means you can tap a phone on the board and have a URL come up.
circuitpython-st25dv
github.com/TheFilipcom4607/circuitpython-st25dv
The opposite end: a tag rather than a reader. The ST25DV has an I2C host on one side and a phone on the other, both looking at the same memory, which is the fun part. The board can sit in a loop, notice a phone arrive, and read whatever it wrote back out.
Challenger RP2040 NFC
Sometimes it isn't the library that's missing but the whole board. The Challenger RP2040 NFC is an RP2040 in a Feather footprint with the PN7150 on it, and it was the only Challenger RP2040 variant you couldn't run CircuitPython on. So I added it, and it ships in the official builds now.
It wasn't just a pin map. iLabs left the PN7150's I2C bus without external pull-up resistors, so getting the chip to answer at all needed internal ones, which the RP2040 port didn't do. That turned into a change to the port's I2C rather than to my board alone.
Get it from The Pi Hut rather than iLabs directly, though. iLabs closed their webshop to EU orders in August 2026 over packaging compliance rules, which is a strange place for a Swedish company to end up. The Challenger range is still sold through distributors.