t25a3 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Суть проблемы состоит в том что, (слава всем Святым удалось сконфигурировать данный девайс, запустить ФАПЧ на 96 МГц, контроллер прерываний!!! и прочие нужные настройки, обеспечивающие нормальное функционирование контроллера) когда я на этой платке подключаю (благо есть возможность) с помощью ноги PB1 резистор подтягивающий шину D+ к +3,3 вольтам комп мне присылает запрос в виде набора байтов. Конкретно 80 06 00 01 00 00 40 00 3E FC C3 0D C1 B8 69 2E. Возникает вопрос как обработать данную последовательность байтов?... Обратился к источнику "Агуров Интерфейс USB практика использования и программирования". показалось что 8006 - это запрос дескриптора устройства, а 0001 - это что то связанное с очисткой девайся USB контроллера... А остальные байты?... непонятно... В скачанной спецификации USB с офсайта не нашел или плохо искал... По крайней мере мне так показалось что там этого нет... Вот и прошу помощи) Уважаемые Гуру форума направте пожалуйста на нужные источники для успешного освоения девайса USB и протокола USB) Заранее спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 29 января, 2009 Опубликовано 29 января, 2009 · Жалоба Конкретно 80 06 00 01 00 00 40 00 3E FC C3 0D C1 B8 69 2E. Возникает вопрос как обработать данную последовательность байтов?... Обратился к источнику "Агуров Интерфейс USB практика использования и программирования". показалось что 8006 - это запрос дескриптора устройства, а 0001 - это что то связанное с очисткой девайся USB контроллера... А остальные байты?... непонятно... В скачанной спецификации USB с офсайта не нашел или плохо искал... По крайней мере мне так показалось что там этого нет... В спецификации всё это описано. И в Агурове тоже. Из всего вашего набора байт запрос только первые 8. Запросы состоят из стандартных полей по 2 байта wRequest wValue wIndex wLenth Процесс энумерации на шине состоит из запроса дескрипторов. Первый который приходит GET_DESCRIPTOR_DEVICE wRequest = 0x8006 Это стандартный запрос от хост-контроллера (ещё бывают запросы класса). Далее идёт тип запрашиваемого дескриптора. Их много, вот некоторые из них: #define device 0x0100 #define configuration 0x0200 #define string_language 0x0300 #define string_manufacture 0x0301 #define string_product 0x0302 #define string_sn 0x0303 #define interface 0x0400 Для чего нужно поле wIndex точно не помню. Поле wLenth - кол-во запрашиваемых байт. Поищите в спецификации эти поля и всё станет ясно. Как найду выложу довольно полезную книгу где все эти запросы расписаны на довольно понятном английском языке :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 30 января, 2009 Опубликовано 30 января, 2009 (изменено) · Жалоба Спасибо за ответ) Я вчера тоже понял в чем суть первых восьми байт) Но непонятки на счет вторых восьми байт остаются... и поле wLenght = 40 00 что оно может означать?... В спецификации это число байт для передачи... куда?... 4000 это 16 килобайт))) Как пишет Агуров 00 01 это есть wValue но... старший байт это есть тип дескриптора... то есть 01 - Стандартный дескриптор устройства... но почему то он на месте младшего байта... я все посылки писал в массив и первые 8 байт стабильно 80 06 00 01 00 00 40 00 ничего больше Изменено 30 января, 2009 пользователем shrek Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zayac 0 30 января, 2009 Опубликовано 30 января, 2009 · Жалоба Для атмела существуют примеры кода по работе с USB, их можно переделать под свои нужны. На это наверное уйдет меньше времени, чем на написание стека USB полностью с нуля Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 30 января, 2009 Опубликовано 30 января, 2009 · Жалоба Спасибо за ответ) Я вчера тоже понял в чем суть первых восьми байт) Но непонятки на счет вторых восьми байт остаются... и поле wLenght = 40 00 что оно может означать?... В спецификации это число байт для передачи... куда?... 4000 это 16 килобайт))) Как пишет Агуров 00 01 это есть wValue но... старший байт это есть тип дескриптора... то есть 01 - Стандартный дескриптор устройства... но почему то он на месте младшего байта... я все посылки писал в массив и первые 8 байт стабильно 80 06 00 01 00 00 40 00 ничего больше Поля bmRequestType и bRequest однобайтные. Все остальные поля двухбайтные. Я уже точно не помню но кажется по спецификации при двухбайтных параметрах сначала передаётся младший байт потом старший (отсюда и получается wLenght = 40 00 = low byte:high byte т.е. длина = 0040h = 64 байта) Посмотрите приложенную книгу - я по ней когдато разбирался со стандартными запросами. Там всё коротко и довольно понятно. Все неясные моменты лучше смотреть в спецификации. Создайте по этой книге вот такой дескриптор устройства: //Структура дескриптора устройства /* Global constant structure located in FLASH */ flash struct st_usb_device_descriptor { int bLenth; //длина дескриптора int bDescriptorType; //тип дескриптора int bcdUSBL; //версия спецификации USB в формате BCD int bcdUSBH; //версия спецификации USB в формате BCD int bDeviceClass; //код класса устройства USB int bDeviceSubclass; //код подкласса устройства USB int bDeviceProtocol; //код протокола USB int bMaxPacketSize0; //мах размер нулевой конечной точки int idVendorL; //идентификатор изготовителя устройства int idVendorH; //идентификатор изготовителя устройства int idProductL; //идентификатор продукта int idProductH; //идентификатор продукта int bcdDeviceL; //номер версии устройства в формате BCD int bcdDeviceH; //номер версии устройства в формате BCD int iManufacture; //индекс дескриптора строки описывающей изготовителя int iProduct; //индекс дескриптора строки описывающей продукт int iSerialNumber; //индекс дескриптора строки описывающей серийный номер устройства int bNumConfigurations; //количество возможных конфигураций устройства }; Попробуйте отослать его и дождатся следующего запроса SET_ADDRESS 0x0005 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба В общем вопрос еще такой возник... Вот этот дескриптор устройства надо отправлять через нулевую конечную точку или через какую нить другую настроенную на работу IN по проерыванию или что то там еще? Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь... Через нулевую. Дескриптор длиной 18 байт передается в трех пакетах. Если размер дескриптора кратен размеру буфера, в конце надо отправить пакет нулевой длины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба после отправки каждого пакета по идее от хоста должно следовать подтверждение приема? и после отправки дескриптора хост должен прислать запрос установки адреса? У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать? в принципе вся обработка запрос USB у меня построено на обработке прерываний и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба после отправки каждого пакета по идее от хоста должно следовать подтверждение приема? Да, Вы в результате получите прерывание TXCOMP, Дальше отправляете хосту следующий пакет, пакет нулевой длины, или просто сбрасываете TXCOMP, в зависимости от обстоятельств. и после отправки дескриптора хост должен прислать запрос установки адреса? Должен, если с дескриптором все в порядке. У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать? Можете никак не обрабатывать, если не нужно. и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний... Прерывание ENDBUSRES не отключается в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба То есть получается использовать USB девайс и при этом выполнять что то в режиме USER (например математику какую нибудь) не получится я так понимаю (кроме случая когда в контроллере прерываний запрещаю USB прерывания) ? и еще вопрос... Если я в буфер приемопередатчика пишу не 8 байт, а как в примере с дескриптором устройства оставшиеся 2 байта, еще необходимо 6 байт нулей записывать или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба Почему? Просто обрабатывайте BUSRES как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба Вроде бы девайс аппаратно обрабатывает сброс?... при чтении этот бит не сбрасывается получается что арм постоянно в прерывании находится и возможности втиснуть обработку в основную часть программы нет... кроме как непосредственно в прерывание... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба при чтении этот бит не сбрасывается Так сбросьте его записью в UDP_ICR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
t25a3 0 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба МММ... В книжке Редькина этого бита нет в регистре UDP_ICR... или это опечатка? я собственно поэтому и спрашиваю) Каюсь родной даташит не смотрел по этой теме))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 февраля, 2009 Опубликовано 10 февраля, 2009 · Жалоба МММ... В книжке Редькина этого бита нет в регистре UDP_ICR... Книжке Редькина место в помойке. Возьмите даташит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться