Last updated:
0 purchases
linux spidev
spidev #
A dart package for SPI using the linux spidev interface. Uses dart:ffi internally.
Has no dependencies on flutter whatsoever.
This package is currently in early early alpha.
Example #
/// Create a [Spidev] instance from the spidev's bus and device number.
/// That spidev may not exist. ([Spidev] is actually just a data class)
final spidev = Spidev.fromBusDevNrs(0, 0);
/// Open the spidev, so you can use it and read/write data from/to it.
final handle = spidev.open();
print("mode: ${handle.mode}");
print("bitsPerWord: ${handle.bitsPerWord}");
print("maxSpeed: ${handle.maxSpeed}");
/// for transferring data from and to a SPI device, normal dart typed data
/// can be used. However this will internally result in the data being copied
/// to a real (malloced) memory buffer and then copied back again after receive.
/// If you're transmitting larger amounts of data, you can also use malloced
/// buffers directly using [spidev.transferSingleNativeMem].
final typedData = Uint8List(4);
/// This will only execute this single SPI transfer. If you want to execute
/// multiple transfers consecutively, for example write a four-byte command and
/// and then read 512 bytes directly after, you need to use [spidev.transfer] or
/// [spidev.transferNativeMem] which take list of [SpiTransfer]s as arguments
/// and pass those lists of SPI transfers to the kernel all at once.
await spidev.transferSingleTypedData(txBuf: typedData, rxBuf: typedData);
/// This is a more low-level example for using malloced memory directly.
final command = ffi.malloc.allocate<ffi.Uint8>(4);
final response = ffi.malloc.allocate<ffi.Uint8>(512);
command[0] = 0x12;
command[1] = 0x34;
command[2] = 0x56;
command[3] = 0x78;
await spidev.transfer([
SpiTransfer(
data: SpiTransferData.fromNativeMem(txBuf: command, length: 4),
),
SpiTransfer(
data: SpiTransferData.fromNativeMem(rxBuf: response, length: 512),
),
])
final responseAsList = response.asTypedList(512);
print(responseAsList);
ffi.malloc.free(command);
ffi.malloc.free(response);
handle.close();
/// This can also be used for transferring files for example.
/// In this case, allocate a large file buffer (maybe 2048 bytes,
/// some linux SPI drivers have a max byte limit size per transaction
/// (a transaction being 1 or more consecutive SPI transfers) but unfortunately
/// you can't query that limit)
/// Then, get a typed list of the buffer (using asTypedList(length)) and then
/// read the file or parts of the file directly into that list.
copied to clipboard
For personal and professional use. You cannot resell or redistribute these repositories in their original state.
There are no reviews.