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

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

Чт мар 02, 2023 18:33:53

Что же вы RM то стесняетесь читать?
Изображение
изображение_2023-03-02_183335830.png
(40.37 KiB) Скачиваний: 633


И потом. Открываем раздел 34.17 OTG_FS programming model, там полностью по пунктам вся инициализация.

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

Чт мар 02, 2023 19:55:28

Вот я уже думаю, попробовать принудительно перевести в режим периферии, а потом из него отправить запрос согласования с хостом HNP. Мутно как-то все это.

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

Чт мар 02, 2023 20:08:09

RM таки читать не хотите?

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

Чт мар 02, 2023 22:12:05

я только с ним и работаю. Просто непонятно, зачем ID линия, если она не работает? И еще вопрос для контроля: бит-бандингом в область 0х50000000 не попасть, то есть только чтение-изменение-запись?

Добавлено after 1 minute 58 seconds:
вот кстати уже готовый перевод, чтобы не париться, кто-то уже постарался
http://microsin.net/programming/arm-wor ... 7264963928

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

Пт мар 03, 2023 08:37:44

я только с ним и работаю. Просто непонятно, зачем ID линия, если она не работает?
Что конкретно из раздела 34.4 не работает? Зачем вам вообще эта ID-линия, вы хост руками поднимать собрались?

И еще вопрос для контроля: бит-бандингом в область 0х50000000 не попасть, то есть только чтение-изменение-запись?
Большинство регистров периферии устроено так, что требуют либо R, либо W. Операция RMW скорее исключение. Если речь про USB-OTG (судя по адресу), то посмотрел свой код и нашёл всего одно место с RMW. Больше разговоров.

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

Пн мар 06, 2023 08:11:05

Я забыл выставить номер альтернативной функции. Все работает.

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

Чт мар 09, 2023 09:50:17

:facepalm: не сочтите за наглость, я опять со своим самоваром. Пазл не сложился, есть пара ключевых вопросов:
1- может быть так, что при подключении микроконтроллера к pc, usb host контроллер pc, по отношннию к подключаемому к нему stm32, находится в роли периферийного устройства?
2 - энумерация проходит без участия оппонента по связи или это зависит от роли?

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

Чт мар 09, 2023 10:08:03

1. Мне не попадались PC, порты которых могут быть device.
2. Энумерацию проводит host, чтобы узнать что к нему подкулючили. Девайс в это время ведёт себя тупо "как на допросе".

Может спецификацию почитать таки? Там столько интересного!

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

Чт мар 09, 2023 10:21:13

Вот тут я разбирал как USB работает на самом низком уровне - реверс vusb для AVR, то есть чистый ногодрыг: https://habr.com/ru/post/460815/
Грубо говоря, если вам что-то послали, вы должны ответить подтверждением или отказом (ACK / NAK). И наоборот, если хост у вас что-то запрашивает, вы посылаете ему данные и дожидаетесь его подтверждения.
Если говорить про аппаратный модуль, то не знаю как в вашем камне, а в stm32f1 надо явно прописать сохранение адреса и ответ в виде ZLP (пакет длиной 0 байт). Точнее наоборот, сначала ответить, и только потом сохранять адрес, иначе контроллер будет игнорировать запрос на подтверждение.
Как-то так:
Код:
if(req == (USB_REQ_STANDARD | USB_REQ_DEVICE)){
      if(setup_packet.bRequest == SET_ADDRESS){ //запрос на установку адреса на шине
        uint8_t USB_Addr = setup_packet.wValue;
        usb_ep_write(0, NULL, 0); //сначала посылаем ответ!
        while( (USB_EPx(0) & USB_EPTX_STAT) == USB_EP_TX_VALID ){} //дожидаемся пока хост его прочтет
        USB->DADDR = USB_DADDR_EF | USB_Addr; //и только потом меняем адрес
        return;
...

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

Чт мар 09, 2023 12:53:00

Спасибо, статья что надо, истиный дзен. У меня с ethernet-ом таких проблем не было как с usb. С самого запуска модуля otg-fs отлавливаю rxflvl (фифо не пустой), в принудительном режиме устройства, в разной последовательности инициализаций. Получаю прерывания, сначала старт фрейма одновременно со сменой режима, потом или энумерация, или вместе с ней резет, потом еще что-то незначительное. Но rx-fifo всегда пуст. Если вопреки правилам я прочитаю pop регистр, то выскакивает бит непустого фифо, но это я так понимаю его "непредсказуемое поведение". Компутер меня видит как неизвестное устройство, после энемерации скорость получаю правильную, с rcc мудрил всякое, но "оно" не коньяк и не кофе.

Добавлено after 26 minutes:
Забавно то, что энумерация проходит без ошибок даже если ничего не подключено и скорость выставляется full sped.

Добавлено after 1 hour 15 minutes 39 seconds:
Предполагаю, можно попробовать сделать правильный резет после устанвки forced device mode так чтобы этот бит не сбросился и возможно понадобится управление через power clock and gating ahb регистр.

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

Чт мар 09, 2023 17:05:26

то не знаю как в вашем камне,
У него не так.

Добавлено after 17 minutes 58 seconds:
danone78, выводите в логи все события и вашу реакцию на них. Только так получится понять что происходит.

На самом деле, кода в USB-OTG device даже меньше, чем в обычном типа f103-го. Просто сильно больше разных событий и разобраться на какие как реагировать и реагировать ли вообще не сразу получается. На переключение host <-> device забейте тупо забить. Включите принудительно device и не парьте себе мозг.

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

Пт мар 10, 2023 08:07:04

Power on programming done (dctl)=1
Вот чего нехватало.
Если быстро отловить все события с самого момента включения модуля usb, то можно увидеть, что он запускаетия в режиме device, но потом сразу переобувается в host. Внешние подтягивания id ни чего не дают.

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

Пт мар 31, 2023 16:06:51

Всем привет
Хочу поделиться радостью, наконец-то осилил работу с буффером USB и сумел пройти процесс энумерации, используя cmsis (stm32f070)

Дескрипторы использовал вот такие:


В винде ожидаемо получил ошибку с кодом 10, потому что, как я понял, у каждого вендора свой проприетарный CDC протокол, со своими командами и наборами конечных точек.
изображение_2023-03-31_155713754.png
(18.44 KiB) Скачиваний: 32


Теперь у меня цель - пообщаться с устройством через терминал, хочу в машину на линуксе (убунту) слать данные с датчиков температуры. В связи с этим достаточно наивный, но закономерный вопрос, как мне это сделать, чтобы не пришлось писать свои драйверы? Возможно есть какие-то протоколы открытые со своим набором конечных точек, либо какие-то другие варианты? Подскажите пожалуйста куда копать и на что обратить внимание :)
Последний раз редактировалось НАПАЛМ Пт мар 31, 2023 16:37:48, всего редактировалось 1 раз.

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

Пт мар 31, 2023 16:28:33

каждого вендора свой проприетарный CDC протокол,

в Linux cdc-acm дрйвер как раз универсальный, а всякие там uart-преобразователи навроде FT232R, PL2303 идут в ядре отдельными модулями.

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

Пт мар 31, 2023 16:39:04

каждого вендора свой проприетарный CDC протокол,

в Linux cdc-acm дрйвер как раз универсальный, а всякие там uart-преобразователи навроде FT232R, PL2303 идут в ядре отдельными модулями.

Спасибо, посмотрю
Там есть какие-то подводные камни, о которых стоит заранее знать? Возможно проверенные временем примеры работы?

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

Пт мар 31, 2023 17:03:18

да вроде нет. у меня прога самописная для Linux, монитор порта последовательного порта. она одинаково работает как c CDC так и с ttyUSB девайсами. но проблем. если какие-то вопросы будут, смотрите исходники CDC-ACM драйвера в ядре.

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

Пт мар 31, 2023 21:30:36

Там есть какие-то подводные камни, о которых стоит заранее знать? Возможно проверенные временем примеры работы?

Есть, конечно. Слишком многие рукожопы производители предпочитают вместо стандартной реализации CDC реализовывать собственные протоколы, которые требуют разработчикам ОС писать под каждую такую кривульку собственный драйвер.
Отдельно под виндой бывает проблема если VID:PID уже под что-то зарезервированы или просто не могут быть адекватно распарсены (в линуксе, разумеется. такой проблемы нет). Как это починить точно не знаю. Можно разве что попробовать поиграться с теми же VID:PID.

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

Сб апр 01, 2023 05:33:17

Отдельно под виндой бывает проблема если VID:PID уже под что-то зарезервированы .

В Linux тоже будут проблемы, если vid:pid уже забит под какое-то известное устройство. А так, драйверу должно быть без разницы.

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

Сб апр 01, 2023 05:41:24

Всего то нужно - соблюдать спецификацию.

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

Вс апр 02, 2023 15:22:55

В Linux тоже будут проблемы, если vid:pid уже забит под какое-то известное устройство.

Разве что вы пытаетесь назначить VID:PID от какой-то кривульки, у которой дескрипторы говорят о стандартном устройстве, но требуют специальных дров, и вам не повезло реализовывать то же самое устройство. Ну или вы сами пытаетесь реализовать vendor-specific (хотя даже тогда можно в udev прописать что захочется). В общем, под линуксом проблем на порядок меньше.
Ответить