我目前正在开发类似3D打印机的项目,我必须使用PcDuino中的SPI控制3个步进驱动程序。有很少examples,只有一个不好的文档描述了我在寻找什么。似乎预先安装的API不支持多个从属,但如果我正确理解它,我只需要添加更多CS行并控制它们自己?
在发送或接收数据时,还有什么需要注意以及将CS保持在低电平的时间吗?
(嗯,我想接收是没有问题的,因为它在另一条线路上)
答案 0 :(得分:0)
原来很容易安静: 只需选择,转移和取消选择。 不需要睡觉或等待。 选择和取消选择必须使用引脚设备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)