X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka.git/blobdiff_plain/e7fee263ecca5ed166b9d3cef21c366d7c665b9f..e8e07c13c85ef6f7d68691e93d7f6f5a749cd076:/src/adafruit_blinka/microcontroller/raspi_23/i2c.py diff --git a/src/adafruit_blinka/microcontroller/raspi_23/i2c.py b/src/adafruit_blinka/microcontroller/raspi_23/i2c.py index a4647b6..e309e9e 100644 --- a/src/adafruit_blinka/microcontroller/raspi_23/i2c.py +++ b/src/adafruit_blinka/microcontroller/raspi_23/i2c.py @@ -1,4 +1,4 @@ -import smbus +import Adafruit_PureIO.smbus as smbus import time class I2C: @@ -13,8 +13,8 @@ class I2C: raise NotImplementedError("Only I2C Master supported!") _mode = self.MASTER - if baudrate != None: - print("I2C frequency is not settable in python, ignoring!") + #if baudrate != None: + # print("I2C frequency is not settable in python, ignoring!") try: self._i2c_bus = smbus.SMBus(bus_num) @@ -22,11 +22,45 @@ class I2C: raise RuntimeError("I2C Bus #%d not found, check if enabled in config!" % bus_num) def scan(self): + """Try to read a byte from each address, if you get an OSError it means the device isnt there""" found = [] - for addr in range(0,0x7F): + for addr in range(0,0x80): try: self._i2c_bus.read_byte(addr) except OSError: continue found.append(addr) return found + + def writeto(self, address, buffer, *, start=0, end=None, stop=True): + if end is None: + end = len(buffer) + self._i2c_bus.write_bytes(address, buffer[start:end]) + + def readfrom_into(self, address, buffer, *, start=0, end=None, stop=True): + if end is None: + end = len(buffer) + + readin = self._i2c_bus.read_bytes(address, end-start) + for i in range(end-start): + buffer[i+start] = readin[i] + + def writeto_then_readfrom(self, address, buffer_out, buffer_in, *, + out_start=0, out_end=None, + in_start=0, in_end=None, stop=False): + if out_end is None: + out_end = len(buffer_out) + if in_end is None: + in_end = len(buffer_in) + if stop: + # To generate a stop in linux, do in two transactions + self.writeto(address, buffer_out, start=out_start, end=out_end, stop=True) + self.readfrom_into(address, buffer_in, start=in_start, end=in_end) + else: + # To generate without a stop, do in one block transaction + if out_end-out_start != 1: + raise NotImplementedError("Currently can only write a single byte in writeto_then_readfrom") + readin = self._i2c_bus.read_i2c_block_data(address, buffer_out[out_start:out_end][0], in_end-in_start) + for i in range(in_end-in_start): + buffer_in[i+in_start] = readin[i] +