|
|
  |
USB своими руками для sam7x256, или проблемы с которыми я столкнулся. |
|
|
|
Jan 31 2011, 12:11
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757

|
Сброс обязательно будет не один. При подключении устройства Windows первым делом дает сброс, а затем запрашивает дескриптор. После получения первых 8 байт дескриптора опять дается второй сброс, без завершения получения дескриптора. После второго сброса уже идет полная энумерация.
Вот, нашел.
Энумерация USB устройства в Windows включает следующие шаги:
1. Хост (или концентратор) распознает подключение нового устройства с помощью подтягивающего резистора на линии данных. Хост ожидает по меньшей мере 100 мс, что бы процесс физического подключения был полностью завершен и в подключаемом устройстве стабилизировалось питание. 2. Хост производит сброс устройства в состояние по умоланию. Устройство должно отвечать на нулевой адрес. 3. MS Windows запрашивает первые 64 байта дескриптора устройства. 4. После получения первых 8 байтов дескриптора устройства, хост сразу же генерирует второй сброс. 5. Хост выдает команду "Установить адрес", переводя устройство в адресуемое состояние. 6. Хост запрашивает 18 байт дескриптора устройства. 7. Затем он запрашивает 9 байт дескриптора конфигурации, чтобы определить общий размер дескрипторов. 8. Хост запрашивает 255 байт дескриптора конфигурации. (Но отвечать надо реальным количеством байт дескриптора). 9. Хост запрашивает все строковые дескрипторы, если они были указаны.
Сообщение отредактировал Chameleon - Jan 31 2011, 12:27
|
|
|
|
|
Feb 14 2011, 11:48
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
Здравствуйте, а не встречались с такой проблеммой?: при работе с отладочной платой при подключении USB в UDP_ISR выставляется ENDBUS, SUSPEND и RESUME, SOF и прерывание EP0. А при работе со своим устройством но темже самым проектом получаю только , SUSPEND и RESUME.
|
|
|
|
|
Feb 15 2011, 14:55
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Сталкнулся с той-же проблемой... Приходят только Reset, SOF, Suspend и больше ничего. Хотя еще вчера все работало Думаю, что после того как начал потреблять от шины перевалил за 100 мА... Пытаюсь все вернуть назад.
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 15 2011, 17:21
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Возврат к "только процессор на порту" результатов не дал. Вопрос открыт
Сообщение отредактировал e0000 - Feb 15 2011, 17:22
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 16 2011, 13:18
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
странно. у меня устройство запитывается от внешнего источника, а не от USB. но на EK плате я подключал тоже от внешнего, всё работало. надо проверить: если VSUB не доходит до GND на схеме(на моей только конденсатор к земле), то, может, хост не понимает, что надо сетупить устройство и не те пакеты шлёт => MK не выставляет прерывание конечной точки. я смотрел через отладчик: UDP_CSR[0] равен 0 в момент прерывания, а должен быть с битом RXSETUP.
|
|
|
|
|
Feb 16 2011, 18:46
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Прошу прощения у всезнаеющего All-a, но я уже не знаю что делать и прошу, если кто знает, ответить. Почему HOST не присылает SETUP запросов? Наверное даже не так: В каких случаях host их может не присылать?
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 16 2011, 18:52
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(e0000 @ Feb 16 2011, 21:46)  Прошу прощения у всезнаеющего All-a, но я уже не знаю что делать и прошу, если кто знает, ответить. Почему HOST не присылает SETUP запросов? Наверное даже не так: В каких случаях host их может не присылать? Что, даже не пытается прочитать дескриптор устройства ? А может, он как раз и присылает запросы, да вы их своим устройством не видите ? Или вы забываете подключиться к шине (т.е., резистор, например, у вас одним выводом подключен на D+, в то время как другой его вывод никуда не подключен) ? BusHound что говорит ? А осциллограф (маркеры SOF идут) ?
Сообщение отредактировал kovigor - Feb 16 2011, 18:54
|
|
|
|
|
Feb 17 2011, 07:53
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(kovigor @ Feb 16 2011, 20:52)  Что, даже не пытается прочитать дескриптор устройства ? А может, он как раз и присылает запросы, да вы их своим устройством не видите ? Или вы забываете подключиться к шине (т.е., резистор, например, у вас одним выводом подключен на D+, в то время как другой его вывод никуда не подключен) ? BusHound что говорит ? А осциллограф (маркеры SOF идут) ? "Дословно": Pull Up On (осцилографом вижу, что таки резистор подключен) Suspend Reset Reset Suspend Timeout to Connect. Pull Up Off Pull Up On ... И далее все по новой. Timeout - отсчитывает 20 сек после подключения резистора, если устойство не иннумеровано. >>> BusHound что говорит ? "Такой борьбы не знаю" (с) Гостья из будующего  Что за софт/железо? >>> А осциллограф (маркеры SOF идут) ? нет  Перезапуск машины и опробование на еще 3-х результат тотже...
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 17 2011, 10:19
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
BusHound Скачал, поставил... SETUP пакетов именно для моего девайса не присылает Для других устройств все красиво и четко. PS К нему кряк какой нибудь есть? Платить почти $800 за Full Version как-то...
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 17 2011, 17:42
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Цитата(kovigor @ Feb 17 2011, 15:12)  Есть. Вы просто плохо искали ... Большое спасибо за BusHound Ситуация такова: BusHound говорит, что после reset у меня нет ниодноuj EP  Я четко прописал и вижу, что в UDP_CSR0 EPEDS взведен и только в нем. Остальное - нули...
Сообщение отредактировал e0000 - Feb 17 2011, 17:43
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Feb 21 2011, 08:33
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
У меня сначала знакомства с USB "своими руками" были так же постоянные проблемы. (сейчас вроде норм... тьфу-тьфу-тьфу) У меня AT91SAM7A3. Рассматривал ATMELовские примеры... Но я их как то не вкурил или не докурил... Писал все сам с поддержкой Агурова, спецификации USB 2.0 и гуру пользователя aaarrr и всех кто принимал участие (Большое Вам Спасибо!  ). Обычно я сначала в инициализации периферии инициализировал сначала частоты Код //---Конфигурация контроллера питания------------------------------------------- AT91C_BASE_CKGR -> CKGR_MOR = 0x00000F01; //MOSCEN = 1, OSCBYPASS = 0, OSCOUNT = 0xF, конфигурация генератора (от кварца) AT91C_BASE_PMC -> PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK | AT91C_PMC_PRES_CLK; //источник тактовых импульсов кварц MCK 18.432 MHz while (!((AT91C_BASE_PMC -> PMC_SR) & AT91C_PMC_MCKRDY)); //ждать пока не будет готова частота MCK AT91C_BASE_CKGR -> CKGR_PLLR = 0x107C3F18; //USBDIV = 0b01, MUL = 0x7C, OUT = 0b00, PLLCOUNT = 0x3F, DIV = 0x18 частота PLL 96 MHz while (!((AT91C_BASE_PMC -> PMC_SR) & AT91C_PMC_LOCK)); //ждать пока не замкнется петля обратной связи AT91C_BASE_PMC -> PMC_SCER = AT91C_PMC_PCK | AT91C_PMC_UDP; //разрешение тактирования ядра и USB не забывая включить пользовательски сброс. Потом контроллер прерываний Код //---Конфигурация контроллера прерываний---------------------------------------- AT91C_BASE_AIC -> AIC_IDCR = AT91C_ALL_INT; //запрещение всех прерываний AT91C_BASE_AIC -> AIC_ICCR = AT91C_ALL_INT; //сброс всех прерываний AT91C_BASE_AIC -> AIC_EOICR = 0xF1F1F1F1; //запись в регистр конца прерывания AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_N_UDP] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0;//режим прерывания IRQ от USB запуск высоким уровнем!!! AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_N_UDP] = (int) usb; //адрес обработчика прерывания IRQ от USB AT91C_BASE_AIC -> AIC_IDCR = AT91C_ALL_INT; //запрещение всех прерываний Дальше иницилизировал сам контроллер USB Код //---Конфигурация USB----------------------------------------------------------- AT91C_BASE_PMC -> PMC_PCER = AT91C_ID_UDP; AT91C_BASE_UDP -> UDP_GLBSTATE = 0; AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_CLEAR_INT; //Сброс прерываний AT91C_BASE_UDP -> UDP_RSTEP = AT91C_UDP_ALL_EP; //Сброс всех конечных точек AT91C_BASE_UDP -> UDP_IDR = AT91C_UDP_ALL_INT | AT91C_UDP_ALL_EP; //Запрещаем все прерывания AT91C_BASE_UDP -> UDP_IER = AT91C_UDP_ALL_INT | AT91C_UDP_EPINT0; //Разрешить прерывание от 0 AT91C_BASE_UDP -> UDP_CSR[AT91C_UDP_EP0] = AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS;//0 конечная контрольная точка Я все (ну или почти все) проинициализировал. Можно прикрутить модуль UART для отладки что я и делал. Смотрел какие пакеты приходят и в каких прерываниях висит устройство. Сразу скажу что устройство после сброса будет постоянно вистеть в прерывании SOF(кадр каждую милисекунду приходит). Так... далее Код AT91C_BASE_AIC -> AIC_IECR = AT91C_ID_UDP; AT91C_BASE_PIOB -> PIO_CODR = AT91C_PIO_PB1; Включаем прерывания USB и подтягивающий резистор (в ките AT91SAM7A3-EK). И понеслась... Хост несколько раз сначала сбрасывает устройство... Код //---Обработчик прерываний USB-------------------------------------------------- void usb() { //---Обработка прерываний от конечных точек------------------------------------- switch ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_ALL_EP) { case AT91C_UDP_EPINT0: {POINT = 0; USB_EP_INT(); break;} //в зависимости от вызвавшей конечной точки прерывания присваиваем соответствующий индекс case AT91C_UDP_EPINT1: {POINT = 1; USB_EP_INT(); break;} case AT91C_UDP_EPINT2: {POINT = 2; USB_EP_INT(); break;} case AT91C_UDP_EPINT3: {POINT = 3; USB_EP_INT(); break;} case AT91C_UDP_EPINT4: {POINT = 4; USB_EP_INT(); break;} case AT91C_UDP_EPINT5: {POINT = 5; USB_EP_INT(); break;} default: break; } //------------------------------------------------------------------------------ if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_RXRSM) { AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_RXRSM; } //------------------------------------------------------------------------------ if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_RXSUSP) { AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_RXSUSP; } //---Обработка прерывания по началу кадра--------------------------------------- if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_SOFINT) { AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_SOFINT; } //---Конфигурация USB при сбросе шины------------------------------------------- if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_ENDBUSRES) { AT91C_BASE_UDP -> UDP_IDR = AT91C_UDP_ALL_INT | AT91C_UDP_ALL_EP; //Запрещаем все прерывания AT91C_BASE_UDP -> UDP_IER = AT91C_UDP_ALL_INT | AT91C_UDP_EPINT0; //Разрешить прерывание от 0 AT91C_BASE_UDP -> UDP_CSR[AT91C_UDP_EP0] = AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS;//0 конечная контрольная точка AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_ENDBUSRES; //Сброс прерывания по сбросу шины } //------------------------------------------------------------------------------ if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_WAKEUP) { AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_WAKEUP; } //---Прерывание обработано------------------------------------------------------ AT91C_BASE_AIC -> AIC_EOICR = 0xF1F1F1F1; //Сообщаем AIC прерывание обработал :-) } После сброса устройство надо заново проинициализировать (по крайней мере по совету aaarrr мне это помогло), а так было как у вас. Кстати бит прерывания сброса надо очистить, чтобы устройство в нем не пребывало постоянно. Как видно я обрабатываю только 2 прерывания, а остальные все сбрасываю. Обрабатываю прерывания по конечной точке и по сбросу шины (и в нем же сразу заново инициализирую устройство). Мой первый пост про USBНу а дальше все по идее должно заработать. (должен прислать setup пакет вида 80 06 00 01 00 00 40 00)
Сообщение отредактировал shrek - Feb 21 2011, 08:46
|
|
|
|
|
Feb 24 2011, 07:59
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
"После сброса устройство надо заново проинициализировать " - это имеется в виду прерывание ENDBUS? вообщем не помогло. всё так же нет прерывания конечной точки. у меня конфигурация частоты вынесена в стартуп, может в основном теле программы повторить? глаза замылились, чувствую, что бьюсь о стенку. уже вторую плату сделали - тоже самое
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|