Имеется STM32F103. В документации на USB-контроллер указана возможность "двойной буферизации" для конечных точек типа Bulk и Iso. Соответственно есть бит DBL_BUF в регистре управления конечной точкой.
Никак не могу заставить нормально работать точку типа Bulk на передачу данных в хост. Если TX_STAT выставить в VALID и рулить только DTOG_RX, то точка не переходит в NAK при равенстве DTOG_RX и DTOG_TX а весело продолжает отдавать в шину данные (смотрелось аппаратным анализатором шины USB). Если начать еще дополнительно рулить статусом TX_STAT, явно загоняя его в NAK, то там цирк вообще начинается - статус может самопроизвольно меняться NAK<->VALID.
Ошибки программы вроде бы исключил, код записи в регистр управления вынесен в отдельный файл, все обращения только через него, единый поток, обложено мутексами, хорошая повторяемость поведения.
Поковырял мусор в виде всяких примеров и китов (это жесть, сколько там какашек, хорошо что вся остальная периферия с полпинка по документации запустилась, не пришлось там копаться раньше), но там нигде не нашел варианта использования двойной буферизации именно для точки типа Bulk (для Iso есть, но это не то). Саппорт помалкивает (флешовый глючный сайт - то отдельная красота).
В связи с этим вопрос такой - у кого-то получилось использовать двойную буферизацию для Bulk согласно написанному в документации? Может кто-то подскажет работающий пример? А то надо решать - копать в этом направлении дальше (искать ошибку) или сделать закат солнца вручную софтверную двойную буферизацию. На передачу вроде несильно проблемно, а с приемом еще неясно (на передачу кучу времени убил) - может оно и работает, надо будет выгребание приостановить и посмотреть, будет ли оно NAK-ить.
|