我正在尝试对某些硬件传输实施超时,以增加大型项目的安全性.我已经使用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来实现吗?我应该分开进行交易,而是使用选择警报还是更好地使用警报?
然后,对于全双工模式我也有同样的问题,全双工模式也是使用ioctl实现的.你能给我任何提示吗?
解决方法:
在硬件中,SPI主设备不会“等待”响应.根据定义,SPI主设备提供时钟周期,而从设备必须响应.等待响应的概念不适用于SPI总线. (我假设您正在操作SPI主设备)
(在协议中,SPI可能会轮询硬件以查看其是否已完成/就绪;但是SPI总线本身每次都会得到立即答复).
需要说明的是:SPI时钟在SPI MISO引脚上.即使从器件未明确驱动电平,MISO引脚上的电平也将是应答.检测无响应的从属的唯一方法是以一种不能解释为有效消息的方式上拉/下拉MISO.
标签:spi,c-3,linux
来源: https://codeday.me/bug/20191030/1965230.html