使用 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)