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

 
 
> USB - AT91SAM7A3, интерфейс USB на данном девайсе
shrek
сообщение Jan 29 2009, 13:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Суть проблемы состоит в том что, (слава всем Святым удалось сконфигурировать данный девайс, запустить ФАПЧ на 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)
Заранее спасибо)
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
mempfis_
сообщение Jan 29 2009, 13:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(shrek @ Jan 29 2009, 17:17) *
Конкретно 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 - кол-во запрашиваемых байт.

Поищите в спецификации эти поля и всё станет ясно. Как найду выложу довольно полезную книгу где все эти запросы расписаны на довольно понятном английском языке smile.gif
Go to the top of the page
 
+Quote Post
shrek
сообщение Jan 30 2009, 07:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



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

Как пишет Агуров 00 01 это есть wValue
но... старший байт это есть тип дескриптора... то есть 01 - Стандартный дескриптор устройства... но почему то он на месте младшего байта...
я все посылки писал в массив и первые 8 байт стабильно 80 06 00 01 00 00 40 00 ничего больше

Сообщение отредактировал shrek - Jan 30 2009, 07:52
Go to the top of the page
 
+Quote Post
Zayac
сообщение Jan 30 2009, 08:03
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 30-11-07
Пользователь №: 32 845



Для атмела существуют примеры кода по работе с USB, их можно переделать под свои нужны. На это наверное уйдет меньше времени, чем на написание стека USB полностью с нуля
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 30 2009, 08:11
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(shrek @ Jan 30 2009, 10:51) *
Спасибо за ответ)
Я вчера тоже понял в чем суть первых восьми байт)
Но непонятки на счет вторых восьми байт остаются...
и поле 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
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 10 2009, 09:53
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



В общем вопрос еще такой возник...
Вот этот дескриптор устройства надо отправлять через нулевую конечную точку или через какую нить другую настроенную на работу IN по проерыванию или что то там еще?
Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 11:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Feb 10 2009, 12:53) *
Или же через нулевую? Дескриптор устройства 18 байт размер буфера нулевой точки 8 байт за раз не отправишь...

Через нулевую. Дескриптор длиной 18 байт передается в трех пакетах. Если размер дескриптора кратен размеру буфера, в конце надо отправить пакет нулевой длины.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 10 2009, 12:55
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



после отправки каждого пакета по идее от хоста должно следовать подтверждение приема?
и после отправки дескриптора хост должен прислать запрос установки адреса?
У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать?
в принципе вся обработка запрос USB у меня построено на обработке прерываний
и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 13:22
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Feb 10 2009, 15:55) *
после отправки каждого пакета по идее от хоста должно следовать подтверждение приема?

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

Цитата(shrek @ Feb 10 2009, 15:55) *
и после отправки дескриптора хост должен прислать запрос установки адреса?

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

Цитата(shrek @ Feb 10 2009, 15:55) *
У девайса есть такое прерывание SOFINT по началу фрейма не подскажите как его обработать?

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

Цитата(shrek @ Feb 10 2009, 15:55) *
и еще непонятно вроде я запретил все прерывания кроме прерываний конечных точек и непонятно почему арм постоянно входит в обработку прерываний...

Прерывание ENDBUSRES не отключается в принципе.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 10 2009, 14:06
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



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

и еще вопрос...
Если я в буфер приемопередатчика пишу не 8 байт, а как в примере с дескриптором устройства оставшиеся 2 байта, еще необходимо 6 байт нулей записывать или нет?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 14:09
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Почему? Просто обрабатывайте BUSRES как надо.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 10 2009, 14:21
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Вроде бы девайс аппаратно обрабатывает сброс?...
при чтении этот бит не сбрасывается
получается что арм постоянно в прерывании находится и возможности втиснуть обработку в основную часть программы нет... кроме как непосредственно в прерывание...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 14:28
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Feb 10 2009, 17:21) *
при чтении этот бит не сбрасывается

Так сбросьте его записью в UDP_ICR.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 10 2009, 14:30
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



МММ... В книжке Редькина этого бита нет в регистре UDP_ICR...
или это опечатка?
я собственно поэтому и спрашиваю)

Каюсь родной даташит не смотрел по этой теме)))
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 14:35
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Feb 10 2009, 17:30) *
МММ... В книжке Редькина этого бита нет в регистре UDP_ICR...

Книжке Редькина место в помойке. Возьмите даташит.
Go to the top of the page
 
+Quote Post

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

 


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


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