Семь USB-CDC на STM32F303
Apr. 29th, 2023 07:00 pmВ отличие от шуточной реализации (без особого функционального применения) семи 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 задал (если кто знает — ответьте там, бонусы себе заработаете).
Довольно-таки долго мучился с багами: почему-то если размер буферов 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 задал (если кто знает — ответьте там, бонусы себе заработаете).