SPI 通信读取 255 的原因分析
在 C++ 程序通过 /dev/spidev0.0 读取 SPI 设备时,若每次获取到的数据均为 255(即 0xFF),通常表明硬件链路存在问题。代码逻辑看似无误,ioctl(SPI_IOC_MESSAGE) 执行成功,但数据异常。
这并非异常现象,而是硬件层面的直接反馈,通常意味着从设备未正确响应。
现象分析:ioctl 传输机制
所谓'read 读出来 255',具有误导性。Linux 的 spidev 接口并不支持传统意义上的 read/write 收发数据,而是依赖 ioctl(SPI_IOC_MESSAGE)。
实际过程如下:
struct spi_ioc_transfer xfer = {
.tx_buf = (unsigned long)tx_data,
.rx_buf = (unsigned long)rx_data,
.len = 1
};
ioctl(fd, SPI_IOC_MESSAGE(1), &xfer);
执行完成后,rx_data[0] 中的值即为 MISO 线上采样回来的字节。若该值为 0xFF,往往表示从设备没有回应。
硬件原理:MISO 线默认状态
要理解此问题,需回顾数字电路原理。SPI 为从机结构,主设备控制时钟和片选,从设备仅在选中时驱动 MISO 线。
若出现以下情况之一,MISO 线可能保持高电平(全 1):
- 从设备未上电
- 片选信号未拉低(CS 一直为高)
- MISO 引脚虚焊或断开
- 从设备损坏或未初始化
- 从设备不支持当前配置

