Skip to content

Commit 37c82b1

Browse files
committed
Use ioctl for read
Regular reads from the spidev handle end up reading too many bytes due to read-ahead buffering. Using the ioctl avoids this issue and allows specifying per-transfer options if desired.
1 parent 67a2d49 commit 37c82b1

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

spi.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,26 +365,34 @@ def mode(self, mode):
365365
def write(self, data):
366366
"""Perform half-duplex SPI write.
367367
368-
Chip select is deactivated during write.
369-
370368
Args:
371369
data: Binary string of data to write
372370
"""
373371
self.handle.write(data)
374372
self.handle.flush()
375373

376-
def read(self, length):
374+
def read(self, length, speed=0, bits_per_word=0, delay=0):
377375
"""Perform half-duplex SPI read
378376
379-
Chip select is deactivated during read.
380-
381377
Args:
382378
length: Integer count of bytes to read
379+
speed: Optional temporary bitrate override in Hz. 0 (default)
380+
uses existing spidev speed setting.
381+
bits_per_word: Optional temporary bits_per_word override. 0 (
382+
default) is equivalent to 8 bits per word.
383+
delay: Optional delay in usecs between sending the last bit and
384+
deselecting the chip select line. 0 (default) for no delay.
383385
384386
Returns:
385387
Binary string of data read from device
386388
"""
387-
return self.handle.read(length)
389+
receive_buffer = ctypes.create_string_buffer(length)
390+
spi_ioc_transfer = struct.pack(SPI._IOC_TRANSFER_FORMAT, 0,
391+
ctypes.addressof(receive_buffer),
392+
length, speed, delay, bits_per_word, 0,
393+
0, 0, 0)
394+
fcntl.ioctl(self.handle, SPI._IOC_MESSAGE, spi_ioc_transfer)
395+
return ctypes.string_at(receive_buffer, length)
388396

389397
def transfer(self, data, speed=0, bits_per_word=0, delay=0):
390398
"""Perform full-duplex SPI transfer

0 commit comments

Comments
 (0)