结果很安静:
只需选择、转移和取消选择。
无需睡眠或等待。
选择和取消选择必须使用 pin devices api 完成,
所以你可以使用尽可能多的奴隶,因为你有空闲的针。
示例实现:
void GPIOpin::set(FILE* fd, size_t value) {
char buffer[4];
memset(buffer, 0, 4);
sprintf(buffer, "%d", value);
fseek(fd, 0, SEEK_SET);
fwrite(buffer, 1, 4, fd);
fflush(fd);
}
bool SPI::transfer(size_t slaveIndex, uint8_t* buffer, uint64_t size) const {
if(!handle) return false;
struct spi_ioc_transfer transfer;
memset(&transfer, 0, sizeof(transfer));
transfer.len = 1;
for(size_t i = 0; i < size; ++i) {
slaveCS[slaveIndex].setValue(0);
transfer.tx_buf = transfer.rx_buf = (uint64_t)&buffer[i];
if(ioctl(handle, SPI_IOC_MESSAGE(1), &transfer) != transfer.len)
return false;
slaveCS[slaveIndex].setValue(1);
}
return true;
}
完整代码:
https://github.com/Lichtso/PrismCNC/tree/master/backend
唯一的困难:对于传输的每个字节,主设备必须取消选择并重新选择从设备。 (但这可能是从芯片的问题,不确定,刚刚测试了 3 种不同的设备,包括一个 Arduino)