USB на STM32F303
Feb. 14th, 2022 02:43 pmПромучился вчера часов пять с непонятной проблемой: вроде бы периферия USB у F303 такая же убогая, как у F103, т.е. можно 1-в-1 перенести. А не работала, зараза! Уже дошел до скрупулезной проверки тактирования, пока не увидел косяк в своем коде: в отличие от F0x2, здесь нужно инициализировать ноги. И вот, что я нарисовал:
Т.е., чтобы вычислить смещение в битах второго байта, я вместо 8 вычел из 11 и 12 семерку! А правильно — так:
Т.е. инициализировал я только USB_DP, а нога DM оставалась неинициализированной — вот оно дальше USB reset и не шло! Как только поменял — все заработало.
Но мне не нравится эта реализация: довольно-таки тупая, буду делать большой кольцевой буфер с автоотправкой очередных 64 байт после каждого прерывания EP3IN.
GPIOA->MODER = (GPIOA->MODER & (~GPIO_MODER_MODER15_Msk | GPIO_MODER_MODER11_Msk | GPIO_MODER_MODER12_Msk)) |
GPIO_MODER_MODER11_AF | GPIO_MODER_MODER12_AF | GPIO_MODER_MODER15_O;
// USB - alternate function 14 @ pins PA11/PA12
GPIOA->AFR[1] = (GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH4_Msk | GPIO_AFRH_AFRH5_Msk)) |
(14 << (4 * 4)) | (14 << (5 * 4));
Т.е., чтобы вычислить смещение в битах второго байта, я вместо 8 вычел из 11 и 12 семерку! А правильно — так:
GPIOA->AFR[1] = (GPIOA->AFR[1] & ~(GPIO_AFRH_AFRH3_Msk | GPIO_AFRH_AFRH4_Msk)) |
(14 << (3 * 4)) | (14 << (4 * 4));
Т.е. инициализировал я только USB_DP, а нога DM оставалась неинициализированной — вот оно дальше USB reset и не шло! Как только поменял — все заработало.
Но мне не нравится эта реализация: довольно-таки тупая, буду делать большой кольцевой буфер с автоотправкой очередных 64 байт после каждого прерывания EP3IN.