原來是安靜簡單: 只要有選擇,轉讓和取消。 無需睡眠或等待。 選擇和取消選擇必須使用引腳設備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
唯一的困難:主必須取消並重新選擇所述從供傳送的每個字節。 (但這可能是從芯片的問題,不確定,只是測試了包括Arduino在內的3種不同設備)