Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » USB в STM32F0


USB в STM32F0

Сообщений 31 страница 60 из 62

31

sobs написал(а):

Изменить дескриптор репорта. Поля

Нельзя сделать больше 8.  На устройстве гаснет светодиод  передача рвется.

32

Нельзя сделать больше 8.  На устройстве гаснет светодиод  передача рвется.

Можно, тут дело в том, что программа на ПК должна принимать строго такой же формат посылки. Например ты укажешь report_size(16) вместо 8, и у тебя посылка станет длиннее. Из-за этого может отвалиться. Потом проверю на деле, просто платка на работе осталась.

33

dosikus, посмотри в DDS_Generator_STM32_v0.5 дескриптор репорта, там как раз есть
0x75, 0x20,                    //   REPORT_SIZE (32)
0x95, 0x01,                    //   REPORT_COUNT (1)

Отредактировано sobs (2017-08-05 16:09:01)

34

sobs написал(а):

dosikus, посмотри в DDS_Generator_STM32_v0.5 дескриптор репорта, там как раз есть
0x75, 0x20,                    //   REPORT_SIZE (32)
0x95, 0x01,                    //   REPORT_COUNT (1)

А вот именно в термометре не хотит никак .
Если я ставлю отправку больше 4 здесь, устройство просто отваливается

Код:
EP_Write(1, tx_buffer,4);

35

dosikus написал(а):

А вот именно в термометре не хотит никак .
Если я ставлю отправку больше 4 здесь, устройство просто отваливается
Код:

EP_Write(1, tx_buffer,4);

Попробуй одновременно в программе для ПК измени, если не получится, то в понедельник сам проверю.

Код:
...
//Читаем данные из EP1_IN (0x81), 4 байта (1 - ID, 3 - данные), ожидание 100мс
if (libusb_interrupt_transfer(USB_Device, 0x81, buf, [b]4[/b], &ret, 100) >= 0){
...

36

sobs написал(а):

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

Я извиняюсь , не смотрел?

37

dosikus написал(а):

Я извиняюсь , не смотрел?

Нет, подумал у тебя все пошло, раз ничего не написал. Тогда завтра в любом случае посмотрю. К слову, компилировал в 2008 студии Express Edition, она у меня летает, по сравнению с кокосом - вообще флеш)

38

sobs, пробовал то же самое .

sobs написал(а):

К слову, компилировал в 2008 студии Express Edition, она у меня летает, по сравнению с кокосом - вообще флеш)

Попробуй все таки SES.
Кстати вышел новый IAR , многие будут удивлены. Причем не все приятно... :)))))

http://s018.radikal.ru/i500/1708/a3/7d634a543168.png

39

dosikus написал(а):

Попробуй все таки SES.
Кстати вышел новый IAR , многие будут удивлены. Причем не все приятно... :)))))

На SES пока не перешел, потому что st-link не поддерживает. Видел что перепрошивают его в j-link, но сам пока не пробовал. Надо будет заморочится.
А иаром пользовался только для stm8. Жутко неудобная иде)

40

sobs написал(а):

А иаром пользовался только для stm8. Жутко неудобная иде)

Он теперь и под STM8 и под AVR такой же как на моем скрине, а ты наверное еще старый пробовал.
В Jlink превращается любой STlink за 5 сек. Обратимо...

41

Перенес посты сюда Jlink вопросы

42

dosikus написал(а):

Я извиняюсь , не смотрел?

Посмотрел, работает. Вот тут 2 варианта Ссылка, для REPORT_SIZE(16), REPORT_COUNT(2) и REPORT_SIZE(8), REPORT_COUNT(5). Тут главное чтобы количество отправляемых и принимаемых байт соответствовало репорту.
P.S. Чтобы не подключать датчик сделал просто инкремент переменной.

dosikus написал(а):

Нельзя сделать больше 8.  На устройстве гаснет светодиод  передача рвется.

Странно, у меня при несоответствии репортов, светодиод не гаснет, просто данные в программе не отображаются.

Отредактировано sobs (2017-08-08 08:59:12)

43

sobs, да эти примеры заработали, по крайней мере Термометр REPORT_SIZE16, REPORT_COUNT2 заработал.
Буду рыть свои косяки.
Прогу под win пришлось перекомпилировать, падала хз почему. Наверное снова из-за того что у мну 64.

