Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 и USB (практика)

Вт авг 25, 2020 19:43:31

Спасибо за помощь. Оказалось, что проблема и правда в юарте: у меня почему-то не отправляются (или не принимаются в консоль) байты 0x11, 0x12, 0x13. Буду сейчас для начала с этим пытаться разобраться

Re: STM32 и USB (практика)

Пт сен 18, 2020 20:27:26

Здравствуйте.
Теперь столкнулся с такой проблемой - получаю URB_interrupt in запросы от хоста на первую оконечную точку после того, как передал дескриптор репорта, но все ответы (девайс -> хост) имеют статус USBD_STATUS_XACT_ERROR (смотрю через WIRESHARK), хотя я даже не могу получить прерывание по ней. Все дескрипторы для клавиатуры брал вот отсюда https://www.usb.org/sites/default/files/hid1_11.pdf стр. 66 с небольшими изменениями, чтобы убрать один интерфейс под мышь. В системе устройство определяется корректно. В прикрепленном файле - скрин логов wireshark. Пробовал использовать разные оконечные точки для прерываний, двигать btable, но ничего не изменилось. Есть ли какой совет, что в такой ситуации делать?
Спасибо
Вложения
Захват из USBPcap2.png
(82.67 KiB) Скачиваний: 150

Re: STM32 и USB (практика)

Сб сен 19, 2020 06:26:24

Продолжать курить как работает USB. Хост САМ забирает данные из конечных точек.

Вот код от простенького HID. По нажатию кнопки на плате переключается состояние светодиода. Состояние светодиода отображается на хосте.

Код:
Key key;

int main()
{
  uint8_t report[2]={5,0};  // Report ID 5
 
  for(;;)
  {   
    if(key.pressed())
    {
      report[1]=report[1]?0:1;
      if(report[1]) LED::On(); else LED::Off();
      usb.WriteEP<1>(report,sizeof(report));
    }
  }
}

Re: STM32 и USB (практика)

Сб сен 19, 2020 12:19:29

Я понимаю, что хост сам забирает данные, но чтобы микроконтроллер передал их, мне же все равно нужно разрешить передачу. На данный момент - после того как я передал дескриптор репорта и обработал сет репорт - я заполняю буффер данных передачи для первой точки репортом, в btable указываю размер передаваемых данных и устанавливаю тип точки - interrupt. Затем разрешаю передачу данных для этой точки. Как я понимаю, теперь когда хост пошлет interrupt запрос, то устройство должно будет отправить данные из буфера. Но в итоге передать данные у меня не получается. Что касательного Вашего примера, то что делает функция WriteEP? Просто заполняет PMA?

Re: STM32 и USB (практика)

Сб сен 19, 2020 18:09:14

WriteEP делает всё то же самое что и при отправке дескрипторов, только в 1-ю точку. Пишет в буфер, указывает длину и ставит статус TX_VALID. После этого хост сам всё заберёт.

Re: STM32 и USB (практика)

Сб сен 19, 2020 21:44:15

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

Re: STM32 и USB (практика)

Вс сен 20, 2020 00:01:08

Показывай инициализацию ep1 и функцию отправки.

Re: STM32 и USB (практика)

Вс сен 20, 2020 00:16:19

И дескриптор интерфейса.
Может в нем нет данных о точке или они некорректные.

Re: STM32 и USB (практика)

Вс сен 20, 2020 14:51:54

В общем вот весь код. Немного изменил, чтобы основную часть перенести в main файл. Инициализация первой оконечной точки после ресета происходит на 298 и 301 строках.

Добавлено after 2 hours 53 minutes 18 seconds:
Забыл в коде указать COUNT_TX для первой точки, но если указать, то все равно не работает
Вложения
main.txt
(11.52 KiB) Скачиваний: 120

Re: STM32 и USB (практика)

Вс сен 20, 2020 15:10:43

Хорошо, даже отлично, нет, просто замечательно! Что всё это не у меня :)

Я продираться через такое количество мэджикнамберсов не буду. Сравните как можно даже дескрипторы понятно описать.


А за такое вообще увольнять без выходного пособия. Что записано в регистр? Какой бит ожидается?
Код:
usb.ep0r.write(0x0210);
while usb.ep0r.get_bit(7) == 0 {};
Я в RM не полезу выяснять.

И собственно главный вопрос. В какой строке вы репорт отправляете?

Re: STM32 и USB (практика)

Вс сен 20, 2020 16:04:21

"Я продираться через такое количество мэджикнамберсов не буду. Сравните как можно даже дескрипторы понятно описать."
Опыта программирования у меня не так уж и много. Век живи - век учись, как говорится.

