Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

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'шных вещах внести соответствующие изменения.
Tags: stm32, железяки, рукожопие
Subscribe

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 2 comments