SPI 通信读取 255 故障分析
一、现象背后的真相:为什么是 255?
'C++ spidev0.0 读出来 255'这一现象具有误导性。
它不是 read() 调用返回 255
注意!我们说的'read'并不是真的调用了 read(fd, buf, len) 这个系统调用。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] 中看到了 0xFF —— 所谓'读到 255',其实是这次全双工传输中,MISO 线上采样回来的字节值。而这个 0xFF,往往意味着一件事:从设备根本没有回应你。
二、0xFF 是怎么来的?MISO 线的'默认状态'揭秘
要理解这个问题,得回到数字电路的基本原理。
MISO 线为何会变成全 1?
SPI 通信是主从结构,主设备控制时钟和片选,从设备只在被选中时才驱动 MISO 线输出数据。
但如果以下情况之一成立:
- 从设备没上电
- 片选没拉低(CS 一直高)
- MISO 引脚虚焊或断开
- 从设备损坏或未初始化
- 从设备不支

