Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mass Storage Device (MSD) на AT91Arm7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
IEC
Прошу прощения, но есть вопрос - может быть кто-нибудь подскажет?
Суть: надо сделать MSD.
USB сконфигурировали как в примере от Atmel с двумя конечными точками (не считая нулевой): 1 на выход, 2 на вход. Результат - комп (WinXP) не определяет устройство!?
Пошли дальше: через монитор USB просмотрели конфигурацию нескольких Flash накопителей - у всех сконфигурирована еще одна точка на дополнительное прерывание. При подключении к своему MSD дополнительной (3-ей) точки комп начал видеть устройство как MSD.
При изучении примера от Keil для LPC2148 обнаружилось следующее: сконфигурированы 2-е конечные точки, но, в чем парадокс, одна и таже точка (№2) сконфигурирована на вход и на выход?! smile3046.gif

Так вот вопрос:
1. Какое минимальное количество точек необходимо для реализации MSD?
2. Если по доке нельзя использовать одну точку на прием и передачу (Bulk), то что же тогда сделано в проэкте Keil?
3. Примеры от Atmel и Keil вообще работают?
vmp
Interrupt endpoint не нужен.
Рекомендую посмотреть примеры от Cypress, особенно на кит CY4611.
IEC
Примеры - это хорошо :-)
Вот посмотрел пример от микрчипа для PIC18 - те же самые две точки.
А почему же тогда WinXp не видет?
Конфигурация один в один с примерами. При инициализации доходит до Set_Configure (эту команду хост уже не отправляет) и замолкает на 20 секунд (за этот период он опять пытается прочитать дескриптор конфигурации). После этого говорит, что девайс не определен :-(



Чтобы не быть голословным - приветду пример заполнения структуры конфигурации:

const char cfgDescriptor[] = {
0x09, // CbLength
0x02, // CbDescriptorType
32, // CwTotalLength 2 EP + Control
0x00,
0x01, // CbNumInterfaces
0x01, // CbConfigurationValue
0x00, // CiConfiguration
0x80, // CbmAttributes
100, // CMaxPower

/* Bult-Only data interface discriptor */
0x09, // bLength
0x04, // bDescriptorType
0x00, // bInterfaceNumber
0x00, // bAlternateSetting
0x02, // bNumEndpoints
8, // bInterfaceClass
6, // bInterfaceSubclass - SCSI
0x50, // bInterfaceProtocol - BULK-only transport
0x00, // iInterface

/* Endpoint 1 descriptor */
0x07, // bLength
0x05, // bDescriptorType
0x81, // bEndpointAddress, Endpoint 01 - in
0x02, // bmAttributes BULK
0x40, // wMaxPacketSize
0x00,
0x00, // bInterval

/* Endpoint 2 descriptor */
0x07, // bLength
0x05, // bDescriptorType
0x02, // bEndpointAddress, Endpoint 02 - out
0x02, // bmAttributes BULK
0x40, // wMaxPacketSize
0x00,
0x00, // bInterval
};

Может это поможет разобраться.
IEC
Неужели никто из участников форума не делал MSD?
Господа, поделитесь опытом!
KAlex
Цитата(IEC @ Feb 1 2008, 11:14) *
Господа, поделитесь опытом!

Я поставил VNC1L и никаких заморочек. Правда скорость маловата, даже через параллельняй порт.
nameless
2 Kalex: не понятно - причем тут указанный "бездушный" USB-хост? человек на SAM7 делает типа систему сбора, которая сливается как флешка (думаю это именно так и используется).
2 IEC: Пример от атмела, который "USB Framework Core 1.02 + MSD 1.0" ТОЧНО работает, но требует небольших шлифовальных работ.
galjoen
Цитата(IEC @ Jan 31 2008, 12:23) *
Примеры - это хорошо :-)
Вот посмотрел пример от микрчипа для PIC18 - те же самые две точки.
А почему же тогда WinXp не видет?
Конфигурация один в один с примерами. При инициализации доходит до Set_Configure (эту команду хост уже не отправляет) и замолкает на 20 секунд (за этот период он опять пытается прочитать дескриптор конфигурации). После этого говорит, что девайс не определен :-(

У меня 2 EP и всё работает. Мегабайт в секунду качает. Больше USB 1.1 не позволяет. Сам делал. Давно. Тогда ещё примеров не было.
А дескриптор конф-ции у вас похоже правильный. Думаю не в нём дело. Хотя вот интересно. XP обычно конфигурацию за 2 приёма читает (м.б. с SP1 и начиная), а W98 за раз - более килобайта длину запрашивает. А XP 1й раз 9 байт читает - чтоб wTotalLength получить. 2й раз, зная длину, всю читает. Вы оба эти запроса видите? И с помощью чего смотрите? Киньте сюда лог - может там, что видно будет.
Vitaly_N
У меня сейчас похожая проблема. Процессор AT91SAM7A3. Заливаю в него экзампл MSD от кайла. Втыкаю во все компы в конторе - работает на всех, кроме нескольких самых новых из последней партии. "Устройство не опознано" - не прошла энумерация. Начнаю грешить на железо - провода, разъёмы, разводку... Беру экзамплы от атмела (SAM-BA, чисто энумерация, HID и CDC) - если заливаю готовые бинарники, то всё работает на всех компах! Если же пытаюсь сам скомпилировать из сорцов, то нихрена не работает. Играюсь с опциями компилятора - нифига не меняется. Хоть в арм-моде, хоть в тумбе, с частотами (коэффициентами PLL) игрался - нихрена не помогает. Не могу добиться того же результата, что и с готовым бинарником!
IEC
Цитата(galjoen @ Feb 3 2008, 23:43) *
У меня 2 EP и всё работает. Мегабайт в секунду качает. Больше USB 1.1 не позволяет. Сам делал. Давно. Тогда ещё примеров не было.
А дескриптор конф-ции у вас похоже правильный. Думаю не в нём дело. Хотя вот интересно. XP обычно конфигурацию за 2 приёма читает (м.б. с SP1 и начиная), а W98 за раз - более килобайта длину запрашивает. А XP 1й раз 9 байт читает - чтоб wTotalLength получить. 2й раз, зная длину, всю читает. Вы оба эти запроса видите? И с помощью чего смотрите? Киньте сюда лог - может там, что видно будет.


Действительно по протоколу и в реальности все так и работает, Хост отвисает после второго запроса.
Где то на форуме встречал, что человек жаловался на параметр CbmAttributes (описание режима питания). Жаловался, что со значением 0хС0 не определялся, а с 0х60 - легко. Но это не соответствует доке, т.к. 7 бит должен быть всегда установлен. Но и это предположение проверил - не работает.
Сейчас пока перешли на три end point. Когда запустим девайс, тогда будем пытаться разобраться с реалиями.
Интересно, что запросы на третью точку не идут. Даже у Flash-памяти.
galjoen
Цитата(IEC @ Feb 4 2008, 10:30) *
Действительно по протоколу и в реальности все так и работает, Хост отвисает после второго запроса.

Ну это у вас скорее всего SetAddress не проходит. Щас новые южные мосты пошли. Особенно те, которые с процессором AMD. В частности чипсет VIA (у меня такой есть). Так там эти китайцы на все стандарты наплевали. Мой full speed HID через него 500 кбайт/сек качает, а по стандарту должен токо 64. И другие глюки замечены. И SetAddress мне из-за него изменить пришлось - подглючивал с ним. Я иногда перестал успевать SETUP из EP0 прочесть, а туда уже IN1 приходил (упр-ее чтение). 2 события одновременно получатся стало - не рассчитывал я на это т.к. раньше такого не было.
Цитата(IEC @ Feb 4 2008, 10:30) *
Где то на форуме встречал, что человек жаловался на параметр CbmAttributes (описание режима питания). Жаловался, что со значением 0хС0 не определялся, а с 0х60 - легко. Но это не соответствует доке, т.к. 7 бит должен быть всегда установлен. Но и это предположение проверил - не работает.

Полно китайских флешек встречал, которые пишут, что они с независимым питанием (bmAttributes=0x40), а от USB 0 мА потребляют. А вообще-то я рекомендую MaxPower=98мА ставить (<100 мА).
Цитата(IEC @ Feb 4 2008, 10:30) *
Сейчас пока перешли на три end point. Когда запустим девайс, тогда будем пытаться разобраться с реалиями.
Интересно, что запросы на третью точку не идут. Даже у Flash-памяти.

Так 3-я - это Interrupt In. Она только для готовностей - типа дискету вытащили-вставили.
IEC
Ну наконец-то, хоть кто-то рассказал, зачем нужна третья точка :-)
СПАСИБО! ОГРОМНОЕ!
А по поводу MaxPower - это критично? Если я ему вообще поставил 200 мА, это может повлиять на определяемость девайса?
IEC
Отклонение от темы: в процессе поиска ответа на вопрос нашел книгу в эл. виде
"USB Mass Storage. Designing and Programming Devices and Embedded Hosts" Jan Axelson
Выложить на FTP не получилось, поэтому для жилающих даю ссылку: http://www.pcports.ru/Library.php
galjoen
Цитата(IEC @ Feb 4 2008, 16:34) *
А по поводу MaxPower - это критично? Если я ему вообще поставил 200 мА, это может повлиять на определяемость девайса?

Если USB порт имеет 100 мА нагрузочной способности, то не подключат. Только 2 варианта бывает: 100 и 500 мА. 100 мА имеют КПК, некоторые ноутбуки, и все хабы без внешнего питания.
IEC
Всем спасибо за ответы.
Интересно, что когда в одном устройстве скрестили два интерфейса (HID Keyboard и MSD) в MSD пришлось отключить третью точку, иначе девайс не определялся.
А с одним интерфейсом MSD девайс определяется только на трех точках.
ПАРАДОКС!
Где-то недоразобрались.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.