eddy_em: (Default)
[personal profile] eddy_em
Вчера наконец-то нашел баг в своем коде: я неправильно обрабатывал флаги в обработчике прерывания по получению пакета (когда нужно было очистить флаг 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'шных вещах внести соответствующие изменения.

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 04:39 pm
Powered by Dreamwidth Studios