Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB LPC2142. проблема с приемом
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
o_bender
Здравствуйте. Помогите кто может help.gif
На сайте keil'a есть пару примеров под LPC2148 для USB. Пытаюсь запустить один из них (HID устройство) на LPC2142. Пока что безуспешно.

Итак, ближе к делу.
Инициализирую USB следующим образом:

Код
void USB_Init (void) {
  DWORD val = 0;

  PCONP |= 0x80000000;                      /* Turn On USB PCLK */

  // Configure 48MHz USB Clock;  FOsc = 12MHz, M = 4, P = 2
  PLL1CFG  = 0x23;                         /* M = 4, P = 2 */
  PLL1CON  = PLLCON_PLLE;                  /* PLL Enable */
  PLL1FEED = 0xAA;                         /* Feed Sequence 1 */
  PLL1FEED = 0x55;                         /* Feed Sequence 2 */
    
  while ((PLL1STAT & PLLSTAT_PLOCK) == 0); /* Wait for PLL Lock */

  PLL1CON  = PLLCON_PLLE | PLLCON_PLLC;    /* PLL Enable & Connect */
  PLL1FEED = 0xAA;                         /* Feed Sequence 1 */
  PLL1FEED = 0x55;                         /* Feed Sequence 2 */

  PINSEL1 = 0x80000000;                     /* select LED USB */

  VICVectAddr0 = (unsigned long)USB_ISR;    /* USB Interrupt -> Vector 0 */
  VICVectCntl0 = 0x20 | 22;                 /* USB Interrupt -> IRQ Slot 0 */
  VICIntEnable |= 1 << 22;                   /* Enable USB Interrupt */

  USBDevIntEn = (1<<DEV_STAT);                /* Enable Device Status Interrupt */

  USB_Reset();
  USB_SetAddress(0);
}



//Ресетю следующим образом:


Код
void USB_Reset (void) {

  USBEpInd = 0;
  USBMaxPSize = USB_MAX_PACKET0;
  USBEpInd = 1;
  USBMaxPSize = USB_MAX_PACKET0;
  while ((USBDevIntSt & EP_RLZED_INT) == 0);

  USBEpIntClr  = 0xFFFFFFFF;
  USBEpIntEn   = 0xFFFFFFFF;
  USBEpIntClr   = 0xFFFFFFFF;
  USBDevIntClr = 0xFFFFFFFF;
  USBDevIntEn  = DEV_STAT_INT    | EP_SLOW_INT    |
               (USB_SOF_EVENT   ? FRAME_INT : 0) | ERR_INT;
}


В обработчике прерывания проверяю источник, вызвавший его. Получаю только ERR_INT - ошибка шины. Проверяю код ошибки - EOP, что обозначает ошибку конца пакета.

Прерываниями от нулевой контрольной точки не пахнет и близко. Ведь она должна принимать пакеты SETUP'a по умолчанию ?

Ребята плиз помогите. Уже не знаю что и думать.
zltigo
Цитата(o_bender @ Aug 31 2008, 13:27) *
На сайте keil'a есть пару примеров...
...
Инициализирую USB следующим образом:

Давайте для начала определимся это кейловский пример не работает, или Ваш код или оба? Непонятно.
Для проверки железки чего-нибудь собранное, например, изображающее мышку могу завтра подбросить.
o_bender
Цитата(zltigo @ Aug 31 2008, 19:03) *
Давайте для начала определимся это кейловский пример не работает, или Ваш код или оба?


Оба примера не работают.
Еще попытался запустить пример USBAudio. Та же проблема. После исследования работы определил, что прерывание EP_SLOW_INT не вызывается вообще. Происходит та же ошибка - EOP error.

Какие минимальные требования к железу должны быть, чтобы USB завелся и начал принимать хоть какие-то данные (другими словами чтоб наконец поймать прерывание SLOW_INT)?

D+ и D- подключил как полагается. К D+ подтяжку сделал на 3.3V через 1.5 k резистор.
На вывод P0.23 подал +3.3 V через делитель. К P0.31 подключил светодиод-сигнализатор успешной конфигурации.
Мож что-то забыл присобачить?


