Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
SPI start/end fix for multibyte address. big endian multibyte address…
… fix. Implement signed argument for RWBits
  • Loading branch information
FoamyGuy committed Sep 27, 2025
commit 5039f29e0820f15427131af2f6a4287ef01234bf
10 changes: 7 additions & 3 deletions adafruit_register/register_accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@


class RegisterAccessor:
address_width = None

def _pack_address_into_buffer(self, address, lsb_first, buffer):
# Pack address into the buffer
for i in range(self.address_width):
Expand All @@ -33,7 +35,9 @@ def _pack_address_into_buffer(self, address, lsb_first, buffer):
buffer[i] = (address >> (i * 8)) & 0xFF
else:
# Big-endian: most significant byte first
buffer[i] = (address >> ((address - 1 - i) * 8)) & 0xFF
big_endian_address = address.to_bytes(self.address_width, byteorder="big")
for address_byte_i in range(self.address_width):
buffer[address_byte_i] = big_endian_address[address_byte_i]


class SPIRegisterAccessor(RegisterAccessor):
Expand Down Expand Up @@ -74,8 +78,8 @@ def read_register(self, address: int, lsb_first: bool, buffer: bytearray):
self._pack_address_into_buffer(address, lsb_first, buffer)
self._shift_rw_cmd_bit_into_address_byte(buffer, 1)
with self.spi_device as spi:
spi.write(buffer, end=self.address_width)
spi.readinto(buffer, start=self.address_width)
spi.write(buffer, end=1)
spi.readinto(buffer, start=1)

def write_register(
self,
Expand Down
10 changes: 9 additions & 1 deletion adafruit_register/register_bits.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ class RWBits:
:param int lowest_bit: The lowest bits index within the byte at ``register_address``
:param int register_width: The number of bytes in the register. Defaults to 1.
:param bool lsb_first: Is the first byte we read from the bus the LSB? Defaults to true
:param bool signed: If True, the value is a "two's complement" signed value.
If False, it is unsigned.
:param int address_width: The width of the register address in bytes. Defaults to 1.
"""

Expand All @@ -38,6 +40,7 @@ def __init__(
lowest_bit: int,
register_width: int = 1,
lsb_first: bool = True,
signed: bool = False,
address_width: int = 1,
):
self.bit_mask = ((1 << num_bits) - 1) << lowest_bit
Expand All @@ -50,8 +53,8 @@ def __init__(
self.address = register_address
self.buffer = bytearray(address_width + register_width)

# self.buffer[1] = register_width - 1
self.lsb_first = lsb_first
self.sign_bit = (1 << (num_bits - 1)) if signed else 0

def __get__(self, obj, objtype=None):
# read data from register
Expand All @@ -67,6 +70,11 @@ def __get__(self, obj, objtype=None):

# extract integer value from specified bits
result = (reg & self.bit_mask) >> self.lowest_bit

# If the value is signed and negative, convert it
if result & self.sign_bit:
result -= 2 * self.sign_bit

return result

def __set__(self, obj, value):
Expand Down