|
|
E502 + Python
Здравствуйте. Пытаюсь написать скрипт для работы с модулем E502 через библиотеку libusb1, но пока не очень выходит; чтение регистров работает, а вот запись - нет import usb1
from struct import pack, unpack
context = usb1.USBContext()
handle = context.openByVendorIDAndProductID( 0x2A52, 0xE502 )
handle.claimInterface(0)
# Запрос скорости USB-интерфейса
print( handle.controlRead( 0xC0, 0x6, 0, 0, 1 ) ) # выдает 1, как положено
# Запись в регистр FPGA
handle.controlWrite( 0x60, 0x200+0x114, 0, pack( "I", 1) ) # вызывает LIBUSB_ERROR_PIPE, а зеленый светодиод LED2 на мгновение тухнет
В общем, исключение LIBUSB_ERROR_PIPE вызывают любые попытки что-либо записать в модуль и есть подозрение, что я явно что-то делаю не так...
|
|
|
Re: E502 + Python
При использовании libusb1 напрямую, та же петрушка: чтение работает, запись - нет. #include <libusb-1.0/libusb.h>
#include <iostream>
using namespace std;
int main () {
auto printData = []( unsigned char * pData, const unsigned int & size ) {
cout << "Data: ";
for ( int i = 0; i < size; ++i ) cout << " " << (unsigned)pData[i] << " ";
cout << endl; };
libusb_context * ctx;
libusb_init( &ctx );
libusb_device_handle * dev_handle;
dev_handle = libusb_open_device_with_vid_pid( ctx, 0x2A52, 0xE502 );
unsigned char data [4] = {0,0,0,0};
cout << libusb_control_transfer( dev_handle, 0x60, 0x11, 0x314, 0, &data[0], 4, 0 ) << endl; // -9
cout << libusb_control_transfer( dev_handle, 0xC0, 0x81, 0, 0, &data[0], 1, 0 ) << endl; // 1
printData( &data[0], 4 ); // 2
libusb_exit( ctx );
return 0;
}
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
Добрый день. В качестве requestType у Вас при записи используется 0x60, что соответствует резервному типу (3 << 5), хотя должно быть 0x40 (2 << 5 - vendor request). Запрос handle.controlWrite( 0x40, 0x11, 0x200+0x114, 0, pack( "I", 1) ) исключения не выдает.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
При этом: handle.controlWrite( 0x40, 0x11, 0x200+0x114, 0, pack( "I", 0) ) - светодиод LED1 гаснет handle.controlWrite( 0x40, 0x11, 0x200+0x114, 0, pack( "I", 1) ) - светодиод LED1 горит Светодиод LED2 указывает активность по usb. Соответственно он кратковременно мигает, когда модуль принимает USB запрос. Когда посылали запрос типа Reserved он приходил устройству, оно его принимало (мигание LED2) и возвращало на него ошибку, указывая, что такие запросы не поддерживаются, и соответственно libusb возвращал LIBUSB_ERROR_PIPE
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
Правда мне кажется проще написать обертку под python для e502api (хотя у меня самого опыта такого нет, но вроде одним из преимуществ python является относительно простая интеграция с С-библиотеками), чем реализовывать все ее функции поверх libusb....
|
|
|
Re: E502 + Python
Алексей L Card пишет:Добрый день. В качестве requestType у Вас при записи используется 0x60, что соответствует резервному типу (3 << 5), хотя должно быть 0x40 (2 << 5 - vendor request). Запрос handle.controlWrite( 0x40, 0x11, 0x200+0x114, 0, pack( "I", 1) ) исключения не выдает.
Да, действительно. Просто не пришло в голову перепроверить по спецификации USB фразу из документации на модуль: в поле bmRequestType указывается направления передачи блока данных, тип запроса всегда Vendor, приемником всегда выступает устройство (Device). Т.е. код 0x60 при передаче данных в модуль и 0xC0 при приеме из модуля.
Алексей L Card пишет:Правда мне кажется проще написать обертку под python для e502api (хотя у меня самого опыта такого нет, но вроде одним из преимуществ python является относительно простая интеграция с С-библиотеками), чем реализовывать все ее функции поверх libusb....
Проще - это если бы обертка уже была написана А раз писать мне самому, то уж лучше сделать под свои задачи на низком уровне, чем делать прослойку на прослойку, а потом все равно окажется, что e502api меня чем-то не устраивает и все нужно переделать. В любом случае, спасибо за ответ)
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
asdf пишет:Просто не пришло в голову перепроверить по спецификации USB фразу из документации на модуль
Да, действительно... спасибо, что указали. Документ поправим...
|
|
- Участник
- Откуда: Мурманск
- Здесь с 24.11.2018
- Сообщений: 59
|
Re: E502 + Python
asdf пишет:Правда мне кажется проще написать обертку под python для e502api (хотя у меня самого опыта такого нет, но вроде одним из преимуществ python является относительно простая интеграция с С-библиотеками), чем реализовывать все ее функции поверх libusb....
В свое время делал такую обертку. Иногда использую ее для тестов и для каких-нибудь быстрых демок. asdf пишет:А раз писать мне самому, то уж лучше сделать под свои задачи на низком уровне
Низкий уровень на python - звучит странно. Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных. Правда я не изучал как там льются данные по USB - работаю с АЦП по Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.
|
|
|
Re: E502 + Python
Алексей L Card пишет:Да, действительно... спасибо, что указали. Документ поправим...
Если соберетесь, то и про обращение к Flash-памяти поправьте, пожалуйста, потому что из фразы "Параметр команды: Адрес во Flash-памяти, соответствующий началу блока" вообще не очевидно, что этот адрес должен в wIndex находиться, а не в wValue, как при обращении к регистрам ПЛИС. Всю голову сломал, почему у меня по всей флешке 0xFF, пока про wireshark не вспомнил) Кстати, а что такое bRequest 0x25 и 0x42? В документации про это, вроде, ни слова, но E502 на них отвечает.
|
|
|
Re: E502 + Python
Евгений Рогожкин пишет:Низкий уровень на python - звучит странно. Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных. Правда я не изучал как там льются данные по USB - работаю с АЦП по Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.
Да, я думал про производительность питона на этапе проектирования системы и все, что требует хоть какой-то частоты дискретизации, висит на отдельном микроконтроллере (который управляется по JTAG из той же программы на питоне). E502 мне только для калибровки нужен - там и 100Гц хватит. Но все равно, спасибо, что предупредили.
|
|
|
Re: E502 + Python
asdf пишет:Алексей L Card пишет:Да, действительно... спасибо, что указали. Документ поправим...
Если соберетесь, то и про обращение к Flash-памяти поправьте, пожалуйста, потому что из фразы "Параметр команды: Адрес во Flash-памяти, соответствующий началу блока" вообще не очевидно, что этот адрес должен в wIndex находиться, а не в wValue, как при обращении к регистрам ПЛИС. Всю голову сломал, почему у меня по всей флешке 0xFF, пока про wireshark не вспомнил)
Вопрос про флешку снимается - уже сам понял, что ступил
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
Евгений Рогожкин пишет:Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется.
Протокол верхнего уровня одинаковый для обоих интерфейсов, включая поток данных. asdf пишет:Кстати, а что такое bRequest 0x25 и 0x42
Тогда проверю наличие всех кодов команд в описании при обновлении. Видимо несколько вспомогательных команд не попало в описание Запрос 0x42 - это проверка статуса работы тестового наладочного режима (не предназначен для пользователей) - при открытии соединения проверяется, что модуль не находится в нем. Запрос 0x25 - это получение доп. флагов с информацией о устройстве - признак наличия ethernet, индустриального исполнения и признак наличия и успешной загрузки прошивки FPGA.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
из не попавших еще команда принудительной перезагрузки прошивки ПЛИС (как раз из соседней темы...) и чтение/запись сетевых настроек.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: E502 + Python
Обновил документацию (исправил указанную ошибку и добавил коды недостающих команд)
|
|
- Участник
- Здесь с 15.07.2017
- Сообщений: 5
|
Re: E502 + Python
Евгений Рогожкин пишет:Низкий уровень на python - звучит странно. Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных. Правда я не изучал как там льются данные по USB - работаю с АЦП по Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.
При использовании numpy и deque нет проблем с обработкой потока с АЦП e14-140 на максимальной частоте (200 кГц), с одновременной отрисовкой графиков. И все на не самом мощном ноутбуке. Так что сделать обработку на python в принципе возможно.
|
|
- Участник
- Здесь с 01.07.2022
- Сообщений: 1
|
Re: E502 + Python
Добрый день. Пытаюсь присоединиться к e502 из Raspbian 10 с помощью встроенного Python'а. Библиотеки попробовал взять отсюда:https://build.opensuse.org/package/show/home:l-card/x502studio. E502_UsbGetDevRecordsList, X502_Create, X502_OpenByDevRecord отрабатывают успешно. Но все попытки сконфигурировать E502 приводят к прекращению коммуникациии без какой-либо диагностики. Что бы вы посоветовали?
|
|
- Участник
- Здесь с 31.10.2022
- Сообщений: 1
|
Re: E502 + Python
Сергей 84 пишет:Евгений Рогожкин пишет:Низкий уровень на python - звучит странно. Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных. Правда я не изучал как там льются данные по USB - работаю с АЦП по Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.
При использовании numpy и deque нет проблем с обработкой потока с АЦП e14-140 на максимальной частоте (200 кГц), с одновременной отрисовкой графиков. И все на не самом мощном ноутбуке. Так что сделать обработку на python в принципе возможно.
Добрый день, Сергей. Расскажите, пожалуйста, какие версии библиотек lcomp/lusbapi использовали, выкладывали ли что-нибудь на github?
|