44

dosikus написал(а):

Прогу под win пришлось перекомпилировать, падала хз почему. Наверное снова из-за того что у мну 64.

Да, компилировал в 32-битной.
Я кроме размеров массивов, дескриптора репорта и количества отправляемых байт ничего не менял.

45

sobs, я болван. REPORT_SIZE и REPORT_COUNT  путал . Надо было читать...
Верно  ли понимаю :
REPORT_SIZE размерность посылок 8 или 16 бит
REPORT_COUNT счетчик посылок

46

dosikus написал(а):

Верно  ли понимаю :
REPORT_SIZE размерность посылок 8 или 16 бит
REPORT_COUNT счетчик посылок

Это размер и количество данных. Например тебе надо передать 4 значения температур. Пусть температура передается 16 битным числом. Тогда REPORT_SIZE (16) - размер данных 16 бит и REPORT_COUNT (4) - количество данных, размера REPORT_SIZE (16).
Но для своих устройств это можно не соблюдать, например указав REPORT_SIZE (8) и REPORT_COUNT (8) придет ровно такой же пакет (те же 4 температуры), зато это может быть существенно для всяких мышек и клавиатур.

47

vt340, вопрос - почему
первый вызов libusb_bulk_transfer

Код:
libusb_bulk_transfer (devh, IEP, ibuf, 64, &inum, 100);

изредка возвращает ошибки  -1 -7 -9 ?

LIBUSB_ERROR_IO = -1,
LIBUSB_ERROR_TIMEOUT = -7,
LIBUSB_ERROR_PIPE = -9,

А  в основном -9...

И вАААще -для чего этот первый вызов? Костыль?

48

В моём примере не возвращает, я проверяю прежде чем публиковать, хотя не все возможные ситуации конечно, не 100% гарантия
Если ты что-то менял для хоста или девайса, то не знаю, надо разбираться
Зачем первый вызов? Убери - увидишь )

Если всё-таки с моим примером проблемы, то попробуй для девайса изменить цикл с echo на просто

Код:
for (;;) {      
    USBPoll();  
    USBPut(buf);
    USBGet(buf);
}

Отредактировано vt340 (2017-08-09 15:59:05)

49

vt340, не, я использую твой пример для PC с примером sobs (HID5) ...

50

Тогда выкидывай этот первый вызов
Он там нужен был чтоб вывод на экран был красивый
aaa aaa
bbb bbb
ccc ccc

а не
aaa хзч
bbb aaa
ccc bbb

51

vt340 написал(а):

Он там нужен был чтоб вывод на экран был красивый

Выкинул, без него :
aaa aaa
bbb bbb
ccc ccc

Зато пропали PIPE_RESET

Мля в Сишной версии начало трансфера:

00002444 2017-08-09 16:59:28,4828962 +0,0001343 UP 0xc0000004 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002445 2017-08-09 16:59:28,4829094 +0,0000132 DOWN 0x00000000 URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
00002446 2017-08-09 16:59:28,4835128 +0,0006034 UP 0x00000000 URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
00002447 2017-08-09 16:59:28,4835718 +0,0000590 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002450 2017-08-09 16:59:28,4841346 +0,0002848 UP 0xc0000004 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002451 2017-08-09 16:59:28,4841594 +0,0000248 DOWN 0x00000000 URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
00002452 2017-08-09 16:59:28,4848868 +0,0007274 UP 0x00000000 URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
00002453 2017-08-09 16:59:28,4849749 +0,0000881 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER

В барсиковой все чисто, куда рыть?

00002553 2017-08-09 17:01:10,2019277 +101,6992450 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002556 2017-08-09 17:01:10,2025097 +0,0002630 UP 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002557 2017-08-09 17:01:10,2026423 +0,0001326 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002560 2017-08-09 17:01:10,2031306 +0,0001449 UP 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002561 2017-08-09 17:01:10,2032067 +0,0000761 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002564 2017-08-09 17:01:10,2036301 +0,0001569 UP 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002565 2017-08-09 17:01:10,2037182 +0,0000881 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002568 2017-08-09 17:01:10,2041291 +0,0001625 UP 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002569 2017-08-09 17:01:10,2042206 +0,0000915 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002572 2017-08-09 17:01:10,2046299 +0,0001664 UP 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
00002573 2017-08-09 17:01:10,2047227 +0,0000928 DOWN 0x00000000 URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER

52

Причем в Си выхлоп в консоль
0 64:aaa 0:aaa
1 64:bbb 64:bbb

первый inum =0

И в барсике

0 64 aaa 64 aaa
1 64 bbb 64 bbb
2 64 ccc 64 ccc

53

Мужики, CDC на STM32F042 не делали?
Попробовал пример HID от sobs, работает. Но нужен CDC. Смотрю — а там лопатить и лопатить...

54

Eddy_Em написал(а):

Мужики, CDC на STM32F042 не делали?
Попробовал пример HID от sobs, работает. Но нужен CDC. Смотрю — а там лопатить и лопатить...

До CDC пока руки не дошли.

55

Eddy_Em написал(а):

лопатить и лопатить...

Хм, так главное же Идеи и Сниппеты, и каждый сам себе Художник, так что лопатить - это судьба )

56

На основе кода HID от sobs сделал вот такой эмулятор PL2303. Основу я сделал уже давно, но вот более-менее допилил только сегодня. И то, маленький косячок остался. Но вроде бы проблем он не создает.
Следующим шагом хочу HID так же причесать и сделать эмулятор мыши+клавиатуры. Пригодится, возможно. В любом случае, эмулятор мыши и/или клавиатуры нужен значительно больше, нежели "безымянный" HID, от которого толку 0.

57

Eddy_Em написал(а):

сделал вот такой эмулятор PL2303.

Вот этот кусочек можешь пояснить? Что это за запросы?

Код:
void WEAK vendor_handler(config_pack_t *packet){
    if(packet->bmRequestType & 0x80){ // read
        //SEND("Read");
        uint8_t c;
        switch(packet->wValue){
            case 0x8484:
                c = 2;
            break;
            case 0x0080:
                c = 1;
            break;
            case 0x8686:
                c = 0xaa;
            break;
            default:
                c = 0;
        }
        EP_WriteIRQ(0, &c, 1);
    }else{ // write ZLP
        //SEND("Write");
        EP_WriteIRQ(0, (uint8_t *)0, 0);

И ещё
Раз оно не cdc, а vendor specific, то вот это вот для него по идее не обязательно, можно ли это выкинуть? Будет без этого работать?

Код:
            case CONTROL_REQUEST_TYPE:
                switch(setup_packet.bRequest){
                    case GET_LINE_CODING:
                        EP_WriteIRQ(0, (uint8_t*)&lineCoding, sizeof(lineCoding));
                    break;
                    case SET_LINE_CODING: // omit this for next stage, when data will come
                    break;
                    case SET_CONTROL_LINE_STATE:
                        clstate_handler(setup_packet.wValue);
                    break;
                    case SEND_BREAK:
                        break_handler();
                    break;
                    default:
                        WRITEDUMP("undef control req");
                }

58

Нет, там вендоровские запросы по сути нихрена полезного не делают: в модуле ядра вообще даже не проверяется, что на них отвечает pl2303!
Поэтому кусок с CONTROL_REQUEST_TYPE выкинуть нельзя: он отвечает за скорость и состояние линии.
Это в дебильном ch340 ничего такого нет: там тупо вендор-запросами все рулится! Поэтому я и передумал делать его эмулятор - уж совсем оно далеко от CDC.

59

Вот блин! Что-то лыжи не едут: пытаюсь сделать HID (клавиатура+мышь), но дальше запроса SET_IDLE_REQUEST ничего нет.. Сейчас wireshark поставлю (что-то он у меня кривой какой-то был, без gui), попробую посмотреть им, что там компьютер посылает. В код на МК натыкал уйму отладки, но ничего... А dmesg вот что говорит:

Код:
[1823060.936789] usbhid 1-1.2:1.0: can't add hid device: -32
[1823060.936793] usbhid: probe of 1-1.2:1.0 failed with error -32

60

Нашел проблему - это был мой косяк.
Теперь вопрос: как передать почти 120-байтный HID_ReportDescriptor? wireshark пишет ошибку:

Код:
URB status: Value too large for defined data type (-EOVERFLOW) (-75)

буду гуглить


Вы здесь » Микроконтроллеры » Архив » USB в STM32F0