Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 и USB (практика)
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 19:30:43

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 22, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 19:58:38 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Цитата:
И второй вопрос: как я понял, размер пакета для нулевой EP ограничен снизу, для FS USB 2.0 у меня меньше 16 байтов не работает. Действительно ли есть такое ограничение, или где-то в коде ошибка?
Нет. Только что проверил на 8-битной точке, все работает.
Цитата:
Так вот такой вопрос: как лучше (как принято): принимать указатель на функцию или std::function?
Не думаю, что вам это поможет, но в моем варианте за разбиение данных по размеру endpoint'a (кроме ep0) отвечает юзерский код, вызываемый по колбэку endpoint_IN. Но у меня Си, не С++.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 20:07:58 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 137
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Только что проверил на 8-битной точке, все работает.

Эх, а я уж понадеялся, что все нормально. А на какой ОС, можете сказать? Просто вроде проскакивало здесь, что тот же Linux более лояльный (у меня самая свежая Win10).

COKPOWEHEU писал(а):
за разбиение данных по размеру endpoint'a (кроме ep0) отвечает юзерский код

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 21:09:02 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
А что именно вы хотите настолько эффективно посылать? В том смысле что в USB весь обмен хост-центрчен, то есть он дает устройству команду "мне нужно столько-то байт", устройство посылает и спит до следующей команды. То есть информация о завершении ему просто не нужна.
Есть, конечно, исключение с Interrupt-точками, но там посылки обычно мелкие и в буфер влезают запросто.
Или зайдем с другой стороны - MSD, где надо сначала огромный кусок данных послать, а потом еще специальный пакет-подтверждение. Это для простого буфера (или что там у вас) наоборот неподъемная задача. Откуда ему знать что после передачи основного буфера надо еще дополнительный передать? То есть даже так юзеру останется немало работы.
Цитата:
Эх, а я уж понадеялся, что все нормально. А на какой ОС, можете сказать?
Linux, WinXP, win10.
Но в документации прямо сказано что ep0 может быть 8, 16, 32 и 64 байта. А для низкоскоростных только 8 байт, без вариантов.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 21:17:15 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Выбирал, как сделать, решил попробовать освободить юзера от необходимости разбивать самостоятельно.
Имеет смысл сделать очередь отправки в ep0. Для остальных точек на откуп пользователя буферизация, так как даже в пределах одного класса задачи могут быть совсем разные и требуют творческого подхода.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 21:23:42 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 137
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Но в документации прямо сказано что ep0 может быть 8, 16, 32 и 64 байта.
Понял, спасибо. Пойду искать ошибку.

VladislavS писал(а):
Имеет смысл сделать очередь отправки в ep0
А я думал наоборот. Задача Ep0 - это нумерация (пока по крайней мере) и там очередная отправка только после приема, очередь не стал делать.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 21:47:42 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Очередь это разбиение одного пакета на кусочки по размеру точки. Отправлять байты по своему желанию через нее нельзя, только в ответ на запросы. Ну а очередь на передачу одного пакета и у меня реализована. Даже банальный DeviceDescriptor занимает больше 8 байт, а другие могут и в 64 байта не поместиться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 21:49:42 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 137
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Очередь это разбиение одного пакета на кусочки по размеру точки.
Я подумал, VladislavS имеет ввиду еще более высокую очередь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 22:20:53 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
В случае USB очередь из нескольких пакетов оправдана разве что для Interrupt-точек. Ну не знаю, чтобы прикинуться клавиатурой и послать последовательность символов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вс апр 04, 2021 22:25:31 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 137
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
В случае USB очередь из нескольких пакетов оправдана разве что для Interrupt-точек.
Но я и в этом случае соглашусь с вашим прошлым сообщением - пусть пользователь сам отправляет, как надо, и в этом случае как раз callback на успешную передачу будет полезен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Пн апр 05, 2021 22:19:56 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 137
Рейтинг сообщения: 0
Нашел проблему, очень интересно для меня все оказалось.
Тыкание пальца в небо показало, что если установку адреса перенести из лямбды в обработчик CTR_TX, то все начинает работать правильно. Практически уверен, что словил следующую ситуацию: после первых 8 (или 16, отладку процесса нумерации так и не осилил) хост кинул второй сброс (что написано в "USB in a NutShell", надо быть все-таки более внимательным), но поле класса, обозначающее оставшееся количество байтов для передачи не обнулилось. Далее пришел SetAddress, на что я кинул ZLP, но и там остаток не обнулил, поэтому в обработке успешной передачи ZLP девайс отправил хосту оставшиеся 2 байта от дескриптора устройства, хост сошел с ума, дважды попытался завершить нумерацию, ничего не получилось, выдал ошибку. Сейчас в отправке ZLP обнуляю счетчик остатка и все нормально.
Спасибо за помощь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 03:31:33 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Что-то вы всё усложняете. Там же тупой автомат "Запрос -> Ответ". По reset всё сбросить.

