Как правильно общаться с spi-ведомым, подключенным через FTDI USB через pyftdi lib? - PullRequest
0 голосов
/ 25 июня 2019

У меня следующая проблема: я хочу считывать датчик движения из Invensense (ICM-20602) через интерфейс spi с конвертером FTDI USB Spi, подключенным к системе Debian linux с программой python3.Я установил все необходимые библиотеки и драйверы, и я могу установить линию CS, а также проверил свои выходные сигналы MOSI, Clock и CS линии с помощью осциллографа.Есть также вход MISO от устройства, но не то, что я ожидал.Я отправляю адрес регистра в whois-регистр, чтобы получить идентификатор устройства, чтобы убедиться, что чтение / запись работает.Я не понимаю, почему устройство не отвечает должным образом.Это мой код на данный момент:

#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, но не то, что я ожидал: идентификатор устройства: 0xAF

Кто-нибудь знает, как заставить устройство отвечать правильно?

Кстати: устройство работает правильно с оценочной платой Invensense - значит, устройство должно работать правильно.

1 Ответ

0 голосов
/ 02 июля 2019

Наконец я протестировал USB-устройство FTDI с датчиком давления Infineon с идентификатором устройства 0x10.Мне удалось прочитать идентификатор, а затем я также обнаружил, что ICM-20602 имеет другой идентификатор устройства (0x12), как указано (0xAF) в таблице данных.Мне также удалось прочитать гироскопические данные, поэтому я очень уверен, что идентификатор устройства отличается от указанного.Для считывания идентификатора обоих датчиков я также настроил свою программу на отправку только одного байта в течение одного цикла обмена.Режим 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)
...