VslavX 0 26 февраля, 2012 Опубликовано 26 февраля, 2012 · Жалоба Имеется 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-ить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба В связи с этим вопрос такой - у кого-то получилось использовать двойную буферизацию для Bulk согласно написанному в документации? Может кто-то подскажет работающий пример? Конечно получилось, но на самом деле всё это работает не совсем так, как описано в документации. Подробностей сейчас уже не помню, исходники MSC в аттаче, сами посмотрите, код не особо причёсан, но работает хорошо, двойная буферизация позволяет выжать из STM максимум - до 1 мегабайта в сек. на приём и передачу. MSC.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 27 февраля, 2012 Опубликовано 27 февраля, 2012 · Жалоба Конечно получилось, но на самом деле всё это работает не совсем так, как описано в документации. Большое спасибо за ответ и пример кода - Вы вселили в меня уверенность :) Cегодня утром сделал свой вариант "программной" двойной буферизации. Используется тоже два буфера, только по готовности передатчика "тоглится" не SW_BUF (RX_DTOG) , а статус передатчика (NAK->VALID), ну и при этом предварительно записывается дескриптор второго буфера (это единственный недостаток по сравнению с аппаратным DBL_BUF - запись двух дополнительных слов). Вообще, таким программным методом можно сделать и "тройную" и "квадро" буферизацию - насколько локальной памяти контроллера хватит. Потом еще покопался с аппаратной буферизацией. В-общем, дело оказалось в том, что первая транзакция - она не такая как все, и это написано в документации (читать просто нужно было очень внимательно). После первой транзакции передатчик не переходит VALID->NAK если DTOG_TX==SW_BUF и, соответственно не останавливается, - шурует еще следующий буфер и еще один (если SW_BUF не изменить). В-общем, сейчас получилось два работающих варианта - двойная аппаратная и N-кратная софтверная буферизации. Анализатор, кстати, отличий на шине не показывает - все транзакции ACK-аются сразу, то есть контроллер и вышележащие слои USB-стека успевают все обработать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться