Skip to content

Commit 352d5e9

Browse files
committed
fix: use correct byte order for multi-byte read/write
1 parent 68ec5d5 commit 352d5e9

File tree

2 files changed

+7
-10
lines changed

2 files changed

+7
-10
lines changed

feeph/i2c/burst_handler.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def read_register(self, register: int, byte_count: int = 1, max_tries: int = 5)
7070
self._i2c_bus.writeto_then_readfrom(address=self._i2c_adr, buffer_out=buf_r, buffer_in=buf_w)
7171
value = 0
7272
for i in range(byte_count):
73-
value += buf_w[i] << i*8
73+
value += buf_w[byte_count - 1 - i] << i*8
7474
return value
7575
except OSError as e:
7676
# [Errno 121] Remote I/O error
@@ -94,11 +94,8 @@ def write_register(self, register: int, value: int, byte_count: int = 1, max_tri
9494
try:
9595
buf = bytearray(1 + byte_count) # buf[0], buf[1], buf[2]
9696
buf[0] = register
97-
# need to populate the bytes in reverse order:
98-
# 0x##.. => buf[2]
99-
# 0x..## => buf[1]
100-
for i in range(byte_count, 0, -1):
101-
buf[i] = value & 0xFF
97+
for i in range(byte_count):
98+
buf[1+i] = value & 0xFF
10299
value = value >> 8
103100
self._i2c_bus.writeto(address=self._i2c_adr, buffer=buf)
104101
return

feeph/i2c/emulation.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ def writeto(self, address: int, buffer: bytearray, *, start=0, end=None):
8080
# 0x##.. -> buf[1] -> i = 1, offset = 1
8181
# (buf[0] contains the register address)
8282
for i in range(len(buffer) - 1):
83-
offset = len(buffer) - 1 - i
84-
value += buffer[offset] << i*8
83+
value += buffer[1 + i] << i*8
8584
self._state[i2c_device_address][i2c_device_register] = value
8685

8786
def writeto_then_readfrom(self, address: int, buffer_out: bytearray, buffer_in: bytearray, *, out_start=0, out_end=None, in_start=0, in_end=None, stop=False):
@@ -93,6 +92,7 @@ def writeto_then_readfrom(self, address: int, buffer_out: bytearray, buffer_in:
9392
if i2c_device_register < 0:
9493
raise ValueError("device register can't be negative")
9594
value = self._state[i2c_device_address][i2c_device_register]
96-
for i in range(len(buffer_in)):
97-
buffer_in[i] = value & 0xff
95+
byte_count = len(buffer_in)
96+
for i in range(byte_count):
97+
buffer_in[byte_count - 1 - i] = value & 0xff
9898
value = value >> 8

0 commit comments

Comments
 (0)