Skip to content

Commit 34895ee

Browse files
committed
Use ioctl for half-duplex writes
Might as well use the ioctl for writes as well. Allows for more specifications (speed, bits per word, delay) and avoids any buffering and flushing issues with normal writes to the spidev character device.
1 parent 37c82b1 commit 34895ee

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

spi.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -362,14 +362,25 @@ def mode(self):
362362
def mode(self, mode):
363363
self._set_mode(mode)
364364

365-
def write(self, data):
365+
def write(self, data, speed=0, bits_per_word=0, delay=0):
366366
"""Perform half-duplex SPI write.
367367
368368
Args:
369369
data: Binary string of data to write
370+
speed: Optional temporary bitrate override in Hz. 0 (default)
371+
uses existing spidev speed setting.
372+
bits_per_word: Optional temporary bits_per_word override. 0 (
373+
default) is equivalent to 8 bits per word.
374+
delay: Optional delay in usecs between sending the last bit and
375+
deselecting the chip select line. 0 (default) for no delay.
370376
"""
371-
self.handle.write(data)
372-
self.handle.flush()
377+
length = len(data)
378+
transmit_buffer = ctypes.create_string_buffer(str(data))
379+
spi_ioc_transfer = struct.pack(SPI._IOC_TRANSFER_FORMAT,
380+
ctypes.addressof(transmit_buffer), 0,
381+
length, speed, delay, bits_per_word, 0,
382+
0, 0, 0)
383+
fcntl.ioctl(self.handle, SPI._IOC_MESSAGE, spi_ioc_transfer)
373384

374385
def read(self, length, speed=0, bits_per_word=0, delay=0):
375386
"""Perform half-duplex SPI read

0 commit comments

Comments
 (0)