From: ladyada Date: Tue, 26 Jun 2018 04:25:24 +0000 (-0400) Subject: beginningish of SPI support X-Git-Tag: 0.1.0^2~5 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/8bc681c3c82463095455e73e690156bf3a323821 beginningish of SPI support --- diff --git a/examples/pi_busio_spi.py b/examples/pi_busio_spi.py new file mode 100644 index 0000000..085d221 --- /dev/null +++ b/examples/pi_busio_spi.py @@ -0,0 +1,19 @@ +import sys +import time +sys.path.append('/home/pi/Adafruit_Micropython_Blinka/src') +sys.path.append('/home/pi/Adafruit_Python_GPIO') +sys.path.append('/home/pi/Adafruit_Python_PureIO') + +import board +import digitalio +import busio + +spi = busio.SPI(board.SCLK, board.MOSI, board.MISO) +while not spi.try_lock(): + pass +spi.configure(baudrate=16000000) +spi.unlock() + +while True: + spi.write(bytes([x for x in range(64)])) + time.sleep(0.1) diff --git a/examples/pi_i2c.py b/examples/pi_i2c.py deleted file mode 100644 index 6e8e0ac..0000000 --- a/examples/pi_i2c.py +++ /dev/null @@ -1,33 +0,0 @@ -import sys -import time -sys.path.append('/home/pi/Adafruit_Micropython_Blinka/src') -sys.path.append('/home/pi/Adafruit_Python_GPIO') -sys.path.append('/home/pi/Adafruit_Python_PureIO') - -import board -import digitalio -import busio - -print("hello blinka!") - -i2c = busio.I2C(board.SCL, board.SDA) - -print("I2C devices found: ", [hex(i) for i in i2c.scan()]) - -if not 0x18 in i2c.scan(): - print("Didn't find MCP9808") - exit() - -def temp_c(data): - value = data[0] << 8 | data[1] - temp = (value & 0xFFF) / 16.0 - if value & 0x1000: - temp -= 256.0 - return temp - -while True: - i2c.writeto(0x18, bytes([0x05]), stop=False) - result = bytearray(2) - i2c.readfrom_into(0x18, result) - print(temp_c(result)) - time.sleep(0.5) diff --git a/src/adafruit_blinka/board/raspi_23.py b/src/adafruit_blinka/board/raspi_23.py index 053c94b..fd0f370 100644 --- a/src/adafruit_blinka/board/raspi_23.py +++ b/src/adafruit_blinka/board/raspi_23.py @@ -2,7 +2,15 @@ from adafruit_blinka.microcontroller.raspi_23 import pin SDA = pin.SDA SCL = pin.SCL +D2 = pin.D2 +D3 = pin.D3 D4 = pin.D4 +D9 = pin.D9 +D10 = pin.D10 +D11 = pin.D11 +MISO = pin.D9 +MOSI = pin.D10 +SCLK = pin.D11 D14 = pin.D14 D15 = pin.D15 D17 = pin.D17 diff --git a/src/adafruit_blinka/microcontroller/raspi_23/i2c.py b/src/adafruit_blinka/microcontroller/raspi_23/i2c.py index 369f8bd..edac8db 100644 --- a/src/adafruit_blinka/microcontroller/raspi_23/i2c.py +++ b/src/adafruit_blinka/microcontroller/raspi_23/i2c.py @@ -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) diff --git a/src/adafruit_blinka/microcontroller/raspi_23/pin.py b/src/adafruit_blinka/microcontroller/raspi_23/pin.py index 236d635..1537f1b 100644 --- a/src/adafruit_blinka/microcontroller/raspi_23/pin.py +++ b/src/adafruit_blinka/microcontroller/raspi_23/pin.py @@ -19,7 +19,10 @@ class Pin: self.id = bcm_number def __repr__(self): - return "BCM #%d" % self.id + return str(self.id) + + def __eq__(self, other): + return self.id == other def init(self, mode=IN, pull=None): if mode != None: @@ -86,7 +89,7 @@ D24 = Pin(24) D27 = Pin(27) # ordered as spiId, sckId, mosiId, misoId -spiPorts = ((1, SCLK, MOSI, MISO), (2, SCLK_2, MOSI_2, MISO_2)) +spiPorts = ((0, SCLK, MOSI, MISO), (1, SCLK_2, MOSI_2, MISO_2)) # ordered as uartId, txId, rxId uartPorts = ( diff --git a/src/adafruit_blinka/microcontroller/raspi_23/spi.py b/src/adafruit_blinka/microcontroller/raspi_23/spi.py new file mode 100644 index 0000000..d6627c6 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/raspi_23/spi.py @@ -0,0 +1,47 @@ +import spidev +import time + +class SPI: + MSB = 0 + LSB = 1 + CPHA = 1 + CPOL = 2 + + baudrate = 100000 + mode = 0 + bits = 8 + + def __init__(self, portid): + self._port = portid + self._spi = spidev.SpiDev() + + def init(self, baudrate=100000, polarity=0, phase=0, bits=8, + firstbit=MSB, sck=None, mosi=None, miso=None): + mode = 0 + if polarity: + mode |= CPOL + if phase: + mode |= CPHA + + self.clock_pin = sck + self.mosi_pin = mosi + self.miso_pin = miso + self.baudrate = baudrate + self.mode = mode + self.bits = bits + + def write(self, buf): + if not buf: + return + try: + + self._spi.open(self._port, 0) + self._spi.no_cs = True + self._spi.max_speed_hz = self.baudrate + self._spi.mode = self.mode + self._spi.bits_per_word = self.bits + self._spi.writebytes([x for x in buf]) + self._spi.close() + except FileNotFoundError as not_found: + print("Could not open SPI device - check if SPI is enabled in kernel!") + raise diff --git a/src/busio.py b/src/busio.py index 3d786ac..915547a 100755 --- a/src/busio.py +++ b/src/busio.py @@ -63,27 +63,38 @@ class I2C(Lockable): class SPI(Lockable): def __init__(self, clock, MOSI=None, MISO=None): + self.deinit() + if boardId == "raspi_3" or boardId == "raspi_2": + from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI + else: + from machine import SPI as _SPI from microcontroller.pin import spiPorts for portId, portSck, portMosi, portMiso in spiPorts: if clock == portSck and MOSI == portMosi and MISO == portMiso: - self._spi = SPI(portId) + self._spi = _SPI(portId) self._pins = (portSck, portMosi, portMiso) break else: raise NotImplementedError( - "No Hardware SPI on (clock, MOSI, MISO)={}\nValid SPI ports:{}". + "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}". format((clock, MOSI, MISO), spiPorts)) def configure(self, baudrate=100000, polarity=0, phase=0, bits=8): - if self._locked: + if boardId == "raspi_3" or boardId == "raspi_2": + from adafruit_blinka.microcontroller.raspi_23.spi import SPI as _SPI + from adafruit_blinka.microcontroller.raspi_23.pin import Pin + else: + from machine import SPI as _SPI from machine import Pin + + if self._locked: # TODO check if #init ignores MOSI=None rather than unsetting, to save _pinIds attribute self._spi.init( baudrate=baudrate, polarity=polarity, phase=phase, bits=bits, - firstbit=SPI.MSB, + firstbit=_SPI.MSB, sck=Pin(self._pins[0].id), mosi=Pin(self._pins[1].id), miso=Pin(self._pins[2].id)