Цитата
Для проверки железки чего-нибудь собранное, например, изображающее мышку могу завтра подбросить.


Буду очень благодарен. smile.gif
zltigo
В приложении банально собранный пример мышки для LPC-P2148 от Olimex. Проверено - работает.
Исходники на olimex.com.
o_bender
Залил прошивку. Подключил USB - никак не опряделяется, как и раньше, пишет что неизвестное устройство.

Может ли это быть из-за того, что заливал не в LPC2148, а в LPC2142?
zltigo
Цитата(o_bender @ Sep 1 2008, 11:33) *
Может ли это быть из-за того, что заливал не в LPC2148, а в LPC2142?

Нет,это исключено, отличия только в размерах Flash. Что-то с железом у Вас sad.gif
o_bender
Ура!! Устройство заработало.

Причина как часто и бывает - в глупой ошибке. Сделал подтяжку резистора не к D+, а к D-. Перепаял и все заработало как милинькое smile.gif. Все старые сгенерированные прошивки пашут.

Да, кстати. Почему то Ваша прошивка не заработала, возможно из-за того, что схемы отличаются.

Но все равно большое спасибо за помощь!!
jake.spb
народ, сори за некропост! но столкнулся с аналогичной проблемой на lpc1768.. затянул стек, запустил тестовый примерчик, на full speed работает, на low speed - ни в какую, девайс подключается, но выдает eop error.. где вообще в контроллере настраивается скорость обмена? размер пакета в натройке эндпойнтов ограничил 8 байт как по документации для low speed, но все равно eop error! помогите, плиз, кто в курсе1
Golikov A.
если не ошибаюсь скорость обмена задается хостом, определяется по тому куда подтянута какая то из линий данных, к 0 или к 1.
И в дескрипторах тоже присутствует вроде как.
kovigor
Цитата(Golikov A. @ Dec 2 2013, 02:17) *
если не ошибаюсь скорость обмена задается хостом, определяется по тому куда подтянута какая то из линий данных, к 0 или к 1.

Все так, но вот эта самая подтяжка выполняется именно устройством (Для LS нужно подтянуть (через сопротивление на 1.5КОм) к питанию линию "D-", а для FS нужно подтянуть к питанию линию "D+"). Хост же всегда подтягивает обе линии к земле через сопротивление в 15КОм. А у автора вопроса устройство неизвестно что и куда тянет ...
jake.spb
Цитата(kovigor @ Dec 2 2013, 02:11) *
Все так, но вот эта самая подтяжка выполняется именно устройством (Для LS нужно подтянуть (через сопротивление на 1.5КОм) к питанию линию "D-", а для FS нужно подтянуть к питанию линию "D+"). Хост же всегда подтягивает обе линии к земле через сопротивление в 15КОм. А у автора вопроса устройство неизвестно что и куда тянет ...

все известно, в том и вопрос, если затянуть d+, все работает, если d- - нет.. хост четко скорость воспринимает, смотрел осциллом..

Цитата(Golikov A. @ Dec 2 2013, 01:17) *
если не ошибаюсь скорость обмена задается хостом, определяется по тому куда подтянута какая то из линий данных, к 0 или к 1.
И в дескрипторах тоже присутствует вроде как.

