Skip to content
This repository was archived by the owner on Sep 30, 2019. It is now read-only.

Commit fb43ce4

Browse files
committed
Fix issues with 16 bit read endianness by exposing explicit endian control.
1 parent f076c29 commit fb43ce4

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
build/
2+
dist/
13
*.egg-info
24
*.pyc

Adafruit_GPIO/I2C.py

+35-11
Original file line numberDiff line numberDiff line change
@@ -106,25 +106,49 @@ def readU8(self, register):
106106

107107
def readS8(self, register):
108108
"""Read a signed byte from the specified register."""
109-
result = self._bus.read_byte_data(self._address, register) & 0xFF
109+
result = self.readU8(register)
110110
if result > 127:
111111
result -= 256
112-
self._logger.debug("Read 0x%02X from register 0x%02X",
113-
result, register)
114112
return result
115113

116-
def readU16(self, register):
117-
"""Read an unsigned 16-bit value from the specified register."""
114+
def readU16(self, register, little_endian=True):
115+
"""Read an unsigned 16-bit value from the specified register, with the
116+
specified endianness (default little endian, or least significant byte
117+
first)."""
118118
result = self._bus.read_word_data(self._address,register) & 0xFFFF
119119
self._logger.debug("Read 0x%04X from register pair 0x%02X, 0x%02X",
120-
result, register, register+1)
120+
result, register, register+1)
121+
# Swap bytes if using big endian because read_word_data assumes little
122+
# endian on ARM (little endian) systems.
123+
if not little_endian:
124+
result = ((result << 8) & 0xFF00) + (result >> 8)
121125
return result
122126

123-
def readS16(self, register):
124-
"""Read a signed 16-bit value from the specified register."""
125-
result = self._bus.read_word_data(self._address,register)
127+
def readS16(self, register, little_endian=True):
128+
"""Read a signed 16-bit value from the specified register, with the
129+
specified endianness (default little endian, or least significant byte
130+
first)."""
131+
result = self.readU16(register, little_endian)
126132
if result > 32767:
127133
result -= 65536
128-
self._logger.debug("Read 0x%04X from register pair 0x%02X, 0x%02X",
129-
result, register, register+1)
130134
return result
135+
136+
def readU16LE(self, register):
137+
"""Read an unsigned 16-bit value from the specified register, in little
138+
endian byte order."""
139+
return self.readU16(register, little_endian=True)
140+
141+
def readU16BE(self, register):
142+
"""Read an unsigned 16-bit value from the specified register, in big
143+
endian byte order."""
144+
return self.readU16(register, little_endian=False)
145+
146+
def readS16LE(self, register):
147+
"""Read a signed 16-bit value from the specified register, in little
148+
endian byte order."""
149+
return self.readS16(register, little_endian=True)
150+
151+
def readS16BE(self, register):
152+
"""Read a signed 16-bit value from the specified register, in big
153+
endian byte order."""
154+
return self.readS16(register, little_endian=False)

0 commit comments

Comments
 (0)