Спасибо за помощь. Оказалось, что проблема и правда в юарте: у меня почему-то не отправляются (или не принимаются в консоль) байты 0x11, 0x12, 0x13. Буду сейчас для начала с этим пытаться разобраться
Здравствуйте. Теперь столкнулся с такой проблемой - получаю URB_interrupt in запросы от хоста на первую оконечную точку после того, как передал дескриптор репорта, но все ответы (девайс -> хост) имеют статус USBD_STATUS_XACT_ERROR (смотрю через WIRESHARK), хотя я даже не могу получить прерывание по ней. Все дескрипторы для клавиатуры брал вот отсюда https://www.usb.org/sites/default/files/hid1_11.pdf стр. 66 с небольшими изменениями, чтобы убрать один интерфейс под мышь. В системе устройство определяется корректно. В прикрепленном файле - скрин логов wireshark. Пробовал использовать разные оконечные точки для прерываний, двигать btable, но ничего не изменилось. Есть ли какой совет, что в такой ситуации делать? Спасибо
Я понимаю, что хост сам забирает данные, но чтобы микроконтроллер передал их, мне же все равно нужно разрешить передачу. На данный момент - после того как я передал дескриптор репорта и обработал сет репорт - я заполняю буффер данных передачи для первой точки репортом, в btable указываю размер передаваемых данных и устанавливаю тип точки - interrupt. Затем разрешаю передачу данных для этой точки. Как я понимаю, теперь когда хост пошлет interrupt запрос, то устройство должно будет отправить данные из буфера. Но в итоге передать данные у меня не получается. Что касательного Вашего примера, то что делает функция WriteEP? Просто заполняет PMA?
Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.
WriteEP делает всё то же самое что и при отправке дескрипторов, только в 1-ю точку. Пишет в буфер, указывает длину и ставит статус TX_VALID. После этого хост сам всё заберёт.
Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.
Видимо где-то из-за невнимательности не могу найти ошибку, потому что сделал все как и при отправке дескрипторов, но почему-то данные из первой точки не уходят.
В общем вот весь код. Немного изменил, чтобы основную часть перенести в main файл. Инициализация первой оконечной точки после ресета происходит на 298 и 301 строках.
Добавлено after 2 hours 53 minutes 18 seconds: Забыл в коде указать COUNT_TX для первой точки, но если указать, то все равно не работает
"Я продираться через такое количество мэджикнамберсов не буду. Сравните как можно даже дескрипторы понятно описать." Опыта программирования у меня не так уж и много. Век живи - век учись, как говорится.
"А за такое вообще увольнять без выходного пособия. Что записано в регистр? Какой бит ожидается?" В регистре прием и передача находятся в состоянии nak, когда я записываю единицу, то перевожу передачу в состояние valid. Поскольку в мануале не рекомендуют чтение + запись, то я методом подбора нашел такое значение, чтобы корректно передавать данные. Далее жду пока устройство не переключит флаг в состояние корректной передачи.
"И собственно главный вопрос. В какой строке вы репорт отправляете?" Я пытаюсь его отправить только один раз. В строке 298 ( write_pma(&[0xc0, 0x00, report_size, 0x00, 0x00, 0x01, 0x00, 0x84], ; ), где я указываю размер репорта и в строке 301, когда я разрешаю передачу данных. Если я правильно понимаю, то в следующий раз, когда хост запросит данные из первой точки, устройство уже будет готово их отдать (поскольку я не записал в буфер отправки никакие значения, то отправятся все нули), но ничего не отправляется.
"В обработчике ресета? До прохождения энумерации?" Получается, что да. Я думал, что можно в самом начале настроить контрольную точку, а когда хосту понадобится данные, то она уже будет готова их отдать. Просто по control sequence я достаточно много источников информации нашел, а вот что делать после пытался уже сам догадаться.
Что делать дальше зависит от реализуемого класса. Тут творчески надо подойти. В случае с HID самое сложное правильный Report Descriptor сделать и формат репортов чтобы соответсвовал дескриптору. А так то передавать данные легко.
Перенес код инициализации первой точки в место перед отправкой дескриптора отчета. Вот что получилось
Код:
write_pma(&[0xc0], 8); // Пишу по адресу 0x4000_6000 + 8 * 2 значение 0xc0 - оффсет буфера передачи для первой оконечной точки write_pma(&report, 192); // Заполняю буфер передачи репортом write_pma(&[report.len() as u8], 10); // Пишу по адресу 0x4000_6000 + 10 * 2 размер передаваемых данных usb.ep1r.write(0x0630); // Разрешаю передачу данных для первой оконечной точки, устанавливая STAT_TX в valid
Но отправить данные из этой точки все равно не получается. Всё та же XACT ERROR. Если инициализировать точку после отправки репорта, то ничего не меняется. И еще такой вопрос: через некоторое время после того, как устройству не удалось отправить ответ на interrupt, host начинает снова запрашивать дескриптор устройства. Так и должно быть, или это связано с неправильной энумерацией?
Карма: 25
Рейтинг сообщений: 641
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2641 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Если хост видит, что девайс общается не по этикету, он пошлет его сбросом и начнет все заново (до трех раз). Если все нормально, дескриптор устройства запрашивается два раза, сначала только его кусок, потом полностью. Да, когда приходит команда установить адрес девайса, надо ответить ZLP как от безадресного устройства и только потом установить адрес. Это я сходу что вспомнил, надеюсь правильно. С 107 МК я чето пока подзавязал разбираться,а со 103 давно делал. Кстати, в этой же теме разбирались как у 103 USB робит , Kellya, Вы читали этот топик полностью? Тут вроде все про 103 и USB разжёвано и как раз на любительском уровне, по мере появления времени и желания ковырялись с коллегами.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
"Вы читали этот топик полностью?" Да, с этого и начинал, мне очень помогло - получилось сделать так, чтобы устройство корректно отображалось в диспетчере устройств. Но для этого достаточно работы с нулевой точкой, а вот что делать с точкой interrupt in, я так и не разобрался, может быть невнимательно все прочитал. Хотя вроде бы настраиваю её аналогично нулевой точке
Карма: 25
Рейтинг сообщений: 641
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2641 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Я помню, что interrupt у меня что-то получилось, но потом понял что мне хватает для общения устройства типа HID через "фьючи" более чем. ISX себе CDC забубекал. Что у меня с interrupt было, точно не помню, но хост регулярно запросы слал (т.е. работало). Вроде с конфигурировать не сложно было, может есть тут в теме? И еще где-то есть ссылка (наверное в начале топика) на параллельную тему, может там что есть А я стал общаться с девайсом через фьючи, потому что мне так проще оказалось приложение под винду написать для обмена.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
"Что у меня с interrupt было, точно не помню, но хост регулярно запросы слал" Вот, у меня тоже хост шлет регулярно запросы к первой точке, но корректно ответить на них у меня почему-то (не разобрался) не получается. Пробую клавиатуру написать, если это как-то важно
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения