Skip to content

Commit c26148b

Browse files
committed
Use lists of words instead of byte strings
Lists of ints of received/transmitted words will be more useful in the majority of applications than the raw byte strings. This format also makes adding support for 16-bit and 32-bit transfers easier to implement in the future.
1 parent 34895ee commit c26148b

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ A pure Python SPI interface using the Linux spidev device
2727
spi.mode = SPI.MODE_0
2828
spi.bits_per_word = 8
2929
spi.speed = 500000
30-
received = spi.transfer("\xAA\xBB\xCC")
31-
spi.write("\x00\x11\x22")
30+
received = spi.transfer([0x11, 0x22, 0xFF])
31+
spi.write([0x12, 0x34, 0xAB, 0xCD])
3232
received = spi.read(10)
3333

3434

spi.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -366,27 +366,28 @@ def write(self, data, speed=0, bits_per_word=0, delay=0):
366366
"""Perform half-duplex SPI write.
367367
368368
Args:
369-
data: Binary string of data to write
369+
data: List of words to write
370370
speed: Optional temporary bitrate override in Hz. 0 (default)
371371
uses existing spidev speed setting.
372372
bits_per_word: Optional temporary bits_per_word override. 0 (
373373
default) is equivalent to 8 bits per word.
374374
delay: Optional delay in usecs between sending the last bit and
375375
deselecting the chip select line. 0 (default) for no delay.
376376
"""
377+
data = array.array('B', data).tostring()
377378
length = len(data)
378-
transmit_buffer = ctypes.create_string_buffer(str(data))
379+
transmit_buffer = ctypes.create_string_buffer(data)
379380
spi_ioc_transfer = struct.pack(SPI._IOC_TRANSFER_FORMAT,
380381
ctypes.addressof(transmit_buffer), 0,
381382
length, speed, delay, bits_per_word, 0,
382383
0, 0, 0)
383384
fcntl.ioctl(self.handle, SPI._IOC_MESSAGE, spi_ioc_transfer)
384385

385386
def read(self, length, speed=0, bits_per_word=0, delay=0):
386-
"""Perform half-duplex SPI read
387+
"""Perform half-duplex SPI read as a binary string
387388
388389
Args:
389-
length: Integer count of bytes to read
390+
length: Integer count of words to read
390391
speed: Optional temporary bitrate override in Hz. 0 (default)
391392
uses existing spidev speed setting.
392393
bits_per_word: Optional temporary bits_per_word override. 0 (
@@ -395,21 +396,21 @@ def read(self, length, speed=0, bits_per_word=0, delay=0):
395396
deselecting the chip select line. 0 (default) for no delay.
396397
397398
Returns:
398-
Binary string of data read from device
399+
List of words read from device
399400
"""
400401
receive_buffer = ctypes.create_string_buffer(length)
401402
spi_ioc_transfer = struct.pack(SPI._IOC_TRANSFER_FORMAT, 0,
402403
ctypes.addressof(receive_buffer),
403404
length, speed, delay, bits_per_word, 0,
404405
0, 0, 0)
405406
fcntl.ioctl(self.handle, SPI._IOC_MESSAGE, spi_ioc_transfer)
406-
return ctypes.string_at(receive_buffer, length)
407+
return [ord(byte) for byte in ctypes.string_at(receive_buffer, length)]
407408

408409
def transfer(self, data, speed=0, bits_per_word=0, delay=0):
409410
"""Perform full-duplex SPI transfer
410411
411412
Args:
412-
data: Binary string to transmit
413+
data: List of words to transmit
413414
speed: Optional temporary bitrate override in Hz. 0 (default)
414415
uses existing spidev speed setting.
415416
bits_per_word: Optional temporary bits_per_word override. 0 (
@@ -418,7 +419,7 @@ def transfer(self, data, speed=0, bits_per_word=0, delay=0):
418419
deselecting the chip select line. 0 (default) for no delay.
419420
420421
Returns:
421-
Binary string of bytes read from SPI bus during transfer
422+
List of words read from SPI bus during transfer
422423
"""
423424
length = len(data)
424425
transmit_buffer = ctypes.create_string_buffer(str(data))
@@ -429,4 +430,4 @@ def transfer(self, data, speed=0, bits_per_word=0, delay=0):
429430
length, speed, delay, bits_per_word, 0,
430431
0, 0, 0)
431432
fcntl.ioctl(self.handle, SPI._IOC_MESSAGE, spi_ioc_transfer)
432-
return ctypes.string_at(receive_buffer, length)
433+
return [ord(byte) for byte in ctypes.string_at(receive_buffer, length)]

0 commit comments

Comments
 (0)