до запроса дескриптора дело даже не доходит (
kovigor
Цитата(jake.spb @ Dec 2 2013, 08:57) *
до запроса дескриптора дело даже не доходит (

Так в том-то и дело. Вчера я ответил на ваш вопрос, а сегодня просто дополню, что этот МК LS .................... не поддерживает !
http://www.nxp.com/documents/user_manual/UM10360.pdf

А зачем вам LS ? Я никогда за всю свою жизнь не видел хоста, который не поддерживал бы как минимум FS ...
jake.spb
Цитата(kovigor @ Dec 2 2013, 12:06) *
Так в том-то и дело. Вчера ответил на ваш вопрос, а сегодня просто дополню, что этот МК LS .................... не поддерживает !
http://www.nxp.com/documents/user_manual/UM10360.pdf

А зачем вам LS ? Я никогда за всю свою жизнь не видел хоста, который не поддерживал как минимум FS ...

Да, меня тоже смутила фраза "The USB device controller on the LPC17xx enables full-speed (12 Mb/s) data exchange with a USB host controller.".
Но в то же время, в распиновке выводов значится "Pad provides digital I/O and USB functions. It is designed in accordance with the USB specification, revision 2.0 (Full-speed and Low-speed mode only).". Более про low speed ни слова, и понимай, как хочешь.
LS, я думаю, как обычно, для удешевления. Девайс серийный, поэтому экономят на всем, чем только можно. Да и объемы данных смешные.
kovigor
Цитата(jake.spb @ Dec 2 2013, 12:29) *
Девайс серийный, поэтому экономят на всем, чем только можно. Да и объемы данных смешные.

Смешно экономить на LS. И непонятно, как таким путем достигнуть экономии. Разве что за счет некондиционного кабеля, на котором, вероятно, сможет работать LS. Можно взять AVR вместо ARM (Cortex) и на нем реализовать программный LS. См. проекты Игоря Чешко. Решение никудышнее, но как-то работать будет ...

Еще про экономию. Производителям сложнее реализовывать в МК обе скорости, ибо это усложняет и удорожает SIE.
И, наконец, поддержка LS в таком мощном МК полностью лишена смысла ...
jake.spb
Цитата(kovigor @ Dec 2 2013, 12:32) *
Смешно экономить на LS. И непонятно, как таким путем достигнуть экономии. Хотя знаю - можно взять AVR вместо ARM (Cortex) и на нем реализовать программный LS. См. проекты Игоря Чешко. Решение никудышнее, но как-то работать будет ...

Не могу точно сказать, наверное, чтобы избежать дополнительных фильтров. Девайс используется в плохих условиях в плане эмп. Но вопрос не в этом. Ясно, что если этот режим действительно не поддерживается, придется переделывать плату.
kovigor
Цитата(jake.spb @ Dec 2 2013, 13:09) *
Девайс используется в плохих условиях в плане эмп. Но вопрос не в этом. Ясно, что если этот режим действительно не поддерживается, придется переделывать плату.

Я не думаю, что с переходом на LS вы выиграете хоть немного в плане ЭМП. Может, лучше применить не USB, а какой-то другой интерфейс, более подходящий к вашей помеховой обстановке ? Если все же выберете USB, реализуйте FS. Хуже от FS не будет ...
jake.spb
Цитата(kovigor @ Dec 2 2013, 14:11) *
Я не думаю, что с переходом на LS вы выиграете хоть немного в плане ЭМП. Может, лучше применить не USB, а какой-то другой интерфейс, более подходящий к вашей помеховой обстановке ? Если все же выберете USB, реализуйте FS. Хуже от FS не будет ...

Наличие USB, как такового, принципиально, а вот LS становится уже не таким принципиальным ) Так или иначе, большое спасибо за помощь!
kovigor
Цитата(jake.spb @ Dec 2 2013, 14:40) *
Наличие USB, как такового, принципиально, а вот LS становится уже не таким принципиальным ) Так или иначе, большое спасибо за помощь!

Последний совет: продублируйте USB на всякий случай тем же RS232. Во-первых, это почти ничего не стоит. Во-вторых, вы всегда сможете уйти от USB, если он будет плохо работать в вашей помеховой обстановке, и таким образом избежать массы неприятностей ...
jake.spb
Цитата(kovigor @ Dec 2 2013, 15:14) *
Последний совет: продублируйте USB на всякий случай тем же RS232. Во-первых, это почти ничего не стоит. Во-вторых, вы всегда сможете уйти от USB, если он будет плохо работать в вашей помеховой обстановке, и таким образом избежать массы неприятностей ...

Да, конечно, это все уже есть и давно.
Tahoe
А в какой из библиотек/примеров, приличнее всего описаны дескрипторы? Не сборище тупых дефайнов или недоструктур, а грамотно, максимально задействовав возможности препроцессора/компилера. Пока, из того, что видел, более-менее вменяемой выглядит реализация от NXP ( nxpUSBlib v0.98b ). Пусть не шедевр, но люди хоть про С99 и его возможности слышали.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.