A PN532 that appears in an I2C scan but later times out has not proved that a complete NFC command exchange works. The address phase can succeed while the host mishandles clock stretching, the board remains in the wrong interface mode, or wake/reset timing prevents the response frame from arriving.
Debug the transport before changing tag polling logic. NXP’s controller supports I2C, SPI and high-speed UART, but those host interfaces are mutually exclusive. A board-level selector or switch must match the library constructor and wiring.
An ACK is only the beginning of the PN532 exchange
The PN532 User Manual UM0701-02 describes the device as an I2C slave supporting fast mode up to 400 kHz. The manual uses 0x48 for the address byte on a write and 0x49 on a read; software APIs that accept a 7-bit address commonly represent the same device as 0x24. Mixing those conventions can produce confusing logs, so label captures as 7-bit address or on-wire address byte.

After the host sends a framed command, it must handle acknowledgement, readiness and the response frame in the order expected by the library. A scanner performs none of that. Use the library’s firmware-version request as the first transaction and enable debug output before moving to passive-target polling.
Clock stretching is a host-controller capability
Adafruit’s CircuitPython PN532 example explicitly says its I2C path requires clock-stretching support. It describes SPI as using more pins but being the most reliable and broadly supported option. If the host’s I2C peripheral, operating-system driver or software implementation cannot tolerate the PN532 holding SCL, changing pull-ups or retry counts may not solve the underlying incompatibility.
A logic-analyzer capture is useful here. If SCL is held low within a transaction and the host aborts or reports a timeout, compare the host controller’s clock-stretch limit and driver behavior. Reducing bus speed can improve margins, but it does not create clock-stretch support where none exists.
Reset and H_Request separate startup from bus faults
Adafruit recommends wiring RSTPD_N to a digital output for manual hardware reset in I2C mode. Its Raspberry Pi example also uses PN532 pin P32 as H_Request for hardware wake-up, avoiding dependence on the I2C clock-stretch wake path.

NXP documents H_REQ as an optional host-to-controller handshake. When used, it wakes the PN532 before the host sends data that could otherwise arrive while the controller is leaving power-down. Therefore, classify failures by state: a cold-start-only timeout points toward reset or wake sequencing; failures after many successful exchanges point more toward signal integrity, host driver behavior or application concurrency.
Switch to SPI when the host cannot meet the I2C behavior
The PN532 data sheet assigns host-interface select value 01 to SPI and 10 to I2C; the exact board switches or solder jumpers translate those values into a physical setting. Power down before changing mode, set the board for SPI, connect SCK/MOSI/MISO plus chip select, and instantiate the SPI transport in the same library.
This substitution holds the NFC command layer constant while changing only the host transport. If the firmware-version command becomes reliable over SPI, tag-reading code was probably not the original fault. If it still fails, return to supply, reset, interface selection and module integrity rather than tuning NFC polling parameters.
A short transport-first sequence
- Confirm the board selector matches I2C and record whether the software uses 7-bit 0x24 or on-wire 0x48/0x49 notation.
- Wire and exercise hardware reset; on Raspberry Pi, follow the library’s H_Request guidance.
- Run only the firmware-version command with debug output and a bounded timeout.
- Capture SCL/SDA and determine whether clock stretching precedes the host abort.
- If the host path cannot support it, switch both hardware mode and library transport to SPI.
Once the firmware-version request is repeatable, move up to RF configuration and passive-target polling. That ordering prevents NFC-layer changes from hiding a transport that was never stable.

