fix: strip I2C status byte from PN532 read transactions#45
Open
ashitaka1 wants to merge 2 commits intoZaparooProject:mainfrom
Open
fix: strip I2C status byte from PN532 read transactions#45ashitaka1 wants to merge 2 commits intoZaparooProject:mainfrom
ashitaka1 wants to merge 2 commits intoZaparooProject:mainfrom
Conversation
added 2 commits
February 14, 2026 16:52
The PN532 datasheet documents 0x48/0x49 as 8-bit addresses (including the R/W bit). periph.io and the Linux kernel expect 7-bit addresses, so the correct value is 0x24 (0x48 >> 1). Also add parseI2CPath() to handle composite detection paths (/dev/i2c-1:0x24) that the detection layer produces, and a hardware validation script for testing on Raspberry Pi.
The PN532 prepends a status/ready byte (0x01) to every I2C read transaction (datasheet section 6.2.4). The transport did not account for this, causing ACK frame comparison to always fail and frame data to be shifted by one byte. Add readI2C() helper that reads n+1 bytes, verifies the status byte, and copies the data bytes into the caller's buffer. Update MockI2CBus and JitteryMockI2CBus to prepend the status byte, matching real hardware behavior.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
0x01) to every I2C read transaction (datasheet section 6.2.4). The transport did not account for this, so ACK frame comparison always failed and frame data was shifted by one byte.readI2C()helper that reads n+1 bytes, verifies the status byte, and strips it before returning data to the caller.MockI2CBusandJitteryMockI2CBusto prepend the status byte on multi-byte reads, matching real hardware behavior.Note: This branch includes the I2C address fix from #44. Both fixes are needed for a functional I2C transport.
Testing
/dev/i2c-1:Init()succeeds (GetFirmwareVersion + SAMConfiguration)DetectTag()