SPI working
This commit is contained in:
parent
f1f0b7a13f
commit
5542a15249
2 changed files with 63 additions and 22 deletions
|
@ -144,6 +144,16 @@ _GPIO_P35 = const(5)
|
||||||
_ACK = b'\x00\x00\xFF\x00\xFF\x00'
|
_ACK = b'\x00\x00\xFF\x00\xFF\x00'
|
||||||
_FRAME_START = b'\x00\x00\xFF'
|
_FRAME_START = b'\x00\x00\xFF'
|
||||||
|
|
||||||
|
def reverse_bit(num):
|
||||||
|
result = 0
|
||||||
|
for _ in range(8):
|
||||||
|
result <<= 1
|
||||||
|
result += (num & 1)
|
||||||
|
num >>= 1
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BusyError(Exception):
|
class BusyError(Exception):
|
||||||
"""Base class for exceptions in this module."""
|
"""Base class for exceptions in this module."""
|
||||||
pass
|
pass
|
||||||
|
@ -156,7 +166,6 @@ class PN532:
|
||||||
"""
|
"""
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
if reset:
|
if reset:
|
||||||
print("resetting")
|
|
||||||
reset.direction = Direction.OUTPUT
|
reset.direction = Direction.OUTPUT
|
||||||
reset.value = True
|
reset.value = True
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
@ -408,7 +417,7 @@ class PN532_I2C(PN532):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
return True
|
return False
|
||||||
|
|
||||||
def _read_data(self, count):
|
def _read_data(self, count):
|
||||||
"""Read a specified count of bytes from the PN532."""
|
"""Read a specified count of bytes from the PN532."""
|
||||||
|
@ -426,3 +435,53 @@ class PN532_I2C(PN532):
|
||||||
def _write_data(self, framebytes):
|
def _write_data(self, framebytes):
|
||||||
with self._i2c:
|
with self._i2c:
|
||||||
self._i2c.write(framebytes)
|
self._i2c.write(framebytes)
|
||||||
|
|
||||||
|
class PN532_SPI(PN532):
|
||||||
|
"""Driver for the PN532 connected over I2C."""
|
||||||
|
def __init__(self, spi, cs_pin, *, irq=None, reset=None, debug=False):
|
||||||
|
"""Create an instance of the PN532 class using SPI
|
||||||
|
"""
|
||||||
|
self.debug = debug
|
||||||
|
self._irq = irq
|
||||||
|
self._spi = spi_device.SPIDevice(spi, cs_pin)
|
||||||
|
super().__init__(debug=debug, reset=reset)
|
||||||
|
|
||||||
|
def _wait_ready(self, timeout=1):
|
||||||
|
if self._irq:
|
||||||
|
print("TODO IRQ")
|
||||||
|
else:
|
||||||
|
status = bytearray([reverse_bit(_SPI_STATREAD), 0])
|
||||||
|
|
||||||
|
t = time.monotonic()
|
||||||
|
while (time.monotonic() - t) < timeout:
|
||||||
|
with self._spi as spi:
|
||||||
|
spi.write_readinto(status, status)
|
||||||
|
if reverse_bit(status[1]) == 0x01: # LSB data is read in MSB
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
time.sleep(0.1)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _read_data(self, count):
|
||||||
|
"""Read a specified count of bytes from the PN532."""
|
||||||
|
# Build a read request frame.
|
||||||
|
frame = bytearray(count+1)
|
||||||
|
# Add the SPI data read signal byte, but LSB'ify it
|
||||||
|
frame[0] = reverse_bit(_SPI_DATAREAD)
|
||||||
|
|
||||||
|
with self._spi as spi:
|
||||||
|
time.sleep(0.01)
|
||||||
|
spi.write_readinto(frame, frame)
|
||||||
|
for i in range(len(frame)):
|
||||||
|
frame[i] = reverse_bit(frame[i]) # turn LSB data to MSB
|
||||||
|
if self.debug:
|
||||||
|
print("Reading: ", [hex(i) for i in frame[1:]])
|
||||||
|
return frame[1:]
|
||||||
|
|
||||||
|
def _write_data(self, framebytes):
|
||||||
|
with self._spi as spi:
|
||||||
|
reversed = [reverse_bit(x) for x in bytes([_SPI_DATAWRITE]) + framebytes]
|
||||||
|
time.sleep(0.01)
|
||||||
|
if self.debug:
|
||||||
|
print("writing: ", [hex(i) for i in reversed])
|
||||||
|
spi.write(bytes(reversed))
|
||||||
|
|
|
@ -1,22 +1,4 @@
|
||||||
from Adafruit_Circuitpython_PN532 import adafruit_pn532
|
ush=True)
|
||||||
from digitalio import DigitalInOut, Direction, Pull
|
|
||||||
import board
|
|
||||||
import time
|
|
||||||
import busio
|
|
||||||
# I2C connection:
|
|
||||||
i2c = busio.I2C(board.SCL, board.SDA)
|
|
||||||
pn532 = adafruit_pn532.PN532_I2C(i2c)
|
|
||||||
|
|
||||||
ic, ver, rev, support = pn532.get_firmware_version()
|
|
||||||
print('Found PN532 with firmware version: {0}.{1}'.format(ver, rev))
|
|
||||||
|
|
||||||
# Configure PN532 to communicate with MiFare cards.
|
|
||||||
pn532.SAM_configuration()
|
|
||||||
|
|
||||||
print('Waiting for MiFare card...')
|
|
||||||
while True:
|
|
||||||
# Check if a card is available to read
|
|
||||||
uid = pn532.read_passive_target(timeout=0.25)
|
|
||||||
# Try again if no card is available.
|
# Try again if no card is available.
|
||||||
if uid is None:
|
if uid is None:
|
||||||
continue
|
continue
|
||||||
|
|
Loading…
Reference in a new issue