"А за такое вообще увольнять без выходного пособия. Что записано в регистр? Какой бит ожидается?"
В регистре прием и передача находятся в состоянии nak, когда я записываю единицу, то перевожу передачу в состояние valid. Поскольку в мануале не рекомендуют чтение + запись, то я методом подбора нашел такое значение, чтобы корректно передавать данные. Далее жду пока устройство не переключит флаг в состояние корректной передачи.

"И собственно главный вопрос. В какой строке вы репорт отправляете?"
Я пытаюсь его отправить только один раз. В строке 298 ( write_pma(&[0xc0, 0x00, report_size, 0x00, 0x00, 0x01, 0x00, 0x84], 8); ), где я указываю размер репорта и в строке 301, когда я разрешаю передачу данных. Если я правильно понимаю, то в следующий раз, когда хост запросит данные из первой точки, устройство уже будет готово их отдать (поскольку я не записал в буфер отправки никакие значения, то отправятся все нули), но ничего не отправляется.

Re: STM32 и USB (практика)

Вс сен 20, 2020 16:25:11

Я пытаюсь его отправить только один раз.
В обработчике ресета? До прохождения энумерации?

Re: STM32 и USB (практика)

Вс сен 20, 2020 16:54:33

"В обработчике ресета? До прохождения энумерации?"
Получается, что да. Я думал, что можно в самом начале настроить контрольную точку, а когда хосту понадобится данные, то она уже будет готова их отдать. Просто по control sequence я достаточно много источников информации нашел, а вот что делать после пытался уже сам догадаться.

Re: STM32 и USB (практика)

Вс сен 20, 2020 20:20:42

Что делать дальше зависит от реализуемого класса. Тут творчески надо подойти. В случае с HID самое сложное правильный Report Descriptor сделать и формат репортов чтобы соответсвовал дескриптору. А так то передавать данные легко.

Re: STM32 и USB (практика)

Вс сен 27, 2020 18:21:50

Перенес код инициализации первой точки в место перед отправкой дескриптора отчета. Вот что получилось

Код:
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 начинает снова запрашивать дескриптор устройства. Так и должно быть, или это связано с неправильной энумерацией?

Re: STM32 и USB (практика)

Вс сен 27, 2020 18:41:21

Если хост видит, что девайс общается не по этикету, он пошлет его сбросом и начнет все заново (до трех раз).
Если все нормально, дескриптор устройства запрашивается два раза, сначала только его кусок, потом полностью.
Да, когда приходит команда установить адрес девайса, надо ответить ZLP как от безадресного устройства и только потом установить адрес.
Это я сходу что вспомнил, надеюсь правильно.
С 107 МК я чето пока подзавязал разбираться,а со 103 давно делал. Кстати, в этой же теме разбирались как у 103 USB робит , Kellya, Вы читали этот топик полностью? Тут вроде все про 103 и USB разжёвано и как раз на любительском уровне, по мере появления времени и желания ковырялись с коллегами.

Re: STM32 и USB (практика)

Вс сен 27, 2020 19:34:32

"Вы читали этот топик полностью?"
Да, с этого и начинал, мне очень помогло - получилось сделать так, чтобы устройство корректно отображалось в диспетчере устройств. Но для этого достаточно работы с нулевой точкой, а вот что делать с точкой interrupt in, я так и не разобрался, может быть невнимательно все прочитал. Хотя вроде бы настраиваю её аналогично нулевой точке

Re: STM32 и USB (практика)

Вс сен 27, 2020 19:45:02

Я помню, что interrupt у меня что-то получилось, но потом понял что мне хватает для общения устройства типа HID через "фьючи" более чем. ISX себе CDC забубекал.
Что у меня с interrupt было, точно не помню, но хост регулярно запросы слал (т.е. работало). Вроде с конфигурировать не сложно было, может есть тут в теме? И еще где-то есть ссылка (наверное в начале топика) на параллельную тему, может там что есть А я стал общаться с девайсом через фьючи, потому что мне так проще оказалось приложение под винду написать для обмена.

Re: STM32 и USB (практика)

Вс сен 27, 2020 19:54:00

"Что у меня с interrupt было, точно не помню, но хост регулярно запросы слал"
Вот, у меня тоже хост шлет регулярно запросы к первой точке, но корректно ответить на них у меня почему-то (не разобрался) не получается. Пробую клавиатуру написать, если это как-то важно

Re: STM32 и USB (практика)

Вс сен 27, 2020 19:58:41

Неужели в сети рабочий пример HID для f103 не ищется? Да хоть тем же кубом сгенерить и разбираться.
Ответить