eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2020-04-03 11:11 am

USB-CDC для STM32F103

Вчера наконец-то нашел баг в своем коде: я неправильно обрабатывал флаги в обработчике прерывания по получению пакета (когда нужно было очистить флаг CTR_RX)! Ведь тип toggle имеют не только флаги DTOG, но и флаги STAT! А я сохранял лишь DTOG'и, в итоге у меня состояние конечной точки при слишком интенсивном обмене сбрасывалось в unavailable!
А всего-то нужно было сделать вот так:
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'шных вещах внести соответствующие изменения.

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