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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4320808#p4320808"]Чтобы реализовать USB storage, придется еще и файловую систему выдирать и причесывать.[/uquote]
Тот же FAT достаточно простой чтобы в реальном времени его генерировать. По крайней мере, мне удавалось с FAT16. Собственно, для FS-device большего и не надо: скорости больше 600 - 900 кБ/с физически не выжать. Значит, ограничение ФС на размер файлов не критично: быстрее ждать устанешь пока 4 ГБ файл скопируется.
VladislavS писал(а):Ну да, в начале раздела USB. А вы про USB в разделе GPIO что-ли читаете обычно?
Об основных характеристиках контроллера я читаю, как ни странно, в разделе об основных характеристиках контроллеров. В случае STM это одна-дву первые страницы плюс таблица, в которой перечислены скорость, память и основная периферия.
Читать от корки до корки десяток даташитов на разные контроллеры, по 200 страниц каждый, чтобы выбрать нужный у меня желания почему-то нет.
Реклама
Аватара пользователя
nibelung
Родился
Сообщения: 9
Зарегистрирован: Вт май 07, 2019 12:55:34
Откуда: 62

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

Сообщение nibelung »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4320654#p4320654"]правда ли, что из распространенных ARM'ов и RISC-V этот USB-HS есть только в gd32e505, gd32e507 или все же есть что-то более доступное?[/uquote]
Еще есть в CH32V305 и CH32V307 и доступная отладочная плата.
Зачем делать сложным, то что проще простого...
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Ага, спасибо, чуть раньше нашел, чем вы написали. Очень хочется с ними поиграться.
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

Всем доброго времени суток :)
Изучаю 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:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Вы путаете состояние ресета контрооллера 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; можно опустить. И никаких "|=" и "&=" тут не надо. Отучайтесь их применять просто так. Есть же простой оператор присваивания - пользуйтесь.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4327206#p4327206"]- сконфигурировать ноги USBDP и USBDM[/uquote]
Вы уверены, что это относится к контроллеру ТСа? А то в f103 или l151 или аналогах от WCH ноги конфигурируются автоматически, их вручную-то фиг отключишь.
VladislavS писал(а):- разрешить прерывания
Вот это важный момент: по-хорошему сначала настраивается периферия, и только потом прерывания разрешаются глобально. То есть пока USB не настроен, прерываний нет и быть не может.
VladislavS писал(а):- заполнить таблицу дескрипторов буферов;
Опять же - это для всех контроллеров? А то я к GD32VF103 подступиться боюсь - у них тоже буферы отдельно настраиваются, как и у f103?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4327224#p4327224"]Вы уверены, что это относится к контроллеру ТСа?[/uquote]Они вроде ремапиться в этом чипе могут. Так же, будут ли они без тактирования GPIOА работать я не проверял. Конкретно с этим чипом я не работал. Вот пусть ТС сам и проверит. Чтобы потом как Эдуард локти не кусать.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4327224#p4327224"]
VladislavS писал(а):- разрешить прерывания
Вот это важный момент: по-хорошему сначала настраивается периферия, и только потом прерывания разрешаются глобально.[/uquote]В моей последовательности всё что нужно для принятия ресета настроено.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4327224#p4327224"]
VladislavS писал(а):- заполнить таблицу дескрипторов буферов;
Опять же - это для всех контроллеров?[/uquote]Что вы понимает под словом ВСЕХ? Всех существующих в природе?

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4327224#p4327224"]А то я к GD32VF103 подступиться боюсь - у них тоже буферы отдельно настраиваются, как и у f103?[/uquote]У него же OTG. Там не буферы, а FIFO. Настраивается не как у f103, а скорее как у F4. Там FIFO ещё и чистить надо. Глянул краем глаза доку GD32VF103 - там прямо последовательности "Global register initialization sequence" и "Endpoint initialization and enable sequence" приведены.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4327232#p4327232"]Они вроде ремапиться в этом чипе могут.[/uquote]
Не похоже. По крайней мере, судя по даташиту DP соединен только с PA12, а DM - PA11.
VladislavS писал(а):В моей последовательности всё что нужно для принятия ресета настроено.
Да в вашей-то наверняка. Как и в моей или Эдуарда. А вот в последовательности ТСа - не факт, раз он ожидает прерывания во время настройки.
VladislavS писал(а):У него же OTG. Там не буферы, а FIFO. Настраивается не как у f103, а скорее как у F4.
Хорошо, спасибо. Просто он по периферии весьма похож на f103, мало ли чего там наворотили. Ковырять принципиально иной USB у него я не хочу. Есть камни с более интересным USB, их тут уже упоминали.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4327244#p4327244"]Не похоже. По крайней мере, судя по даташиту DP соединен только с PA12, а DM - PA11.[/uquote]В даташите на 28 странице в примечании 5 указано. У него же малоногий корпус TSSOP20 может быть, вот ремапов и завезли. В любом случае, вопрос не стоит споров - проще проверить и забыть.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Там написано про ремап GPIO, а не USB. А про проверить это к ТСу, у меня такого контроллера нет.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

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

Сообщение azhel12 »

Вставлю свои 5 копеек, большая часть проблем с USB, которую я получал при простом переносе кода (когда на 103 работает, а на 072, например, тот же код не работает, хотя модули практически идентичны) была с неправильной настройкой тактирования USB, поэтому советую внимательно эту часть посмотреть.
ЕМНИП на том же 103 все просто: настроил PLL и тогда USB либо тактируется напрямую, либо с полуторным делением, на F0 (конкретно 070 у меня нет, делал для 072) для такой же схемы надо сначала установить бит тактирования от PLL в RCC.CFGR3 (USBSW_PLLCLK), для деления на 1,5 еще бит в RCC.CFGR (USBPRE). Также вроде для F0 надо включить тактирование SYSCFG.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

У 0x2 есть HSI48 с АПЧ, к сожалению, у всяких 303 и 407 такого нет, и приходится лепить долбаный кварц!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

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

На счет ремапа, действительно, он нужен, т.к. по умолчанию 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:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4327359#p4327359"]У 0x2 есть HSI48 с АПЧ, к сожалению, у всяких 303 и 407 такого нет, и приходится лепить долбаный кварц![/uquote]
А у этого триммер мода для внутреннего генератора есть какие-то подводные камни или все работает так же стабильно как с кварцем? Первые мысли, что рабочий диапазон температур будет уже.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

НАПАЛМ, никаких проблем при температуре воздуха от -20℃ до +30℃ не встречал. Меньше у нас не бывает, больше — тоже.
А еще у меня на БТА работают сборщики температуры главного зеркала. Пять контроллеров общаются с мастером по CAN-шине. Везде CAN тактируется от HSI48, и вообще нет проблем. Но там и АПЧ нет!!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Serg1987
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн июн 13, 2016 10:41:52

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

Сообщение Serg1987 »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4320792#p4320792"]Меня, кстати, поначалу смутила олимексовская плата, которая сейчас на столе лежит (я все надеюсь, что таки смогу выделить неделю-две на опыты с USB, чтобы и на F407 написать CDC). Так у нее разведены оба USB, а внешнего PHY нет! Я вот и понадеялся, что там HS внутри STM'ки, а фигвам… Т.е. оба выхода подключены как обычные FS. Ну и ладно, зато можно придумать какую-нибудь непонятную хрень, чтобы 2 USB было. Не знаю, правда, зачем такое может в реальной жизни понадобиться. Это как мои 7 CDC на одном микроконтроллере: прикольно, но бесполезно. Разве что разделить интерфейсы и вывести один отладочный — с одного подаем команды и смотрим выхлоп, а отладочный через wireshark парсим. Это если вдруг в башку дурь какая зайдет вроде storage реализовать (но, надеюсь, что смогу прожить в полном уме и здравии еще хотя бы лет 10).[/uquote]

Можно взять внешний USB-PHY. Самый распространенный вариант - это USB3300 с ULPI интерфейсом. На 407м поддержка ULPI имеется.
Или же искать STM32F7xx (там USB-PHY уже вроде как встроен).
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

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

Сообщение danone78 »

При включении контроллера stm32f407 USB устанавливается в режим хоста, PA9(Vbus) PA10(ID) на разъем USB не подключены. При обращению к регистрам периферии происходит прерывание MMISM mode mismatch.
Как переключиться в режим девайса?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Начало инициализации
СпойлерИзображение
Screenshot_20230227-001544_Chrome.jpg
(226.85 КБ) 742 скачивания
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

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

Сообщение danone78 »

Хост управляет потоком, то есть отправляет периферийному устройству команды. Что будет если хост отпрвит их другому хосту? Или такое невозможно? Может ли хост определить в каком режиме находится оппонент по связи? Можно ли юсб устройства подключать паралельно как например на i2c?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Нет. USB это шина с единственным хостом. Соединять несколько хостов друг с другом нельзя. Соединять несколько девайсов друг с другом нельзя. Соединять по одним и тем же проводам больше двух устройств нельзя. Не просто так придуманы usb-хабы.
Есть, конечно, otg, но и там устройство по напряжению на ножке определяет быть ли ему хостом или девайсом.
danone78
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт фев 15, 2022 21:28:35

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

Сообщение danone78 »

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

Вернуться в «ARM»