Изменить дескриптор репорта. Поля
Нельзя сделать больше 8. На устройстве гаснет светодиод передача рвется.
Микроконтроллеры |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Микроконтроллеры » Архив » USB в STM32F0
Изменить дескриптор репорта. Поля
Нельзя сделать больше 8. На устройстве гаснет светодиод передача рвется.
Нельзя сделать больше 8. На устройстве гаснет светодиод передача рвется.
Можно, тут дело в том, что программа на ПК должна принимать строго такой же формат посылки. Например ты укажешь report_size(16) вместо 8, и у тебя посылка станет длиннее. Из-за этого может отвалиться. Потом проверю на деле, просто платка на работе осталась.
dosikus, посмотри в DDS_Generator_STM32_v0.5 дескриптор репорта, там как раз есть
0x75, 0x20, // REPORT_SIZE (32)
0x95, 0x01, // REPORT_COUNT (1)
Отредактировано sobs (2017-08-05 16:09:01)
dosikus, посмотри в DDS_Generator_STM32_v0.5 дескриптор репорта, там как раз есть
0x75, 0x20, // REPORT_SIZE (32)
0x95, 0x01, // REPORT_COUNT (1)
А вот именно в термометре не хотит никак .
Если я ставлю отправку больше 4 здесь, устройство просто отваливается
EP_Write(1, tx_buffer,4);
А вот именно в термометре не хотит никак .
Если я ставлю отправку больше 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){ ...
если не получится, то в понедельник сам проверю.
Я извиняюсь , не смотрел?
Я извиняюсь , не смотрел?
Нет, подумал у тебя все пошло, раз ничего не написал. Тогда завтра в любом случае посмотрю. К слову, компилировал в 2008 студии Express Edition, она у меня летает, по сравнению с кокосом - вообще флеш)
Попробуй все таки SES.
Кстати вышел новый IAR , многие будут удивлены. Причем не все приятно... ))))
На SES пока не перешел, потому что st-link не поддерживает. Видел что перепрошивают его в j-link, но сам пока не пробовал. Надо будет заморочится.
А иаром пользовался только для stm8. Жутко неудобная иде)
А иаром пользовался только для stm8. Жутко неудобная иде)
Он теперь и под STM8 и под AVR такой же как на моем скрине, а ты наверное еще старый пробовал.
В Jlink превращается любой STlink за 5 сек. Обратимо...
Перенес посты сюда Jlink вопросы
Я извиняюсь , не смотрел?
Посмотрел, работает. Вот тут 2 варианта Ссылка, для REPORT_SIZE(16), REPORT_COUNT(2) и REPORT_SIZE(8), REPORT_COUNT(5). Тут главное чтобы количество отправляемых и принимаемых байт соответствовало репорту.
P.S. Чтобы не подключать датчик сделал просто инкремент переменной.
Нельзя сделать больше 8. На устройстве гаснет светодиод передача рвется.
Странно, у меня при несоответствии репортов, светодиод не гаснет, просто данные в программе не отображаются.
Отредактировано sobs (2017-08-08 08:59:12)
sobs, да эти примеры заработали, по крайней мере Термометр REPORT_SIZE16, REPORT_COUNT2 заработал.
Буду рыть свои косяки.
Прогу под win пришлось перекомпилировать, падала хз почему. Наверное снова из-за того что у мну 64.
Прогу под win пришлось перекомпилировать, падала хз почему. Наверное снова из-за того что у мну 64.
Да, компилировал в 32-битной.
Я кроме размеров массивов, дескриптора репорта и количества отправляемых байт ничего не менял.
sobs, я болван. REPORT_SIZE и REPORT_COUNT путал . Надо было читать...
Верно ли понимаю :
REPORT_SIZE размерность посылок 8 или 16 бит
REPORT_COUNT счетчик посылок
Верно ли понимаю :
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 температуры), зато это может быть существенно для всяких мышек и клавиатур.
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...
И вАААще -для чего этот первый вызов? Костыль?
В моём примере не возвращает, я проверяю прежде чем публиковать, хотя не все возможные ситуации конечно, не 100% гарантия
Если ты что-то менял для хоста или девайса, то не знаю, надо разбираться
Зачем первый вызов? Убери - увидишь )
Если всё-таки с моим примером проблемы, то попробуй для девайса изменить цикл с echo на просто
for (;;) { USBPoll(); USBPut(buf); USBGet(buf); }
Отредактировано vt340 (2017-08-09 15:59:05)
vt340, не, я использую твой пример для PC с примером sobs (HID5) ...
Тогда выкидывай этот первый вызов
Он там нужен был чтоб вывод на экран был красивый
aaa aaa
bbb bbb
ccc ccc
а не
aaa хзч
bbb aaa
ccc bbb
Он там нужен был чтоб вывод на экран был красивый
Выкинул, без него :
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
Причем в Си выхлоп в консоль
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
Мужики, CDC на STM32F042 не делали?
Попробовал пример HID от sobs, работает. Но нужен CDC. Смотрю — а там лопатить и лопатить...
Мужики, CDC на STM32F042 не делали?
Попробовал пример HID от sobs, работает. Но нужен CDC. Смотрю — а там лопатить и лопатить...
До CDC пока руки не дошли.
лопатить и лопатить...
Хм, так главное же Идеи и Сниппеты, и каждый сам себе Художник, так что лопатить - это судьба )
На основе кода HID от sobs сделал вот такой эмулятор PL2303. Основу я сделал уже давно, но вот более-менее допилил только сегодня. И то, маленький косячок остался. Но вроде бы проблем он не создает.
Следующим шагом хочу HID так же причесать и сделать эмулятор мыши+клавиатуры. Пригодится, возможно. В любом случае, эмулятор мыши и/или клавиатуры нужен значительно больше, нежели "безымянный" HID, от которого толку 0.
сделал вот такой эмулятор 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"); }
Нет, там вендоровские запросы по сути нихрена полезного не делают: в модуле ядра вообще даже не проверяется, что на них отвечает pl2303!
Поэтому кусок с CONTROL_REQUEST_TYPE выкинуть нельзя: он отвечает за скорость и состояние линии.
Это в дебильном ch340 ничего такого нет: там тупо вендор-запросами все рулится! Поэтому я и передумал делать его эмулятор - уж совсем оно далеко от CDC.
Вот блин! Что-то лыжи не едут: пытаюсь сделать 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
Нашел проблему - это был мой косяк.
Теперь вопрос: как передать почти 120-байтный HID_ReportDescriptor? wireshark пишет ошибку:
URB status: Value too large for defined data type (-EOVERFLOW) (-75)
буду гуглить
Вы здесь » Микроконтроллеры » Архив » USB в STM32F0