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,
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,
"""
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
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()
def send(
self,
command,
- data: circuitpython_typing.ReadableBuffer,
+ data: ReadableBuffer,
*,
toggle_every_byte: bool = False,
) -> None:
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
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
+
+ return True
+
+ 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()