eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2023-04-29 07:00 pm

Семь USB-CDC на STM32F303

В отличие от шуточной реализации (без особого функционального применения) семи CDC на STM32F103, на сей раз я решил сделать уже полноценную реализацию на F303 (выбор МК объясняется просто моей ленью: в "вундервафле" для LQFP-48 торчал F303, и я решил не менять на F072 (а на F103 такое не реализовать, т.к. у него CAN и USB одновременно не работают).
Довольно-таки долго мучился с багами: почему-то если размер буферов EP0 сделать 8 байт, ничего не работает (в смысле — дескрипторы высылаются, рукопожатие происходит, но вот обмена нет). Потом я наткнулся на то, что ведь у STM32F303CBT6 де-факто всего лишь 192 байта под буферы (из-за адресации uint16_t как uint32_t). Сделал буферы EP1..EP7 по четыре байта — наткнулся на баг: если я отсылаю больше 4 байт за раз, то в МК вообще ничего не приходит (возможно, в модуле CDC минимальный размер буфера привязали жестко к 8Б)! Сделал 8 байт — ОК. Потом снизил буферы EP0 до 16 байт (так работает), а т.к. появилась дополнительная куча памяти, то для остальных конечнВ отличие от шуточной реализации (без особого функционального применения) семи CDC на STM32F103, на сей раз я решил сделать уже полноценную реализацию на F303 (выбор МК объясняется просто моей ленью: в "вундервафле" для LQFP-48 торчал F303, и я решил не менять на F072 (а на F103 такое не реализовать, т.к. у него CAN и USB одновременно не работают).
Довольно-таки долго мучился с багами: почему-то если размер буферов EP0 сделать 8 байт, ничего не работает (в смысле — дескрипторы высылаются, рукопожатие происходит, но вот обмена нет). Потом я наткнулся на то, что ведь у STM32F303CBT6 де-факто всего лишь 192 байта под буферы (из-за адресации uint16_t как uint32_t). Сделал буферы EP1..EP7 по четыре байта — наткнулся на баг: если я отсылаю больше 4 байт за раз, то в МК вообще ничего не приходит (возможно, в модуле CDC минимальный размер буфера привязали жестко к 8Б)! Сделал 8 байт — ОК. Потом снизил буферы EP0 до 16 байт (так работает), а т.к. появилась дополнительная куча памяти, то для остальных конечных точек сделал буфер передачи 8Б, а буфер приема — 14Б.
Всего у меня 7 устройств: 0 - управление всякими разными вещами (сюда же можно настройку проксирования между USART'ами воткнуть), 1 - интерфейс отладки (туда всякое разное может сыпаться в большом количестве), потом 3 USART'а, "заглушка" (т.к. USART4 у F303CB отсутствует) и CAN-USB.

Из крупных косяков осталась невозможность определения отключения терминала: если "эмулятор PL2303" при этом получал сигнал BREAK и я мог установить переменную usbON в нуль, то здесь BREAK не приходит (опять, похоже, недоработка линуксового модуля CDC). В общем, понять, что интерфейс уже отключился, невозможно. Я даже вопрос на SO задал (если кто знает — ответьте там, бонусы себе заработаете).ых точек сделал буфер передачи 8Б, а буфер приема — 14Б.
Всего у меня 7 устройств: 0 - управление всякими разными вещами (сюда же можно настройку проксирования между USART'ами воткнуть), 1 - интерфейс отладки (туда всякое разное может сыпаться в большом количестве), потом 3 USART'а, "заглушка" (т.к. USART4 у F303CB отсутствует) и CAN-USB.

Из крупных косяков осталась невозможность определения отключения терминала: если "эмулятор PL2303" при этом получал сигнал BREAK и я мог установить переменную usbON в нуль, то здесь BREAK не приходит (опять, похоже, недоработка линуксового модуля CDC). В общем, понять, что интерфейс уже отключился, невозможно. Я даже вопрос на SO задал (если кто знает — ответьте там, бонусы себе заработаете).

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org