Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

E502 + Python

Вы не вошли.

 Поиск | Регистрация | Вход 

asdf
17.12.2019 16:30:32
#1

Гость

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 вызывают любые попытки что-либо записать в модуль и есть подозрение, что я явно что-то делаю не так...

asdf
18.12.2019 17:01:15
#2

Гость

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;
}
18.12.2019 17:37:44
#3

Сотрудник "Л Кард"
Здесь с 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) ) исключения не выдает.

18.12.2019 17:43:38
#4

Сотрудник "Л Кард"
Здесь с 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

18.12.2019 18:11:17
#5

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,292

Re: E502 + Python

Правда мне кажется проще написать обертку под python для e502api (хотя у меня самого опыта такого нет, но вроде одним из преимуществ python является относительно простая интеграция с С-библиотеками), чем реализовывать все ее функции поверх libusb....

asdf
19.12.2019 09:29:42
#6

Гость

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....

Проще - это если бы обертка уже была написана smile А раз писать мне самому, то уж лучше сделать под свои задачи на низком уровне, чем делать прослойку на прослойку, а потом все равно окажется, что e502api меня чем-то не устраивает и все нужно переделать.

В любом случае, спасибо за ответ)

19.12.2019 09:37:50
#7

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,292

Re: E502 + Python

asdf пишет:

Просто не пришло в голову перепроверить по спецификации USB фразу из документации на модуль

Да, действительно... спасибо, что указали. Документ поправим...

19.12.2019 14:03:52
#8

Участник
Откуда: Мурманск
Здесь с 24.11.2018
Сообщений: 59

Re: E502 + Python

asdf пишет:

Правда мне кажется проще написать обертку под python для e502api (хотя у меня самого опыта такого нет, но вроде одним из преимуществ python является относительно простая интеграция с С-библиотеками), чем реализовывать все ее функции поверх libusb....

В свое время делал такую обертку. Иногда использую ее для тестов и для каких-нибудь быстрых демок.

asdf пишет:

А раз писать мне самому, то уж лучше сделать под свои задачи на низком уровне

Низкий уровень на python - звучит странно.
Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных.
Правда я не изучал как там льются данные по USB - работаю с АЦП по  Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.

asdf
19.12.2019 15:49:31
#9

Гость

Re: E502 + Python

Алексей L Card пишет:

Да, действительно... спасибо, что указали. Документ поправим...

Если соберетесь, то и про обращение к Flash-памяти поправьте, пожалуйста, потому что из фразы "Параметр команды: Адрес во Flash-памяти, соответствующий началу блока" вообще не очевидно, что этот адрес должен в wIndex находиться, а не в wValue, как при обращении к регистрам ПЛИС. Всю голову сломал, почему у меня по всей флешке 0xFF, пока про wireshark не вспомнил)
Кстати, а что такое bRequest 0x25 и 0x42? В документации про это, вроде, ни слова, но E502 на них отвечает.

asdf
19.12.2019 16:40:26
#10

Гость

Re: E502 + Python

Евгений Рогожкин пишет:

Низкий уровень на python - звучит странно.
Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных.
Правда я не изучал как там льются данные по USB - работаю с АЦП по  Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.

Да, я думал про производительность питона на этапе проектирования системы и все, что требует хоть какой-то частоты дискретизации, висит на отдельном микроконтроллере (который управляется по JTAG из той же программы на питоне). E502 мне только для калибровки нужен - там и 100Гц хватит. Но все равно, спасибо, что предупредили.

asdf
19.12.2019 16:55:30
#11

Гость

Re: E502 + Python

asdf пишет:
Алексей L Card пишет:

Да, действительно... спасибо, что указали. Документ поправим...

Если соберетесь, то и про обращение к Flash-памяти поправьте, пожалуйста, потому что из фразы "Параметр команды: Адрес во Flash-памяти, соответствующий началу блока" вообще не очевидно, что этот адрес должен в wIndex находиться, а не в wValue, как при обращении к регистрам ПЛИС. Всю голову сломал, почему у меня по всей флешке 0xFF, пока про wireshark не вспомнил)

Вопрос про флешку снимается - уже сам понял, что ступил

19.12.2019 19:30:33
#12

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,292

Re: E502 + Python

Евгений Рогожкин пишет:

Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется.

Протокол верхнего уровня одинаковый для обоих интерфейсов, включая поток данных.

asdf пишет:

Кстати, а что такое bRequest 0x25 и 0x42

Тогда проверю наличие всех кодов команд в описании при обновлении. Видимо несколько вспомогательных команд не попало в описание
Запрос 0x42 - это проверка статуса работы тестового наладочного режима (не предназначен для пользователей) - при открытии соединения проверяется, что модуль не находится в нем.
Запрос 0x25 - это получение доп. флагов с информацией о устройстве - признак наличия ethernet, индустриального исполнения и признак наличия и успешной загрузки прошивки FPGA.

19.12.2019 19:49:57
#13

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,292

Re: E502 + Python

из не попавших еще команда принудительной перезагрузки прошивки ПЛИС (как раз из соседней темы...) и чтение/запись сетевых настроек.

23.12.2019 21:44:22
#14

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,292

Re: E502 + Python

Обновил документацию (исправил указанную ошибку и добавил коды недостающих команд)

12.02.2020 13:48:16
#15

Участник
Здесь с 15.07.2017
Сообщений: 5

Re: E502 + Python

Евгений Рогожкин пишет:

Низкий уровень на python - звучит странно.
Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных.
Правда я не изучал как там льются данные по USB - работаю с АЦП по  Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.

При использовании numpy и deque нет проблем с обработкой потока с АЦП e14-140 на максимальной частоте (200 кГц), с одновременной отрисовкой графиков. И все на не самом мощном ноутбуке. Так что сделать обработку на python в принципе возможно.

07.07.2022 17:22:09
#16

Участник
Здесь с 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 приводят к прекращению коммуникациии без какой-либо диагностики. Что бы вы посоветовали?

Lev
31.10.2022 14:49:29
#17

Участник
Здесь с 31.10.2022
Сообщений: 1

Re: E502 + Python

Сергей 84 пишет:
Евгений Рогожкин пишет:

Низкий уровень на python - звучит странно.
Когда начнете получать данные с АЦП, если у вас частота дискретизации достаточно высокая или много каналов, то можете упереться в производительность питона при парсинге потока данных.
Правда я не изучал как там льются данные по USB - работаю с АЦП по  Ethernet, возможно вам и не придется ничего парсить. Но если данные льются упакованными так же как при передаче по Ethernet, то парсить придется. Рекомендую для получения массивов данных использовать массивы numpy, а не родные питоновские контейнеры.

При использовании numpy и deque нет проблем с обработкой потока с АЦП e14-140 на максимальной частоте (200 кГц), с одновременной отрисовкой графиков. И все на не самом мощном ноутбуке. Так что сделать обработку на python в принципе возможно.

Добрый день, Сергей. Расскажите, пожалуйста, какие версии библиотек lcomp/lusbapi использовали, выкладывали ли что-нибудь на github?

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск