USB-CDC для STM32F103
Apr. 3rd, 2020 11:11 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вчера наконец-то нашел баг в своем коде: я неправильно обрабатывал флаги в обработчике прерывания по получению пакета (когда нужно было очистить флаг CTR_RX)! Ведь тип toggle имеют не только флаги DTOG, но и флаги STAT! А я сохранял лишь DTOG'и, в итоге у меня состояние конечной точки при слишком интенсивном обмене сбрасывалось в unavailable!
А всего-то нужно было сделать вот так:
Ну и в остальных местах пофиксил подобные баги. В итоге все работает, как надо: при приеме пакета CTR_RX сбрасывается, а STAT_RX не меняется, оставаясь NACK. В итоге хост приостанавливает отправку данных вплоть до получения ACK, который я выставляю в функции USB_receive — когда данные уже однозначно пошли в буфер для дальнейшей обработки, и можно в USB-буфер принимать очередную порцию.
Теперь остается во всех остальных USB'шных вещах внести соответствующие изменения.
А всего-то нужно было сделать вот так:
static void receive_Handler(){ // EP2OUT
rxNE = 1;
uint16_t epstatus = KEEP_DTOG_STAT(USB->EPnR[2]);
USB->EPnR[2] = (epstatus & ~(USB_EPnR_CTR_RX)); // clear RX ctr
}
Ну и в остальных местах пофиксил подобные баги. В итоге все работает, как надо: при приеме пакета CTR_RX сбрасывается, а STAT_RX не меняется, оставаясь NACK. В итоге хост приостанавливает отправку данных вплоть до получения ACK, который я выставляю в функции USB_receive — когда данные уже однозначно пошли в буфер для дальнейшей обработки, и можно в USB-буфер принимать очередную порцию.
Теперь остается во всех остальных USB'шных вещах внести соответствующие изменения.