|
|
  |
проблемы с настройкой модуля USB в AT91SAM7S256 |
|
|
|
Oct 24 2007, 06:16
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Добрый день , уважаемые форумчане Помогите начинающему работать с USB. Щупаю пример от Атмеля at91_demo_massstorage_fs Возникло несколько вопросов по работе модуля USB:
1.При запуске проги , но не подключённом у-ве к хосту вижу что постоянно влетаю в прерывание по флагу ENDBUSRES, которое вообще должно возникать при подключениие к хосту . Флаг этот должен сбрасываться следующим кодом AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT ); AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT ); AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0| AT91C_UDP_RXSUSP | AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM | AT91C_UDP_SOFINT );
но почему то код не работает , флаг ENDBUSRES остаётся взведённым . И вообще состояние регистров не меняется и в итоге прога постоянно крутится в прерывании.
2. Первоначально маска прерываний конфигурится в состояние по умолчанию - прерывание только по флагу RXRSM . При нормальной работе модуля , при подключении к хосту по этому флагу возникает прерывание , такой же вышепреведённый код отрабатывает нормально , начинается процесс нумерации.
А иногда бывает что у-во подключено , а никакой реакции на компе нет , прерывания только по ENDBUSRES , по RXRSM прерывания нет , у-во на компе не видно .
|
|
|
|
|
Oct 24 2007, 08:04
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Цитата(aaarrr @ Oct 24 2007, 11:14)  1. Скорее всего, флаг сбрасывается нормально, а Ваше устройство просто постоянно ловит BUSRES, пока не подключено к шине. 1-2. Как организовано подключение pull-up на D+? Подключение pull-up организовано через полевой транзистор типа IRLML5203. Тут есть некоторые сомнения - резюк 1.5 кОм подтягивает линию к уровню примерно 5.1 В при подключённом к хосту девайсе ( берётся от питания шины ). По докам надо вообще к 3.3 если я правильно понял. Разаработчик платы уверяет что это нормально , работать должон... Это принципиально ? Насчёт сброса флага - всё может быть конечно , но эти команды выполняются в обработчике прерывания по соответствуюшему вектору , мне кажется вряд ли между 3 командами между 2 точками останова , я как то успеваю попасть в это же прерывание , и никак не заметить это по точкам остонова ? . Или я не прав ?
|
|
|
|
|
Oct 24 2007, 08:27
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(coolzero @ Oct 24 2007, 12:04)  По докам надо вообще к 3.3 если я правильно понял. Разаработчик платы уверяет что это нормально , работать должон... Это принципиально ? Это не нормально, нужно исправить. Цитата(coolzero @ Oct 24 2007, 12:04)  Насчёт сброса флага - всё может быть конечно , но эти команды выполняются в обработчике прерывания по соответствуюшему вектору , мне кажется вряд ли между 3 командами между 2 точками останова , я как то успеваю попасть в это же прерывание , и никак не заметить это по точкам остонова ? . Или я не прав ? Я не совсем понимаю, что именно Вы наблюдаете в прерывании. Между двумя точками останова можно сотню раз успеть поставить флаг. С JTAG'ом в прерываниях нужно быть осторожнее.
|
|
|
|
|
Oct 24 2007, 09:00
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
[quote name='aaarrr' date='Oct 24 2007, 12:27' post='312649'] Это не нормально, нужно исправить. [/quote] Подтяжку буду исправлять...
Я не совсем понимаю, что именно Вы наблюдаете в прерывании. Между двумя точками останова можно сотню раз успеть поставить флаг. С JTAG'ом в прерываниях нужно быть осторожнее. [/quote] Насчёт флага - да конечно полностью согласен , он может выставляться. Мне не совсем понятно почему после выполнения кода AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0| AT91C_UDP_RXSUSP | AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM | AT91C_UDP_SOFINT );
я не вижу никаких изменений в регистре маски прерываний UDP_ IMR? Та же самая команда , но в обработеке флага RXRSM, ведёт себя корректно , и модифицирует регистр UDP_ IMR.
Попробую разобраться с подтяжкой , может что то прояснится ...
|
|
|
|
|
Oct 24 2007, 09:51
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-02-06
Из: Зеленоград
Пользователь №: 14 071

|
Цитата(coolzero @ Oct 24 2007, 10:16)  1.При запуске проги , но не подключённом у-ве к хосту вижу что постоянно влетаю в прерывание по флагу ENDBUSRES, которое вообще должно возникать при подключениие к хосту . Если есть цепь мониторинга VBUS, то при отсутствии оного можно блокировать прерывание от UDP непосредственно в AIC, а после обнаружения подключения - снова разрешать. До кучи можно еще и тактовые сигналы модуля UDP отключать, чтобы проц кушал меньше (какие тактовые сигналы в какой момент должны присутствовать - сказано в главе 34.5.3 мануала) Успехов!
Сообщение отредактировал ljerry - Oct 24 2007, 09:55
|
|
|
|
|
Oct 24 2007, 10:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(coolzero @ Oct 24 2007, 10:16)  Щупаю пример от Атмеля at91_demo_massstorage_fs Возникло несколько вопросов по работе модуля USB:
А иногда бывает что у-во подключено , а никакой реакции на компе нет , прерывания только по ENDBUSRES , по RXRSM прерывания нет , у-во на компе не видно . У меня сей исходник работает только в ARM режиме, в THUMB соединяется только с двумя из пяти доступных машин. Попробуйте с несколькими компьютерами. Попробуйте подавать частоту на usb модуль сразу при старте. Выберете частоту как 18.432/14*73. Если у вас быстрая инициализация USB, то 1.5кОм можно повесить жёстко на 3.3В без транзистора. Убрать ramfunc - всё равно не даёт выигрыша, но может стек налезать на функции. Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs. Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита) Выкиньте из обработчика прерывания управление энергопотреблением!!! - А то как вы будете отлаживаться?
Сообщение отредактировал _4afc_ - Oct 24 2007, 10:03
|
|
|
|
|
Oct 24 2007, 11:05
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Изменил подтяжку вместо питания USB на 3.3 В , флаг ENDBURSES больше не вылезает . Может быть из-за этого и девайс иногда некорректно определялся USB. to Kitsok : программка пока отладочная , кроме как обработки USB ничего не делает , мне кажется что в рабочей программе постоянные прерывания обработчика ENDBURSES могут реально тормозить всё остальное ( т.к флаг не сбрасывался - обработка прерывания велась практически непрерывно - я правильно мыслю ? ) Скажу даже больше , теперь мне удалось скопировать корректно пару файлов в DataFlash на плате... Цитата(_4afc_ @ Oct 24 2007, 14:01)  Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs.
Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита) В принципе так и сделал , взял проект и добавил туда Mass Storage и File System . Насчёт малоков была такая мысль , я так понимаю что памяти выделяется под размер конечной точки , т.е. 64 байта , примерно такой буффер и надо задать ? ramfunc - убраны , т.к память внешняя - AT45 , я подумал что мне оно нафиг не нужно. Насчёт "Выкиньте из обработчика прерывания управление энергопотреблением", не совсем понял - не расшифруете , как оно мне может помешать ? и вот вопрос я уже задал про косяк файловой системы - почему то затирается метка тома ( задается ATMEL при форматировании) и всё записи дальше на 380 байт пишутся? Погрнял немного девайс , получается следующее : был не прав , винда видит файлы ( хотя почему она переписала начало каталога по своему - не пойму ) Но при копировании файлов больше 3-4 кбайт - зависаем Цитата(_4afc_ @ Oct 24 2007, 14:01)  У меня сей исходник работает только в ARM режиме, в THUMB соединяется только с двумя из пяти доступных машин. Попробуйте с несколькими компьютерами. Попробуйте подавать частоту на usb модуль сразу при старте. Выберете частоту как 18.432/14*73. Если у вас быстрая инициализация USB, то 1.5кОм можно повесить жёстко на 3.3В без транзистора. Убрать ramfunc - всё равно не даёт выигрыша, но может стек налезать на функции.
Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs.
Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита)
Выкиньте из обработчика прерывания управление энергопотреблением!!! - А то как вы будете отлаживаться? Вопрос к вам уважаемый _4afc_: а зачем при обработке флага RXRSM заново конфигурятся клоки всего проца ? Начал тестировать , вылезли грабли , файлы копируются через раз, иногда глобально зависаю
Сообщение отредактировал coolzero - Oct 24 2007, 10:51
|
|
|
|
|
Oct 24 2007, 11:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(coolzero @ Oct 24 2007, 14:47)  В принципе так и сделал , взял проект и добавил туда Mass Storage и File System . Насчёт малоков была такая мысль , я так понимаю что памяти выделяется под размер конечной точки , т.е. 64 байта , примерно такой буффер и надо задать ? там несколько малоков внутри нескольких функций. Иногда размер точки, иногда фифо. Цитата(coolzero @ Oct 24 2007, 14:47)  Насчёт "Выкиньте из обработчика прерывания управление энергопотреблением", не совсем понял - не расшифруете , как оно мне может помешать ? Например сом порт продолжит работать. (я просто JTAG не использовал никогда) Цитата(coolzero @ Oct 24 2007, 14:47)  и вот вопрос я уже задал про косяк файловой системы - почему то затирается метка тома ( задается ATMEL при форматировании) и всё записи дальше на 380 байт пишутся? Погрнял немного девайс , получается следующее : был не прав , винда видит файлы ( хотя почему она переписала начало каталога по своему - не пойму ) Но при копировании файлов больше 3-4 кбайт - зависаем У вас ошибка в файловой системе скорее всего (в программе). Выкиньте её совсем. Для доступа к флэш с компьютера она не нужна. Достаточно чтения и запись сектора по номеру (ReadMedia/flashwriteAdress). - Сможете отформатировать устройство и работать. Я использовал другую файловую систему. Цитата(coolzero)  а зачем при обработке флага RXRSM заново конфигурятся клоки всего проца ? Я так понял что там в зависимости от приходящей от хоста команды вы переходите в режим малого энерго потребления и затем обратно в полное. Я это убрал. А в usb100h поставил USB_CONFIG = 0x60 ну и поставьте себе мА правильные (хоть 98)
Сообщение отредактировал _4afc_ - Oct 24 2007, 11:16
|
|
|
|
|
Oct 24 2007, 11:10
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
А чем мне может помешать управление энергопотреблением ? Не совсем понял , расшифруйте пожалтста...
|
|
|
|
|
Oct 24 2007, 11:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(coolzero @ Oct 24 2007, 15:10)  А чем мне может помешать управление энергопотреблением ? Не совсем понял , расшифруйте пожалтста... А зачем им управлять? Кроме того там могут стоять другие клоки по сравнению с вашими. Зачем зря кварц и Pll дёргать. Достаточно для протокола отрубить\врубить usb: Код // ***************************************** // * (UDP) USB Resume Interrupt or WAKE_UP * // ***************************************** if( (_IT_reg_b1 & AT91C_UDP_RXRSM) ||(_IT_reg_b1 & AT91C_UDP_WAKEUP)) { AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_PCK ); USB_EVENT |= USB_EVENT_MASK_RESUME;
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT ); AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT ); AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0 | AT91C_UDP_EPINT1 | AT91C_UDP_EPINT2 | AT91C_UDP_RXSUSP | AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM | AT91C_UDP_SOFINT | AT91C_UDP_WAKEUP ); AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_UDP );
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_UDP) );
AT91F_UDP_EnableTransceiver(USBDEV_BASE_UDP); }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|