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 超时的主要内容,如果未能解决你的问题,请参考以下文章
linux4.1.36 SPI 时钟找不到 不生成设备 device