У меня проблема с моей библиотекой i2c на Raspberry Pi ноль.
Я написал свой код на python, используя множество учебных пособий, но ни одного из них не было полностью достаточно. В этом коде time.sleep () отсутствует, но даже если он включен, проблема все еще существует. Он может связываться с устройством, но неправильно. Протестировано на приборе BME280.
import RPi.GPIO as GPIO
import time
class SMBus(object):
pin_SCL = 0
pin_SDA = 0
signal = []
def __init__(self, bus=-1):
GPIO.setmode(GPIO.BOARD)
self.set_pin(13, 11)
self.start()
def set_pin(self, SCL, SDA):
self.pin_SCL = SCL
self.pin_SDA = SDA
GPIO.setup(self.pin_SCL, GPIO.OUT)
def start(self):
GPIO.setup(self.pin_SDA, GPIO.OUT)
GPIO.output(self.pin_SCL, GPIO.HIGH)
GPIO.output(self.pin_SDA, GPIO.HIGH)
GPIO.output(self.pin_SDA, GPIO.LOW)
GPIO.output(self.pin_SCL, GPIO.LOW)
def stop(self):
GPIO.setup(self.pin_SDA, GPIO.OUT)
GPIO.output(self.pin_SDA, GPIO.LOW)
GPIO.output(self.pin_SDA, GPIO.HIGH)
GPIO.output(self.pin_SCL, GPIO.HIGH)
def send_byte(self, byte):
GPIO.setup(self.pin_SDA, GPIO.OUT)
for i in range(8):
GPIO.output(self.pin_SDA, byte & 0b10000000)
GPIO.output(self.pin_SCL, GPIO.HIGH)
GPIO.output(self.pin_SCL, GPIO.LOW)
byte = byte << 1
def acknowledge_from_slave(self):
GPIO.setup(self.pin_SDA, GPIO.IN)
GPIO.output(self.pin_SCL, GPIO.HIGH)
status = GPIO.input(self.pin_SDA)
GPIO.output(self.pin_SCL, GPIO.LOW)
if (status == GPIO.HIGH):
print("BYTE NOT RECEIVED")
def acknowledge_from_master(self):
GPIO.setup(self.pin_SDA, GPIO.OUT)
GPIO.output(self.pin_SCL, GPIO.HIGH)
GPIO.output(self.pin_SDA, GPIO.LOW)
GPIO.output(self.pin_SCL, GPIO.LOW)
def receive_byte(self):
byte = ''
GPIO.setup(self.pin_SDA, GPIO.IN)
for i in range(8):
GPIO.output(self.pin_SCL, GPIO.HIGH)
byte = byte + str(GPIO.input(self.pin_SDA))
GPIO.output(self.pin_SCL, GPIO.LOW)
byte = int(byte, 2)
return byte
def write_byte_data(self, DEVICE, address, byte):
self.start()
self.send_byte(DEVICE*2+0)
self.acknowledge_from_slave()
self.send_byte(address)
self.acknowledge_from_slave()
self.send_byte(byte)
self.acknowledge_from_slave()
def read_byte_data(self, DEVICE, address):
self.start()
self.send_byte(DEVICE*2+1)
self.acknowledge_from_slave()
self.send_byte(address)
self.acknowledge_from_master()
return self.receive_byte()
Я ожидаю получить правильную температуру от моего устройства (BME280).