Linux和C中的SPI超时问题

4

我正在尝试为一些硬件传输实现超时,以增加一个大项目的安全性。我已经在UART传输中使用了select来实现超时,但我不知道如何在SPI传输中添加超时。

这是我的读取代码:

int spi_read(int fd, char command, char* buffer, int size, int timeout)
{
    struct spi_ioc_transfer xfer[2];
    int status;

    memset(buffer, 0, sizeof(buffer));
    memset(xfer, 0, sizeof(xfer));

    xfer[0].tx_buf = (unsigned int)(&command);
    xfer[0].len = 1;

    xfer[1].rx_buf = (unsigned int)buffer;
    xfer[1].len = size;

    status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
    if(status < 0)
        return NOERROR;
    else
        return EHWFAULT1;
}

它发送一个字节大小的指令,并接收特定大小的响应(在半双工模式下)。如何在响应中实现超时?可以使用select来实现吗?我应该分离两个事务并使用select,还是最好使用闹钟?

然后,对于通过ioctl实现的全双工模式,我也有同样的问题。你能给我一些提示吗?

1个回答

4
在硬件中,SPI主设备不会“等待”响应。按照定义,SPI主设备提供时钟周期,从设备必须回复。等待响应的概念不适用于SPI总线。(我假设你正在操作SPI主设备)
在协议更深层次上,SPI可能轮询硬件以查看其是否完成/准备好;但是SPI总线本身每次都会得到一个即时答复。
需要澄清的是:SPI会在SPI MISO引脚上时钟输入任何内容。无论从设备是否明确驱动电平,MISO引脚上的电平都是回复。检测非响应式的从设备的唯一方法是上拉/下拉MISO引脚,以一种不能被解释为有效消息的方式。 Typical SPI protocol

那么SPI不会阻塞吗? - markmb
1
SPI不会无限期阻塞。可能会发生非常长的交换(或慢速率),导致传输时间超过您想要等待的时间,但作为SPI主机,您事先会知道传输速率和数据长度;延迟不会有任何意外。我使用了一颗SPI闪存芯片,你可以用一个SPI命令读取整个芯片,但我从未见过SPI协议的读取长度可能取决于数据本身。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接