реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103 USB device, Кто-нибудь использовал двойную буферизацию для Bulk?
VslavX
сообщение Feb 26 2012, 23:19
Сообщение #1


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Имеется 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-ить.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 27 2012, 09:20
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(VslavX @ Feb 27 2012, 03:19) *
В связи с этим вопрос такой - у кого-то получилось использовать двойную буферизацию для Bulk согласно написанному в документации? Может кто-то подскажет работающий пример?

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

Прикрепленный файл  MSC.rar ( 22.02 килобайт ) Кол-во скачиваний: 170
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 27 2012, 12:17
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(sonycman @ Feb 27 2012, 11:20) *
Конечно получилось, но на самом деле всё это работает не совсем так, как описано в документации.

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

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016