Размер очереди отправки задаётся только в момент формирования ответа или обнуляется по reset. Если ответ это ZLP, то и очередь автоматом обнулится. При штатном прохождении энумерации не должно быть ситуаций когда хост даёт новый запрос не дочитав ответ на старый. Но автомат должен быть к этому готов. При формировании каждого нового ответа очередь инициализируется заново. Досылать ничего от прошлого ответа уже не надо. Хотя, повторюсь, при правильном обмене такой ситуации не должно возникать.

Проверьте, что вы правильно обрабатываете следующие моменты:
1. По ресет надо сбрасывать все регистры usb-контроллера в состояние как до энумерации. Все ваши программные очереди и статусы тоже.
2. При ответе на SetAddress надо сначала отправить ZLP и только после его ухода записать полученный адрес в регистр. Я недавно открыл для себя, что самое оптимальное по коду это при каждом CTR_TX в ep0 писать в регистр адрес. Для контроллеров с OTG с этим можно не заморачиваться, у них можно устанавливать адрес сразу.
3. При запросе дескрипторов хост пишет сколько он хочет получить в ответ. Если дескриптор больше, чем просит хост, то отправить надо столько сколько попросили. Не надо пихать весь дискриптор в этом случае. Хост по заголовку увидит реальный размер дескриптора и переспросит больше, если захочет. В обратной же ситуации, когда просят больше чем есть, надо отправлять реальный размер.
4. Если размер дескриптора кратен размеру конечной точки, то в конце надо ZLP дослать. Похоже, автомат хоста не доверяет длине, написанной в поле дескриптора, а за конец ответа принимает ситуацию когда пакет меньше размера конечной точки. И только после этого начинает проверку и разбор дескриптора.

Если учесть вышеперечисленные особенности, то нештатных обрывов или недосылов не будет.

Насчёт отладки процесса энумерации - посмотрите мой проект. Там в RTT всё что может быть полезно валится. RTT вообще стоит освоить и в каждом проекте в Debug ветке использовать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 07:07:44 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Цитата:
3. При запросе дескрипторов хост пишет сколько он хочет получить в ответ.
Обычно сначала запршивает 8 байт
Цитата:
4. Если размер дескриптора кратен размеру конечной точки, то в конце надо ZLP дослать. Похоже, автомат хоста не доверяет длине, написанной в поле дескриптора, а за конец ответа принимает ситуацию когда пакет меньше размера конечной точки.
Дело не в хосте, а в устройстве. Оно может послать данных меньше, чем хочет передать хост. А неоконченный пакет как раз и является признаком конца передачи. Даже если пакет обрывается не успев начаться.
И никто не отменял криворуких разработчиков железа (вроде меня, azhel12 или китайских бракоделов - не путать с нормальными разработчиками). Они вполне могут послать и слишком длинный ответ, и внутренне противоречивый, который невозможно корректно распарсить. И хост должен попытаться. Или хотя бы не сойти с ума.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 09:09:42 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Обычно сначала запршивает 8 байТ
Вот даже думать об этом не хочу. Сколько хостов - столько реализаций. Хоть один пусть спрашивает.

