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

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

Вт ноя 15, 2022 18:00:25

Чтобы реализовать USB storage, придется еще и файловую систему выдирать и причесывать.

Тот же FAT достаточно простой чтобы в реальном времени его генерировать. По крайней мере, мне удавалось с FAT16. Собственно, для FS-device большего и не надо: скорости больше 600 - 900 кБ/с физически не выжать. Значит, ограничение ФС на размер файлов не критично: быстрее ждать устанешь пока 4 ГБ файл скопируется.
VladislavS писал(а):Ну да, в начале раздела USB. А вы про USB в разделе GPIO что-ли читаете обычно?

Об основных характеристиках контроллера я читаю, как ни странно, в разделе об основных характеристиках контроллеров. В случае STM это одна-дву первые страницы плюс таблица, в которой перечислены скорость, память и основная периферия.
Читать от корки до корки десяток даташитов на разные контроллеры, по 200 страниц каждый, чтобы выбрать нужный у меня желания почему-то нет.

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

Ср ноя 16, 2022 21:22:13

правда ли, что из распространенных ARM'ов и RISC-V этот USB-HS есть только в gd32e505, gd32e507 или все же есть что-то более доступное?

Еще есть в CH32V305 и CH32V307 и доступная отладочная плата.

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

Чт ноя 17, 2022 10:00:44

Ага, спасибо, чуть раньше нашел, чем вы написали. Очень хочется с ними поиграться.

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

Сб ноя 26, 2022 17:55:35

Всем доброго времени суток :)
Изучаю USB, камень STM32F070F6P6

Ковыряю библиотечку для STM32F103 - https://github.com/saewave/STM32F103-USB-CDC-CMSIS

По логике ее работы, при инициализации юсб, после команды
Код:
USB->CNTR |= USB_CNTR_FRES;
должен возводится флаг прерывания и после разрешения прерывания по ресету, программа должна сразу улетать на обработчик прерываний по ресету, и уже в обработчике режим принудительного ресета снимается.

Но вот на моем камне сама по себе эта команда ничего не вызывает, а прерывание возникает только после выключения режима принудительного ресета, т.е. после кода:
Код:
USB->CNTR |= USB_CNTR_FRES;
...
USB->CNTR &= ~USB_CNTR_FRES;


Описание бита в реф.мануалах на два камня одинаковое:
Код:
Bit 0 FRES: Force USB Reset
0: Clear USB reset.
1: Force a reset of the USB peripheral, exactly like a RESET signaling on the USB. The USB
peripheral is held in RESET state until software clears this bit. A “USB-RESET” interrupt is
generated, if enabled.


Я что-то не так делаю? :roll:

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

Сб ноя 26, 2022 23:21:24

Вы путаете состояние ресета контрооллера USB и прерывание по состоянию ресета в линии. Правильная последовательность включения:
- сконфигурировать ноги USBDP и USBDM
- настроить тактирование USB на 48 МГц и включить его;
- настроить домены питания и источники опорного напряжения (в контроллерах где они есть);
- снять PowerDown *
Код:
USB->CNTR = USB_CNTR_FRES;
- снять ресет с контроллера USB и включить нужные прерывания
Код:
USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
- заполнить таблицу дескрипторов буферов;
- разрешить прерывания;
Код:
USB USB->ISTR = 0;
NVIC_EnableIRQ(USB_IRQn);
- подключить PullUp резистор в линию.

Вот только теперь прилетит прерывание Reset из линии и в нём надо делать остальные настройки (сбросить адрес в 0 и настроить конечные точки) и дальше действовать по протоколу энумерации.

----------
* - при включении питания в регистре USB->CNTR взведено два бита USB_CNTR_FRES и USB_CNTR_PDWN. То есть, контроллер USB находится в состоянии Power Down c нажатой линией Reset. То есть, ваша
Код:
USB->CNTR |= USB_CNTR_FRES;
фактически ничего не делает, бит и так взведён. Вместо этого надо написать
Код:
USB->CNTR = USB_CNTR_FRES;
Этим вы сбросите бит USB_CNTR_PDWN. Затем надо сбросить и бит USB_CNTR_FRES. Можно сделать
Код:
USB->CNTR = 0;
А затем включить нужные прерывания
Код:
USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
Последнее действие автоматом делает и предпоследнее. Так что, USB->CNTR = 0; можно опустить. И никаких "|=" и "&=" тут не надо. Отучайтесь их применять просто так. Есть же простой оператор присваивания - пользуйтесь.

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

Сб ноя 26, 2022 23:55:43

- сконфигурировать ноги USBDP и USBDM

Вы уверены, что это относится к контроллеру ТСа? А то в f103 или l151 или аналогах от WCH ноги конфигурируются автоматически, их вручную-то фиг отключишь.
VladislavS писал(а):- разрешить прерывания

Вот это важный момент: по-хорошему сначала настраивается периферия, и только потом прерывания разрешаются глобально. То есть пока USB не настроен, прерываний нет и быть не может.
VladislavS писал(а):- заполнить таблицу дескрипторов буферов;

Опять же - это для всех контроллеров? А то я к GD32VF103 подступиться боюсь - у них тоже буферы отдельно настраиваются, как и у f103?

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

Вс ноя 27, 2022 00:18:32

Вы уверены, что это относится к контроллеру ТСа?
Они вроде ремапиться в этом чипе могут. Так же, будут ли они без тактирования GPIOА работать я не проверял. Конкретно с этим чипом я не работал. Вот пусть ТС сам и проверит. Чтобы потом как Эдуард локти не кусать.

VladislavS писал(а):- разрешить прерывания

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

VladislavS писал(а):- заполнить таблицу дескрипторов буферов;
Опять же - это для всех контроллеров?
Что вы понимает под словом ВСЕХ? Всех существующих в природе?

А то я к GD32VF103 подступиться боюсь - у них тоже буферы отдельно настраиваются, как и у f103?
У него же OTG. Там не буферы, а FIFO. Настраивается не как у f103, а скорее как у F4. Там FIFO ещё и чистить надо. Глянул краем глаза доку GD32VF103 - там прямо последовательности "Global register initialization sequence" и "Endpoint initialization and enable sequence" приведены.

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

Вс ноя 27, 2022 00:59:23

Они вроде ремапиться в этом чипе могут.

Не похоже. По крайней мере, судя по даташиту DP соединен только с PA12, а DM - PA11.
VladislavS писал(а):В моей последовательности всё что нужно для принятия ресета настроено.

Да в вашей-то наверняка. Как и в моей или Эдуарда. А вот в последовательности ТСа - не факт, раз он ожидает прерывания во время настройки.
VladislavS писал(а):У него же OTG. Там не буферы, а FIFO. Настраивается не как у f103, а скорее как у F4.

Хорошо, спасибо. Просто он по периферии весьма похож на f103, мало ли чего там наворотили. Ковырять принципиально иной USB у него я не хочу. Есть камни с более интересным USB, их тут уже упоминали.

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

Вс ноя 27, 2022 01:09:36

Не похоже. По крайней мере, судя по даташиту DP соединен только с PA12, а DM - PA11.
В даташите на 28 странице в примечании 5 указано. У него же малоногий корпус TSSOP20 может быть, вот ремапов и завезли. В любом случае, вопрос не стоит споров - проще проверить и забыть.

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

Вс ноя 27, 2022 06:54:19

Там написано про ремап GPIO, а не USB. А про проверить это к ТСу, у меня такого контроллера нет.

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

Вс ноя 27, 2022 09:58:54

Вставлю свои 5 копеек, большая часть проблем с USB, которую я получал при простом переносе кода (когда на 103 работает, а на 072, например, тот же код не работает, хотя модули практически идентичны) была с неправильной настройкой тактирования USB, поэтому советую внимательно эту часть посмотреть.
ЕМНИП на том же 103 все просто: настроил PLL и тогда USB либо тактируется напрямую, либо с полуторным делением, на F0 (конкретно 070 у меня нет, делал для 072) для такой же схемы надо сначала установить бит тактирования от PLL в RCC.CFGR3 (USBSW_PLLCLK), для деления на 1,5 еще бит в RCC.CFGR (USBPRE). Также вроде для F0 надо включить тактирование SYSCFG.

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

Вс ноя 27, 2022 10:11:43

У 0x2 есть HSI48 с АПЧ, к сожалению, у всяких 303 и 407 такого нет, и приходится лепить долбаный кварц!

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

Вс ноя 27, 2022 17:20:24

Большое спасибо за ответы :)
Действительно, не обратил внимания, что в библиотеке же используется оператор присваивания, а я себе написал вариант с побитовым или. Исправлю и буду дальше посмотреть, что получится :)

На счет ремапа, действительно, он нужен, т.к. по умолчанию dp и dm к ножкам не подключены в корпусе-малютке :))
Код:
Bit 4 PA11_PA12_RMP: PA11 and PA12 remapping bit for small packages (28 and 20 pins).
Available on STM32F070x6 devices only.
This bit is set and cleared by software. It controls the mapping of either PA9/10 or PA11/12 pin
pair on small pin-count packages.
0: No remap (pin pair PA9/10 mapped on the pins)
1: Remap (pin pair PA11/12 mapped instead of PA9/10)


Добавлено after 2 hours 14 minutes:
У 0x2 есть HSI48 с АПЧ, к сожалению, у всяких 303 и 407 такого нет, и приходится лепить долбаный кварц!

А у этого триммер мода для внутреннего генератора есть какие-то подводные камни или все работает так же стабильно как с кварцем? Первые мысли, что рабочий диапазон температур будет уже.

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

Вс ноя 27, 2022 17:52:51

НАПАЛМ, никаких проблем при температуре воздуха от -20℃ до +30℃ не встречал. Меньше у нас не бывает, больше — тоже.
А еще у меня на БТА работают сборщики температуры главного зеркала. Пять контроллеров общаются с мастером по CAN-шине. Везде CAN тактируется от HSI48, и вообще нет проблем. Но там и АПЧ нет!!!

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

Пн ноя 28, 2022 18:36:19

Меня, кстати, поначалу смутила олимексовская плата, которая сейчас на столе лежит (я все надеюсь, что таки смогу выделить неделю-две на опыты с USB, чтобы и на F407 написать CDC). Так у нее разведены оба USB, а внешнего PHY нет! Я вот и понадеялся, что там HS внутри STM'ки, а фигвам… Т.е. оба выхода подключены как обычные FS. Ну и ладно, зато можно придумать какую-нибудь непонятную хрень, чтобы 2 USB было. Не знаю, правда, зачем такое может в реальной жизни понадобиться. Это как мои 7 CDC на одном микроконтроллере: прикольно, но бесполезно. Разве что разделить интерфейсы и вывести один отладочный — с одного подаем команды и смотрим выхлоп, а отладочный через wireshark парсим. Это если вдруг в башку дурь какая зайдет вроде storage реализовать (но, надеюсь, что смогу прожить в полном уме и здравии еще хотя бы лет 10).


Можно взять внешний USB-PHY. Самый распространенный вариант - это USB3300 с ULPI интерфейсом. На 407м поддержка ULPI имеется.
Или же искать STM32F7xx (там USB-PHY уже вроде как встроен).

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

Вс фев 26, 2023 22:10:59

При включении контроллера stm32f407 USB устанавливается в режим хоста, PA9(Vbus) PA10(ID) на разъем USB не подключены. При обращению к регистрам периферии происходит прерывание MMISM mode mismatch.
Как переключиться в режим девайса?

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

Пн фев 27, 2023 00:18:16

Начало инициализации

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

Ср мар 01, 2023 10:39:37

Хост управляет потоком, то есть отправляет периферийному устройству команды. Что будет если хост отпрвит их другому хосту? Или такое невозможно? Может ли хост определить в каком режиме находится оппонент по связи? Можно ли юсб устройства подключать паралельно как например на i2c?

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

Ср мар 01, 2023 10:47:23

Нет. USB это шина с единственным хостом. Соединять несколько хостов друг с другом нельзя. Соединять несколько девайсов друг с другом нельзя. Соединять по одним и тем же проводам больше двух устройств нельзя. Не просто так придуманы usb-хабы.
Есть, конечно, otg, но и там устройство по напряжению на ножке определяет быть ли ему хостом или девайсом.

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

Чт мар 02, 2023 10:46:32

Чего-то не фу-фу! Я так понял, перед инициализацией usb ядра в режиме периферии, usb порт уже должен быть в этом режиме. Приземляю id, включаю питание, а оно опять хост. Pa10,11,12 в af-mode, pa9-analog input. PortA-enable. Частота 48, что я мог пропустить?
Ответить