From b6bd43dfbe0830dbb2884c92f6921469d3271593 Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Thu, 19 Jun 2014 12:23:08 -0700 Subject: [PATCH 1/4] Fix getPiRevision to check for revision value 0002 or 0003 as rev 1 boards. --- Adafruit_I2C/Adafruit_I2C.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Adafruit_I2C/Adafruit_I2C.py b/Adafruit_I2C/Adafruit_I2C.py index 0c4a7d98..7140efba 100755 --- a/Adafruit_I2C/Adafruit_I2C.py +++ b/Adafruit_I2C/Adafruit_I2C.py @@ -13,11 +13,12 @@ def getPiRevision(): "Gets the version number of the Raspberry Pi board" # Courtesy quick2wire-python-api # https://github.com/quick2wire/quick2wire-python-api + # Updated revision info from: http://elinux.org/RPi_HardwareHistory#Board_Revision_History try: with open('/proc/cpuinfo','r') as f: for line in f: if line.startswith('Revision'): - return 1 if line.rstrip()[-1] in ['1','2'] else 2 + return 1 if line.rstrip()[-1] in ['2','3'] else 2 except: return 0 From d9c0bbb9e582df2d313a1b1538c8b5d41f7cc37a Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Thu, 19 Jun 2014 12:27:48 -0700 Subject: [PATCH 2/4] Fix bug with readS16 not returning signed results, and add optional explicit endian parameter to 16 bit reads. --- Adafruit_I2C/Adafruit_I2C.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Adafruit_I2C/Adafruit_I2C.py b/Adafruit_I2C/Adafruit_I2C.py index 7140efba..0e718baa 100755 --- a/Adafruit_I2C/Adafruit_I2C.py +++ b/Adafruit_I2C/Adafruit_I2C.py @@ -115,20 +115,25 @@ def readS8(self, reg): except IOError, err: return self.errMsg() - def readU16(self, reg): + def readU16(self, reg, little_endian=True): "Reads an unsigned 16-bit value from the I2C device" try: result = self.bus.read_word_data(self.address,reg) + # Swap bytes if using big endian because read_word_data assumes little + # endian on ARM (little endian) systems. + if not little_endian: + result = ((result << 8) & 0xFF00) + (result >> 8) if (self.debug): print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) return result except IOError, err: return self.errMsg() - def readS16(self, reg): + def readS16(self, reg, little_endian=True): "Reads a signed 16-bit value from the I2C device" try: - result = self.bus.read_word_data(self.address,reg) + result = self.readU16(self.address,reg,little_endian) + if result > 32767: result -= 65536 if (self.debug): print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) return result From cfd736dd325f05492b1d54564a9ccdd71b82272a Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Thu, 19 Jun 2014 12:30:51 -0700 Subject: [PATCH 3/4] Remove debug log from readS16 to prevent double logging. --- Adafruit_I2C/Adafruit_I2C.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Adafruit_I2C/Adafruit_I2C.py b/Adafruit_I2C/Adafruit_I2C.py index 0e718baa..9dd75c82 100755 --- a/Adafruit_I2C/Adafruit_I2C.py +++ b/Adafruit_I2C/Adafruit_I2C.py @@ -134,8 +134,6 @@ def readS16(self, reg, little_endian=True): try: result = self.readU16(self.address,reg,little_endian) if result > 32767: result -= 65536 - if (self.debug): - print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) return result except IOError, err: return self.errMsg() From 0924803b4005f39bcec8ec98818a6b92e0b0ccf0 Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Thu, 19 Jun 2014 12:47:38 -0700 Subject: [PATCH 4/4] Fix bug in calling readU16 from readS16. --- Adafruit_I2C/Adafruit_I2C.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_I2C/Adafruit_I2C.py b/Adafruit_I2C/Adafruit_I2C.py index 9dd75c82..b1c88a59 100755 --- a/Adafruit_I2C/Adafruit_I2C.py +++ b/Adafruit_I2C/Adafruit_I2C.py @@ -132,7 +132,7 @@ def readU16(self, reg, little_endian=True): def readS16(self, reg, little_endian=True): "Reads a signed 16-bit value from the I2C device" try: - result = self.readU16(self.address,reg,little_endian) + result = self.readU16(reg,little_endian) if result > 32767: result -= 65536 return result except IOError, err: