Browse Source

Fix NTAG read loop: IDLE→TRANSCEIVE once, set_transceive_mode after

  Repeated IDLE→TRANSCEIVE resets inside the read loop broke the card
  session after the first READ (page 8 returned rx_status=0). Match
  the activate_type_a pattern: IDLE→TRANSCEIVE once before the loop,
  set_transceive_mode() for subsequent iterations.
maziggy 2 months ago
parent
commit
a59c81d6a6
1 changed files with 17 additions and 13 deletions
  1. 17 13
      spoolbuddy/daemon/pn5180.py

+ 17 - 13
spoolbuddy/daemon/pn5180.py

@@ -378,21 +378,26 @@ class PN5180:
 
 
         Uses NTAG READ command (0x30) which returns 4 pages (16 bytes) at a time.
         Uses NTAG READ command (0x30) which returns 4 pages (16 bytes) at a time.
         """
         """
+        # One-time setup: Crypto1 off, TX CRC on, RX CRC off, IDLE→TRANSCEIVE
+        self.write_reg_and(0x00, 0xFFFFFFBF)  # Crypto1 off
+        self.write_reg_or(0x19, 0x01)  # TX CRC on
+        self.write_reg_and(0x12, 0xFFFFFFFE)  # RX CRC off
+        self.write_reg(0x03, 0xFFFFFFFF)  # Clear IRQs
+
+        sys_cfg = self.read_reg(0x00)
+        self.write_reg(0x00, sys_cfg & 0xFFFFFFF8)  # IDLE
+        time.sleep(0.001)
+        self.write_reg(0x00, (sys_cfg & 0xFFFFFFF8) | 0x03)  # TRANSCEIVE
+        time.sleep(0.002)
+
         result = bytearray()
         result = bytearray()
         pages_read = 0
         pages_read = 0
         while pages_read < num_pages:
         while pages_read < num_pages:
-            # CRC and state machine setup per iteration (same as ntag_write_page)
-            self.write_reg_and(0x00, 0xFFFFFFBF)  # Crypto1 off
-            self.write_reg_or(0x19, 0x01)  # TX CRC on
-            self.write_reg_and(0x12, 0xFFFFFFFE)  # RX CRC off
-            self.write_reg(0x03, 0xFFFFFFFF)  # Clear IRQs
-
-            # Reset state machine: IDLE then TRANSCEIVE
-            sys_cfg = self.read_reg(0x00)
-            self.write_reg(0x00, sys_cfg & 0xFFFFFFF8)  # IDLE
-            time.sleep(0.001)
-            self.write_reg(0x00, (sys_cfg & 0xFFFFFFF8) | 0x03)  # TRANSCEIVE
-            time.sleep(0.002)
+            if pages_read > 0:
+                # Subsequent iterations: just clear IRQs and re-enter TRANSCEIVE
+                self.write_reg(0x03, 0xFFFFFFFF)
+                self.set_transceive_mode()
+                time.sleep(0.001)
 
 
             # READ command: 0x30 + page number -> returns 16 bytes (4 pages)
             # READ command: 0x30 + page number -> returns 16 bytes (4 pages)
             self.send_data([0x30, start_page + pages_read])
             self.send_data([0x30, start_page + pages_read])
@@ -410,7 +415,6 @@ class PN5180:
                 return None
                 return None
 
 
             data = self.read_data(16)
             data = self.read_data(16)
-            # Copy only the pages we need
             pages_to_copy = min(4, num_pages - pages_read)
             pages_to_copy = min(4, num_pages - pages_read)
             result.extend(data[: pages_to_copy * 4])
             result.extend(data[: pages_to_copy * 4])
             pages_read += 4  # Always advances by 4 (READ returns 4 pages)
             pages_read += 4  # Always advances by 4 (READ returns 4 pages)