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

Commit d9c0bbb

Browse files
committed
Fix bug with readS16 not returning signed results, and add optional explicit endian parameter to 16 bit reads.
1 parent b6bd43d commit d9c0bbb

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

Adafruit_I2C/Adafruit_I2C.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -115,20 +115,25 @@ def readS8(self, reg):
115115
except IOError, err:
116116
return self.errMsg()
117117

118-
def readU16(self, reg):
118+
def readU16(self, reg, little_endian=True):
119119
"Reads an unsigned 16-bit value from the I2C device"
120120
try:
121121
result = self.bus.read_word_data(self.address,reg)
122+
# Swap bytes if using big endian because read_word_data assumes little
123+
# endian on ARM (little endian) systems.
124+
if not little_endian:
125+
result = ((result << 8) & 0xFF00) + (result >> 8)
122126
if (self.debug):
123127
print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
124128
return result
125129
except IOError, err:
126130
return self.errMsg()
127131

128-
def readS16(self, reg):
132+
def readS16(self, reg, little_endian=True):
129133
"Reads a signed 16-bit value from the I2C device"
130134
try:
131-
result = self.bus.read_word_data(self.address,reg)
135+
result = self.readU16(self.address,reg,little_endian)
136+
if result > 32767: result -= 65536
132137
if (self.debug):
133138
print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg)
134139
return result

0 commit comments

Comments
 (0)