Apr. 29th, 2023

eddy_em: (Default)
В отличие от шуточной реализации (без особого функционального применения) семи 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 задал (если кто знает — ответьте там, бонусы себе заработаете).

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 05:50 am
Powered by Dreamwidth Studios