使用 PcDuino SPI 总线连接多个从机
Connecting multiple slaves with PcDuino SPI bus
我目前正在从事类似 3D 打印机的项目,我必须使用 PcDuino 的 SPI 控制 3 个步进驱动器。很少 examples 并且只有一份糟糕的文档描述了我正在寻找的内容。似乎预装的 API 不支持多个从机,但如果我理解正确的话,我只需要添加更多的 CS 线并自己控制它们?
还有什么需要注意的吗?在发送或接收数据时我需要将 CS 保持低电平多长时间?
(好吧,我想接收没问题,因为它在另一条线上)
结果很简单:
只需要select,转移和去select。
无需睡眠或等待。
Select 和 deselect 必须使用引脚设备 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
唯一的困难:主机必须为每个字节传输select并重新select从机。 (但这可能是从芯片的问题,不确定,只是测试了 3 个不同的设备,包括一个 Arduino)
我目前正在从事类似 3D 打印机的项目,我必须使用 PcDuino 的 SPI 控制 3 个步进驱动器。很少 examples 并且只有一份糟糕的文档描述了我正在寻找的内容。似乎预装的 API 不支持多个从机,但如果我理解正确的话,我只需要添加更多的 CS 线并自己控制它们?
还有什么需要注意的吗?在发送或接收数据时我需要将 CS 保持低电平多长时间?
(好吧,我想接收没问题,因为它在另一条线上)
结果很简单: 只需要select,转移和去select。 无需睡眠或等待。 Select 和 deselect 必须使用引脚设备 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
唯一的困难:主机必须为每个字节传输select并重新select从机。 (但这可能是从芯片的问题,不确定,只是测试了 3 个不同的设备,包括一个 Arduino)