如何通过pyftdi lib与通过FTDI USB连接的spi从站正确通信?

时间:2019-06-25 11:47:33

标签: python-3.x usb spi usbserial ftdi

我有以下问题: 我想通过spi接口从FTDI USB Spi转换器通过spi接口从Invensense(ICM-20602)读取运动传感器,该FTDI USB Spi转换器使用python3程序连接到Debian linux系统。我设置了所有必需的库和驱动程序,可以设置CS线路,还可以通过示波器验证我的MOSI,Clock和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评估板一起正常工作-因此该设备应该可以正常工作。

1 个答案:

答案 0 :(得分:0)

最后,我用设备ID为0x10的Infineon压力传感器测试了FTDI USB设备。我设法读取了该ID,然后又发现ICM-20602具有与数据手册中指定的(0xAF)不同的设备ID(0x12)。我还设法读取了陀螺仪数据,因此我非常有信心设备ID与指定的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)