]> Repositories - hackapet/Adafruit_Blinka_Displayio.git/blobdiff - displayio/_fourwire.py
make chip_select pin optional in SPI four wire
[hackapet/Adafruit_Blinka_Displayio.git] / displayio / _fourwire.py
index 7c8f7c5edaeb45d725f2d75aee04c7ea2af5893c..1cf1682a2fe8dba60b61bd7ceead0572a3705044 100644 (file)
@@ -22,7 +22,7 @@ from typing import Optional
 import digitalio
 import busio
 import microcontroller
-import circuitpython_typing
+from circuitpython_typing import ReadableBuffer
 from ._constants import (
     CHIP_SELECT_TOGGLE_EVERY_BYTE,
     CHIP_SELECT_UNTOUCHED,
@@ -30,7 +30,7 @@ from ._constants import (
     DISPLAY_DATA,
 )
 
-__version__ = "0.0.0-auto.0"
+__version__ = "0.0.0+auto.0"
 __repo__ = "https://github.com/adafruit/Adafruit_Blinka_displayio.git"
 
 
@@ -44,7 +44,7 @@ class FourWire:
         spi_bus: busio.SPI,
         *,
         command: microcontroller.Pin,
-        chip_select: microcontroller.Pin,
+        chip_select: Optional[microcontroller.Pin] = None,
         reset: Optional[microcontroller.Pin] = None,
         baudrate: int = 24000000,
         polarity: int = 0,
@@ -61,15 +61,20 @@ class FourWire:
         """
         self._dc = digitalio.DigitalInOut(command)
         self._dc.switch_to_output(value=False)
-        self._chip_select = digitalio.DigitalInOut(chip_select)
-        self._chip_select.switch_to_output(value=True)
+
+        if chip_select is not None:
+            self._chip_select = digitalio.DigitalInOut(chip_select)
+            self._chip_select.switch_to_output(value=True)
+        else:
+            self._chip_select = None
+
         self._frequency = baudrate
         self._polarity = polarity
         self._phase = phase
 
         if reset is not None:
             self._reset = digitalio.DigitalInOut(reset)
-            self._reset.switch_to_output(value=True)
+            self._reset.switch_to_output(value=False)
         else:
             self._reset = None
         self._spi = spi_bus
@@ -78,7 +83,10 @@ class FourWire:
         self.reset()
         self._spi.deinit()
         self._dc.deinit()
-        self._chip_select.deinit()
+
+        if self._chip_select is not None:
+            self._chip_select.deinit()
+
         if self._reset is not None:
             self._reset.deinit()
 
@@ -95,7 +103,7 @@ class FourWire:
     def send(
         self,
         command,
-        data: circuitpython_typing.ReadableBuffer,
+        data: ReadableBuffer,
         *,
         toggle_every_byte: bool = False,
     ) -> None:
@@ -120,10 +128,14 @@ class FourWire:
         self,
         data_type: int,
         chip_select: int,
-        data: circuitpython_typing.ReadableBuffer,
+        data: ReadableBuffer,
     ):
         self._dc.value = data_type == DISPLAY_DATA
-        if chip_select == CHIP_SELECT_TOGGLE_EVERY_BYTE:
+
+        if (
+            self._chip_select is not None
+            and chip_select == CHIP_SELECT_TOGGLE_EVERY_BYTE
+        ):
             for byte in data:
                 self._spi.write(bytes([byte]))
                 self._chip_select.value = True
@@ -132,16 +144,27 @@ class FourWire:
         else:
             self._spi.write(data)
 
-    def _begin_transaction(self):
+    def _free(self) -> bool:
+        """Attempt to free the bus and return False if busy"""
+        if not self._spi.try_lock():
+            return False
+        self._spi.unlock()
+        return True
+
+    def _begin_transaction(self) -> bool:
         """Begin the SPI transaction by locking, configuring, and setting Chip Select"""
-        while not self._spi.try_lock():
-            pass
+        if not self._spi.try_lock():
+            return False
         self._spi.configure(
             baudrate=self._frequency, polarity=self._polarity, phase=self._phase
         )
-        self._chip_select.value = False
 
-    def _end_transaction(self):
+        if self._chip_select is not None:
+            self._chip_select.value = False
+
+    def _end_transaction(self) -> None:
         """End the SPI transaction by unlocking and setting Chip Select"""
-        self._chip_select.value = True
+        if self._chip_select is not None:
+            self._chip_select.value = True
+
         self._spi.unlock()