首页 > 解决方案 > 如何通过 pyftdi lib 正确地与通过 FTDI USB 连接的 spi 从站通信?

问题描述

我有以下问题:我想通过 spi 接口从 Invensense (ICM-20602) 读出一个运动传感器,FTDI USB Spi 转换器连接到带有 python3 程序的 Debian linux 系统。我设置了所有必要的库和驱动程序,我可以设置 CS 线,还可以通过示波器验证我的 MOSI、时钟和 CS 线输出。设备也有 MISO 输入,但不是我所期望的。我将寄存器地址发送到 whois-register 以获取设备 ID 以验证读/写是否正常工作。我不明白为什么设备没有正确响应。这是我目前的代码:

#pyspi - pyftdi

from pyftdi.spi import SpiController, SpiIOError
from struct import *



ctrl= SpiController()#spi
ctrl.configure('ftdi://ftdi:232h/1')  # Assuming there is only one FT232H.
spi = ctrl.get_port(cs=0, freq=1E6, mode=0)# Assuming D3 is used for chip select.


write_buf = b'\x75\0xdf'


spi.write(write_buf,True,False)

read_1= spi.read(2, start=False, stop=True).tobytes()

id = spi.exchange([0x75,0xff,],2).tobytes()
#ctrl.get_port(cs=1, freq=1E6, mode=1)
print(read_1)
print(id)

没有代码错误 - 只有读取缓冲区是 0x00 或有时是 0x10 但不是我所期望的:设备 ID:0xAF

有人知道如何让设备正确回答吗?

顺便说一句:该设备与 invensense 评估板一起正常工作 - 所以该设备应该可以正常工作。

标签: python-3.xusbspiusbserialftdi

解决方案


最后,我使用设备 ID 为 0x10 的英飞凌压力传感器测试了 FTDI USB 设备。我设法读出了 ID,然后我还发现 ICM-20602 具有不同的设备 ID (0x12),如数据表中指定的 (0xAF)。我还设法读出了陀螺数据,因此我非常有信心设备 ID 与指定的不同。为了读出两个传感器的 ID,我还调整了我的程序,使其在一个交换周期内只发送一个字节。模式 0 适用于 ICM 设备而没有问题 - 1,2 不工作 - 也不必将设备置于 spi 模式才能使用模式 0。这是调整后的程序:

from pyftdi.spi import SpiController, SpiIOError
from struct import *



ctrl= SpiController()#spi
ctrl.configure('ftdi://ftdi:232h/1')  # Assuming there is only one FT232H.
spi = ctrl.get_port(cs=0, freq=1E6, mode=0)# Assuming D3 is used for chip 
select.    
write_buf = b'\x75\'


spi.write(write_buf,True,False)

read_1= spi.read(2, start=False, stop=True).tobytes()

id = spi.exchange([0x75],2).tobytes()
print(read_1)
print(id)

推荐阅读