Skip to content

Commit 1fefcc4

Browse files
author
dcyoung
committed
Reduce jitter in pulse timing
1 parent 060f6d6 commit 1fefcc4

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

Adafruit_GPIO/I2C.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828
def reverseByteOrder(data):
2929
"""Reverses the byte order of an int (16-bit) or long (32-bit) value."""
3030
# Courtesy Vishal Sapre
31-
byteCount = len(hex(data)[2:].replace('L','')[::2])
32-
val = 0
31+
byteCount = len(hex(data)[2:].replace('L', '')[::2])
32+
val = 0
3333
for i in range(byteCount):
34-
val = (val << 8) | (data & 0xff)
34+
val = (val << 8) | (data & 0xff)
3535
data >>= 8
3636
return val
3737

38+
3839
def get_default_bus():
3940
"""Return the default bus number based on the device platform. For a
4041
Raspberry Pi either bus 0 or 1 (based on the Pi revision) will be returned.
@@ -49,11 +50,13 @@ def get_default_bus():
4950
# Revision 2 Pi uses I2C bus 1.
5051
return 1
5152
elif plat == Platform.BEAGLEBONE_BLACK:
52-
# Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and P9_20).
53+
# Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and
54+
# P9_20).
5355
return 1
5456
else:
5557
raise RuntimeError('Could not determine default I2C bus for platform.')
5658

59+
5760
def get_i2c_device(address, busnum=None, i2c_interface=None, **kwargs):
5861
"""Return an I2C device for the specified address and on the specified bus.
5962
If busnum isn't specified, the default I2C bus for the platform will attempt
@@ -63,6 +66,7 @@ def get_i2c_device(address, busnum=None, i2c_interface=None, **kwargs):
6366
busnum = get_default_bus()
6467
return Device(address, busnum, i2c_interface, **kwargs)
6568

69+
6670
def require_repeated_start():
6771
"""Enable repeated start conditions for I2C register reads. This is the
6872
normal behavior for I2C, however on some platforms like the Raspberry Pi
@@ -76,8 +80,10 @@ def require_repeated_start():
7680
# repeated start condition like the kernel smbus I2C driver functions
7781
# define. As a workaround this bit in the BCM2708 driver sysfs tree can
7882
# be changed to enable I2C repeated starts.
79-
subprocess.check_call('chmod 666 /sys/module/i2c_bcm2708/parameters/combined', shell=True)
80-
subprocess.check_call('echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined', shell=True)
83+
subprocess.check_call(
84+
'chmod 666 /sys/module/i2c_bcm2708/parameters/combined', shell=True)
85+
subprocess.check_call(
86+
'echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined', shell=True)
8187
# Other platforms are a no-op because they (presumably) have the correct
8288
# behavior and send repeated starts.
8389

@@ -87,6 +93,7 @@ class Device(object):
8793
python smbus library, or other smbus compatible I2C interface. Allows reading
8894
and writing 8-bit, 16-bit, and byte array values to registers
8995
on the device."""
96+
9097
def __init__(self, address, busnum, i2c_interface=None):
9198
"""Create an instance of the I2C device at the specified address on the
9299
specified I2C bus number."""
@@ -98,56 +105,60 @@ def __init__(self, address, busnum, i2c_interface=None):
98105
else:
99106
# Otherwise use the provided class to create an smbus interface.
100107
self._bus = i2c_interface(busnum)
101-
self._logger = logging.getLogger('Adafruit_I2C.Device.Bus.{0}.Address.{1:#0X}' \
102-
.format(busnum, address))
108+
self._logger = logging.getLogger('Adafruit_I2C.Device.Bus.{0}.Address.{1:#0X}'
109+
.format(busnum, address))
110+
self.regvals = [None] * 256
103111

104112
def writeRaw8(self, value):
105113
"""Write an 8-bit value on the bus (without register)."""
106114
value = value & 0xFF
107115
self._bus.write_byte(self._address, value)
108116
self._logger.debug("Wrote 0x%02X",
109-
value)
117+
value)
110118

111119
def write8(self, register, value):
112120
"""Write an 8-bit value to the specified register."""
113-
value = value & 0xFF
114-
self._bus.write_byte_data(self._address, register, value)
115-
self._logger.debug("Wrote 0x%02X to register 0x%02X",
116-
value, register)
121+
if self.regvals[register] is None or self.regvals[register] != value:
122+
value = value & 0xFF
123+
self._bus.write_byte_data(self._address, register, value)
124+
self.regvals[register] = value
125+
self._logger.debug(
126+
"Wrote 0x%02X to register 0x%02X", value, register)
117127

118128
def write16(self, register, value):
119129
"""Write a 16-bit value to the specified register."""
120130
value = value & 0xFFFF
121131
self._bus.write_word_data(self._address, register, value)
122132
self._logger.debug("Wrote 0x%04X to register pair 0x%02X, 0x%02X",
123-
value, register, register+1)
133+
value, register, register + 1)
124134

125135
def writeList(self, register, data):
126136
"""Write bytes to the specified register."""
127137
self._bus.write_i2c_block_data(self._address, register, data)
128138
self._logger.debug("Wrote to register 0x%02X: %s",
129-
register, data)
139+
register, data)
130140

131141
def readList(self, register, length):
132142
"""Read a length number of bytes from the specified register. Results
133143
will be returned as a bytearray."""
134-
results = self._bus.read_i2c_block_data(self._address, register, length)
144+
results = self._bus.read_i2c_block_data(
145+
self._address, register, length)
135146
self._logger.debug("Read the following from register 0x%02X: %s",
136-
register, results)
147+
register, results)
137148
return results
138149

139150
def readRaw8(self):
140151
"""Read an 8-bit value on the bus (without register)."""
141152
result = self._bus.read_byte(self._address) & 0xFF
142153
self._logger.debug("Read 0x%02X",
143-
result)
154+
result)
144155
return result
145156

146157
def readU8(self, register):
147158
"""Read an unsigned byte from the specified register."""
148159
result = self._bus.read_byte_data(self._address, register) & 0xFF
149160
self._logger.debug("Read 0x%02X from register 0x%02X",
150-
result, register)
161+
result, register)
151162
return result
152163

153164
def readS8(self, register):
@@ -161,9 +172,9 @@ def readU16(self, register, little_endian=True):
161172
"""Read an unsigned 16-bit value from the specified register, with the
162173
specified endianness (default little endian, or least significant byte
163174
first)."""
164-
result = self._bus.read_word_data(self._address,register) & 0xFFFF
175+
result = self._bus.read_word_data(self._address, register) & 0xFFFF
165176
self._logger.debug("Read 0x%04X from register pair 0x%02X, 0x%02X",
166-
result, register, register+1)
177+
result, register, register + 1)
167178
# Swap bytes if using big endian because read_word_data assumes little
168179
# endian on ARM (little endian) systems.
169180
if not little_endian:

0 commit comments

Comments
 (0)