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

Суть проблемы состоит в том что, (слава всем Святым удалось сконфигурировать данный девайс, запустить ФАПЧ на 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)

Заранее спасибо)

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


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

Конкретно 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 - кол-во запрашиваемых байт.

 

Поищите в спецификации эти поля и всё станет ясно. Как найду выложу довольно полезную книгу где все эти запросы расписаны на довольно понятном английском языке :)

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


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

Спасибо за ответ)

Я вчера тоже понял в чем суть первых восьми байт)

Но непонятки на счет вторых восьми байт остаются...

и поле wLenght = 40 00 что оно может означать?... В спецификации это число байт для передачи... куда?... 4000 это 16 килобайт)))

 

Как пишет Агуров 00 01 это есть wValue

но... старший байт это есть тип дескриптора... то есть 01 - Стандартный дескриптор устройства... но почему то он на месте младшего байта...

я все посылки писал в массив и первые 8 байт стабильно 80 06 00 01 00 00 40 00 ничего больше

Изменено пользователем shrek

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


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

Для атмела существуют примеры кода по работе с USB, их можно переделать под свои нужны. На это наверное уйдет меньше времени, чем на написание стека USB полностью с нуля

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


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

Спасибо за ответ)

Я вчера тоже понял в чем суть первых восьми байт)

Но непонятки на счет вторых восьми байт остаются...

и поле 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

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


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

В общем вопрос еще такой возник...

Вот этот дескриптор устройства надо отправлять через нулевую конечную точку или через какую нить другую настроенную на работу IN по проерыванию или что то там еще?

Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь...

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


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

Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь...

Через нулевую. Дескриптор длиной 18 байт передается в трех пакетах. Если размер дескриптора кратен размеру буфера, в конце надо отправить пакет нулевой длины.

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


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

после отправки каждого пакета по идее от хоста должно следовать подтверждение приема?

и после отправки дескриптора хост должен прислать запрос установки адреса?

У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать?

в принципе вся обработка запрос USB у меня построено на обработке прерываний

и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний...

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


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

после отправки каждого пакета по идее от хоста должно следовать подтверждение приема?

Да, Вы в результате получите прерывание TXCOMP, Дальше отправляете хосту следующий пакет, пакет нулевой длины, или просто сбрасываете TXCOMP, в зависимости от обстоятельств.

 

и после отправки дескриптора хост должен прислать запрос установки адреса?

Должен, если с дескриптором все в порядке.

 

У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать?

Можете никак не обрабатывать, если не нужно.

 

и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний...

Прерывание ENDBUSRES не отключается в принципе.

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


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

То есть получается использовать USB девайс и при этом выполнять что то в режиме USER (например математику какую нибудь) не получится я так понимаю (кроме случая когда в контроллере прерываний запрещаю USB прерывания) ?

 

и еще вопрос...

Если я в буфер приемопередатчика пишу не 8 байт, а как в примере с дескриптором устройства оставшиеся 2 байта, еще необходимо 6 байт нулей записывать или нет?

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


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

Вроде бы девайс аппаратно обрабатывает сброс?...

при чтении этот бит не сбрасывается

получается что арм постоянно в прерывании находится и возможности втиснуть обработку в основную часть программы нет... кроме как непосредственно в прерывание...

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


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

МММ... В книжке Редькина этого бита нет в регистре UDP_ICR...

или это опечатка?

я собственно поэтому и спрашиваю)

 

Каюсь родной даташит не смотрел по этой теме)))

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


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

МММ... В книжке Редькина этого бита нет в регистре UDP_ICR...

Книжке Редькина место в помойке. Возьмите даташит.

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


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

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

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

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

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

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

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

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

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

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