使用PcDuino SPI总线连接多个从站

时间:2015-03-31 10:53:33

标签: spi

我目前正在开发类似3D打印机的项目,我必须使用PcDuino中的SPI控制3个步进驱动程序。有很少examples,只有一个不好的文档描述了我在寻找什么。似乎预先安装的API不支持多个从属,但如果我正确理解它,我只需要添加更多CS行并控制它们自己?

在发送或接收数据时,还有什么需要注意以及将CS保持在低电平的时间吗?

(嗯,我想接收是没有问题的,因为它在另一条线路上)

1 个答案:

答案 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)