]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
beginningish of SPI support
authorladyada <limor@ladyada.net>
Tue, 26 Jun 2018 04:25:24 +0000 (00:25 -0400)
committerScott Shawcroft <scott@tannewt.org>
Wed, 27 Jun 2018 20:01:44 +0000 (13:01 -0700)
examples/pi_busio_spi.py [new file with mode: 0644]
examples/pi_i2c.py [deleted file]
src/adafruit_blinka/board/raspi_23.py
src/adafruit_blinka/microcontroller/raspi_23/i2c.py
src/adafruit_blinka/microcontroller/raspi_23/pin.py
src/adafruit_blinka/microcontroller/raspi_23/spi.py [new file with mode: 0644]
src/busio.py

diff --git a/examples/pi_busio_spi.py b/examples/pi_busio_spi.py
new file mode 100644 (file)
index 0000000..085d221
--- /dev/null
@@ -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 (file)
index 6e8e0ac..0000000
+++ /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)
index 053c94b3ab08fb78704dab55f6e7704f69ca5595..fd0f370b174ae2cc62851b78160f3a41d922462d 100644 (file)
@@ -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
index 369f8bdb33d541b65e4616938d71de286735339a..edac8db010335712784ec92afdba8c7325c0b1e3 100644 (file)
@@ -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)
index 236d635b7a9b7b0da6f5dd63d4589d8f768075ee..1537f1b3c1af11fd3f1865aec7e0e9c67429e2fa 100644 (file)
@@ -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 (file)
index 0000000..d6627c6
--- /dev/null
@@ -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
index 3d786acefbf3e043ef4f8e73df578608b32d68be..915547a012697c5eed0e3f1ec5e7e912542a6742 100755 (executable)
@@ -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)