Добавлено after 58 minutes 27 seconds:
Насчёт 8 байт. Это вы моему ноуту расскажите. Лог обмена под спойлером.
Спойлер
Код:
Reset
GET_Device_Descriptor 64 bytes
SND EP0 18 bytes
EP0_CTR_TX
Reset
SET_ADDRESS 29
EP0_CTR_TX
USB->DADDR = 0x9D
GET_Device_Descriptor 18 bytes
SND EP0 18 bytes
EP0_CTR_TX
GET_Configuration_Descriptor 255 bytes
SND EP0 64 bytes
EP0_CTR_TX
SND EP0 3 bytes
EP0_CTR_TX
GET_String_Serial 255 bytes
SND EP0 26 bytes
EP0_CTR_TX
GET_String_LangID 255 bytes
SND EP0 4 bytes
EP0_CTR_TX
GET_String_Product 255 bytes
SND EP0 44 bytes
EP0_CTR_TX
GET_Device_qualifier_Descriptor 10 bytes
SND EP0 10 bytes
EP0_CTR_TX
GET_Device_Descriptor 18 bytes
SND EP0 18 bytes
EP0_CTR_TX
GET_String_LangID 255 bytes
SND EP0 4 bytes
EP0_CTR_TX
GET_String_Serial 255 bytes
SND EP0 26 bytes
EP0_CTR_TX
GET_String_Manufacturer 255 bytes
SND EP0 38 bytes


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 11:03:35 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
VladislavS, я же сказал "обычно" а не "всегда". Закладываться на подобное и опасно и бесполезно: логику обработки это ни разу не упростит.
Цитата:
Лог обмена под спойлером.
Лучше бы лог wireshark'а приложили, чем своей железки, который надо еще как-то расшифровывать. Мне это делать лень, так что поверю вам на слово.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 11:52:31 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Закладываться на подобное и опасно и бесполезно: логику обработки это ни разу не упростит.
В том же сообщении я написал, что ХОТЬ ОДИН пусть спрашивает. Вам лишь бы поспорить?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 12:46:29 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
VladislavS, я смотрю важнее всего найти повод поспорить именно для вас!
Ну вот вроде бы ни слова возражения не сказал - нет, VladislavS считает своим долгом начать срач!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 14:15:48 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Просто не будьте столь категоричны в суждениях.
СпойлерНебольшая подборка с нескольких страниц этой темы.
поскольку для ep0 допустим размер 8 байт, а туда не то что Configuration или HID, но даже DeviceDescriptor не влезет.

см. выше: библиотека это скомпилированный файл.

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

Обычно сначала запршивает 8 байт


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 14:43:32 
Это не хвост, это антенна
Аватар пользователя

Карма: 8
Рейтинг сообщений: 193
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1441
Рейтинг сообщения: 0
Будьте добры расшифровать что вы хотели сказать этими цитатами. Во избежание очередного недопонимания.
Спойлер
Цитата:
поскольку для ep0 допустим размер 8 байт
Согласно стандарту размер ep0 может быть 8, 16, 32 или 64 байта (для низкоскоростных - только 8 байт). Размер DeviceDescriptor составляет 18 байт, то есть в минимальный размер он не помещается. Размер Configuration или HID Descriptor'ов вообще может быть любым, в том числе больше 64 байт. Значит поддержка разбиения пакета на кусочки по размеру ep0 необходима в любом случае.
Цитата:
см. выше: библиотека это скомпилированный файл.
То-то и оно, что в заголовочниках исполняемый код не пишут.

Это общеизвестный факт, не знаю зачем его цитировать.
Цитата:
Обычно сначала запршивает 8 байт

Опять-таки: И? Ну да, обычно если размер заранее неизвестен запрашивается сначала 8 байт или минимальный размер дескриптора. Какие выводы вы из этого хотите сделать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 15:05:52 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
Цитата:
см. выше: библиотека это скомпилированный файл.
То-то и оно, что в заголовочниках исполняемый код не пишут.

Это общеизвестный факт, не знаю зачем его цитировать.
Вот именно об этом я и говорил. Категоричное ОБЩЕИЗВЕСТНЫЙ ФАКТ ничего общего не имеющее с действительностью. Все ошибаются, про 8 байт в ep0 вы же поправились. А вот тут не хочу на третий круг заходить.

Ну да, обычно если размер заранее неизвестен запрашивается сначала 8 байт или минимальный размер дескриптора.
Откуда вы это взяли? Вы готовы доказать, что 50% + 1 хостов так делают? Иначе категоричное ОБЫЧНО выглядит совершенно необоснованным.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 и USB (практика)
СообщениеДобавлено: Вт апр 06, 2021 15:24:29 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -25
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2525
Рейтинг сообщения: 0
Я бы в своей реализации хоста в случае неизвестного размера дескриптора просил бы выслать 256 байт ☺
А уж на компе так вообще можно килобайтный буфер выделить и сразу килобайт просить — чего уж там!

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 583 ]     ... , , , 22, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Юрий48 и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y