Python spidev库xfer2方法的特定SPI交互实现问询
关于spidev实现特定SPI交互的问题
我没找到这个问题的合适答案,spidev文档的帮助也很有限:
假设有一个SPI设备,需要先发送2字节数据加1字节填充字节,再读取4字节响应。期望的MOSI与MISO交互如下:
| byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
| MOSI | txdata0 | txdata1 | padding | dummy | dummy | dummy | dummy |
| MISO | ignored | ignored | ignored | data0 | data1 | data2 | data3 |
请问实现上述MOSI/MISO交互的spidev调用语句是什么?是以下选项之一还是其他写法?
rxdata = spi.xfer2([txdata0, txdata1], 7)# 即期望总共返回7字节rxdata = spi.xfer2([txdata0, txdata1, 0], 4)# 即期望在发送缓冲区加填充后返回4字节- 其他写法?
正确实现方式
得用第三种写法——构造一个包含7字节的发送缓冲区,通过xfer2发送并接收全部7字节响应,最后提取后4字节有效数据。
具体代码如下:
# 构造完整的7字节发送缓冲区:前2字节业务数据,第3字节填充,后4字节dummy tx_buffer = [txdata0, txdata1, padding_byte, 0x00, 0x00, 0x00, 0x00] # 发送整个缓冲区并接收对应7字节数据 rx_buffer = spi.xfer2(tx_buffer) # 提取后4字节有效响应 rxdata = rx_buffer[3:]
为啥另外两个选项不行?
- 第一个选项
spi.xfer2([txdata0, txdata1], 7):这里的第二个参数是时钟速度,不是传输字节数。xfer2的传输长度由发送缓冲区的长度决定,所以这个调用只会发2字节、收2字节,完全不符合需求。 - 第二个选项
spi.xfer2([txdata0, txdata1, 0], 4):同样,第二个参数是速度不是接收长度。这个调用只发3字节、收3字节,拿不到后面4个字节的响应。
核心逻辑
SPI是全双工同步传输,每发1字节就会同时收1字节。要拿到后面4字节的响应,必须发对应的4个dummy字节触发设备返回数据,所以总共要发7字节(2业务+1填充+4dummy),收7字节后过滤掉前3个无效字节就行。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

