Перейти к содержанию
    

STM32F103 USB device

Имеется 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-ить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В связи с этим вопрос такой - у кого-то получилось использовать двойную буферизацию для Bulk согласно написанному в документации? Может кто-то подскажет работающий пример?

Конечно получилось, но на самом деле всё это работает не совсем так, как описано в документации.

Подробностей сейчас уже не помню, исходники MSC в аттаче, сами посмотрите, код не особо причёсан, но работает хорошо, двойная буферизация позволяет выжать из STM максимум - до 1 мегабайта в сек. на приём и передачу.

 

MSC.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно получилось, но на самом деле всё это работает не совсем так, как описано в документации.

Большое спасибо за ответ и пример кода - Вы вселили в меня уверенность :)

Cегодня утром сделал свой вариант "программной" двойной буферизации. Используется тоже два буфера, только по готовности передатчика "тоглится" не SW_BUF (RX_DTOG) , а статус передатчика (NAK->VALID), ну и при этом предварительно записывается дескриптор второго буфера (это единственный недостаток по сравнению с аппаратным DBL_BUF - запись двух дополнительных слов). Вообще, таким программным методом можно сделать и "тройную" и "квадро" буферизацию - насколько локальной памяти контроллера хватит.

Потом еще покопался с аппаратной буферизацией. В-общем, дело оказалось в том, что первая транзакция - она не такая как все, и это написано в документации (читать просто нужно было очень внимательно). После первой транзакции передатчик не переходит VALID->NAK если DTOG_TX==SW_BUF и, соответственно не останавливается, - шурует еще следующий буфер и еще один (если SW_BUF не изменить).

В-общем, сейчас получилось два работающих варианта - двойная аппаратная и N-кратная софтверная буферизации. Анализатор, кстати, отличий на шине не показывает - все транзакции ACK-аются сразу, то есть контроллер и вышележащие слои USB-стека успевают все обработать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...