Nur so, weil ich es kurz hingerotzt habe:
Eine Routine, um das Shellkommando i2cdetect -y 1 nachzubilden:
Python
#!/usr/bin/python3
import smbus # I2C
class I2C:
def __init__(self):
self.i2c = smbus.SMBus(1) # i2c bus: J8.3 (GPIO2) as SDA,
# J8.5 (GPIO3) as SCL
def detect(self):
# inspired by shell command "i2cdetect -y 1"
print(' 0 1 2 3 4 5 6 7 8 9 a b c d e f')
for addr in range(0, 127, 16):
lin = '{:02x}:'.format(addr)
for i in range(0, 16):
if addr + i < 3:
lin += ' '
else:
try:
x = self.i2c.write_i2c_block_data(addr + i, 0, [])
except OSError:
lin += ' --'
else:
lin += ' {:02x}'.format(addr + i)
print(lin)
def read(self, addr, reg, cnt):
# returns a list of received data
data = self.i2c.read_i2c_block_data(addr, reg, cnt)
print('<RD addr {}, reg/ofs {} = {}'.format(hex(addr),
hex(reg),
data))
return data
def write(self, addr, reg, data):
# no return value
self.i2c.write_i2c_block_data(addr, reg, data)
print('>WR addr {}, reg/ofs {}: {}'.format(
hex(addr),
hex(reg),
'set register' if data == [] else data))
# MAIN:
i2c = I2C()
i2c.detect()
Display More
Das Wesentliche ist die Methode detect in der Klasse I2C.
Bitte wegen dem Rest (read und write) nicht schlagen:
Da werden keine Laufzeitfehler abgefangen.
Vielleicht kann's außer mir noch jemand brauchen?
EDIT: Getestet auf einem RPi4B