繁体   English   中英

Linux和C中的SPI超时

[英]SPI timeout in Linux and C

我正在尝试为某些硬件传输实现超时,以增加大项目的安全性。 我已经使用select for 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实现的。 你能给我一些提示吗?

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

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

澄清一下:SPI时钟位于SPI MISO引脚上。 无论MISO引脚上的电平是什么级别都是响应,即使从器件没有明确驱动电平。 检测非响应从设备的唯一方法是以不能被解释为有效消息的方式上拉/下拉MISO。

典型的SPI协议

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM