Linux 和 C 中的 SPI 超时

Posted

技术标签:

【中文标题】Linux 和 C 中的 SPI 超时【英文标题】:SPI timeout in Linux and C 【发布时间】:2013-12-29 02:41:50 【问题描述】:

我正在尝试对某些硬件传输实施超时,以增加大型项目的安全性。我已经使用select 为UART 传输实现了超时,但我不知道如何在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】:

在硬件中,SPI 主机不会“等待”响应。根据定义,SPI 主机提供时钟周期,从机必须回复。等待响应的概念不适用于 SPI 总线。 (我假设您正在操作 SPI 主机)

(在协议的更深处,SPI 可能会轮询硬件以查看它是否已完成/准备就绪;但 SPI 总线本身每次都会立即得到响应)。

澄清一下:SPI MISO 引脚上的任何内容中的 SPI 时钟。 MISO 引脚上的任何电平都是回复,即使从机没有明确驱动电平。检测无响应从站的唯一方法是以不能被解释为有效消息的方式上拉/下拉 MISO。

【讨论】:

那么 SPI 没有阻塞? SPI 不会无限期阻塞。您可能有一个很长的交换时间(或较慢的比特率),导致传输花费的时间比您想要等待的时间长,但作为 SPI 主机,您会事先知道您的传输速率和数据长度;延迟不会有任何意外。我使用了一个 SPI 闪存芯片,您可以通过一个 SPI 命令读取整个内容,但我从未见过读取长度可能取决于数据本身的 SPI 协议。

以上是关于Linux 和 C 中的 SPI 超时的主要内容,如果未能解决你的问题,请参考以下文章

linux中的SPI和DMA有啥关系?

怎样挂载spi flash分区到文件系统中的目录下

linux4.1.36 SPI 时钟找不到 不生成设备 device

SPI设备标准驱动源码分析(linux kernel 5.18)

SPI:Linux驱动模型

linx下如何驱动spi