Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB LPC2000
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Golikov A.
Привет!

Народ помогите, в конец замучался.

На ЛПЦ 2148 пытаюсь реализовать ХИД девайс.

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

Все ведет себя как то не предсказуемо, и уже не знаю на что и думать.

Регулярно получаю ошибку
Unexpected Packet

причем и в еррор статусе и еррор коде регистре.


Есть те кто реализовывал УСБ на ЛПЦ 2148

вот на всякий случай текст функции посылки сообщения, вроде из названия функций можно догадаться что они делают

Рад буду любой помощи

Код
int USBSendData(int EPNum, char *Buffer, int DataLen, int MaxPocketSize)
{
   int ErrorCode=0;
   int TimeOut=0;
   int EPPhysNum=((EPNum<<1)+1); //convert logical to physcal EP num

   char EPInfo;
   //logical to physycal
   ErrorCode=(USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo)<<3);

   if((EPInfo&0x01)!=0) //not end sending of previous send
    {
      #ifdef DEBUG
      UARTSendText("Prev send not end, EP info :",0);
      UARTSendHexStr(&EPInfo,1,0);
      #endif
      return 4;
    }

   if(DataLen==0) //need send zero length data
    {
      USBCTRL=(((EPNum&0x0F)<<2)|0x02);// set write mode, and sellect EP
      TPKTLEN=0;
      TDATA=0; //just in case, for internal mechanics

      ErrorCode+=(USBValidateBuffer(EPPhysNum)<<6); //need use physical ep number;
      if(ErrorCode!=0) //error code
        return ErrorCode;

      TimeOut=0;
      EPInfo=0x01;
      while(((EPInfo&0x01)!=0)&&(TimeOut++<USB_DEV_TIMEOUT)) //waite end of sending
       {
          USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo);
          if((EPInfo&0x02)!=0) //ep was STALLed
           {
             UARTSendText("EP was STALLed, EPInfo :",0);
             UARTSendHexStr(&EPInfo,1,0);
             break;
           }
       }

      if(((EPInfo&0x02)!=0)||((EPInfo&0x01)!=0)) //not end of sending interrupt, or EP STALLed
        return 3;

      USBCmd((CMD_USB_SEL_CLR_INT_EP+EPPhysNum),NULL,&EPInfo); //clear usb clock domain interrupt

      #ifdef SPEED_DEBUG
      UARTSendText("Zerro EP Info :",0);
      UARTSendHexStr(&EPInfo,1,0);
      #endif
    }

   while(DataLen>0) //send data by max pocket size if nedded
    {
      int CurrentSendDataLen;
      if(DataLen>MaxPocketSize)
        CurrentSendDataLen=MaxPocketSize;
      else
        CurrentSendDataLen=DataLen;

      USBCTRL=(((EPNum&0x0F)<<2)|0x02);// set write mode, and sellect EP
      TPKTLEN=(CurrentSendDataLen&0x3FF);

      for(int j=0;j<CurrentSendDataLen;j+=4) //send by word
       {
         if((CurrentSendDataLen-j)<4)//last part of sending
          {
            int TempData=0;
            char *Pointer=((char *)&TempData);
            for(int k=j;k<CurrentSendDataLen;k++)
              *Pointer=*Buffer++;
            TDATA=TempData;
            break;
          }

         TDATA=*((int *)Buffer);
         Buffer+=4; //write by words
       }


      ErrorCode+=(USBValidateBuffer(EPPhysNum)<<6); //need use physical ep number;
      if(ErrorCode!=0) //error code
        return ErrorCode;

      DataLen-=CurrentSendDataLen;


      /*if(DataLen>0) //need send one more data, waite end of last sending
       {*/
         TimeOut=0;
         EPInfo=0x01;
         while(((EPInfo&0x01)!=0)&&(TimeOut++<USB_DEV_TIMEOUT)) //waite end of sending
          {
             USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo);
             if((EPInfo&0x02)!=0) //ep was STALLed
              {
                UARTSendText("EP was STALLed, EPInfo :",0);
                UARTSendHexStr(&EPInfo,1,0);
                break;
              }
          }

         if(((EPInfo&0x02)!=0)||((EPInfo&0x01)!=0)) //not end of sending interrupt, or EP STALLed
           return 3;

         USBCmd((CMD_USB_SEL_CLR_INT_EP+EPPhysNum),NULL,&EPInfo); //clear usb clock domain interrupt

         #ifdef SPEED_DEBUG
         UARTSendText("Zerro EP Info :",0);
         UARTSendHexStr(&EPInfo,1,0);
         #endif
       //}
    }

   return ErrorCode;
}
Golikov A.
Здравствуйте!

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

Отсюда вопрос. Кто-нибудь где-нибудь видел боле менее подробное описание работы усб модуля?

Надо ли делать паузы в прописывании регистров, при посылки и приеме данных (я так и не могу понять ремарки про разность частот на шинах усб-ешного домена и процессора).

Сигнал ресета в статус сбрасывает настройки усб или должен вызвать сброс этих настроек? То есть получая ресет, мне надо заново весь модуль инитить, или просто будет достаточно буфера 0 точки почистить?

Откликнитесь пожалуста те кто имел реальную практику работы с усб в этих кристалах, ЛПЦ2148 интирисует особенно.

Я что-то застрял окончательно. Вроде сделал все по описанию, и получаю сообщения(сообщения правильные), но послать правильно что-то не могу. Все время получить дискриптор устройства, задать адрес, и ресет. И крутится по кругу, пока винда не забивает на устрйоство. Длинна в требованиях дескриптора вроде меняется, то есть что-то от меня до компа доходит, но что и как?

А посылки практически всегда сопровождаются ошибками типа неожиданный пакет. Естественно прослушать что происходить на шине невозможно, так как пока устройство в системе не зарегистрируется, сниферы нчиего не кажутsad.gif

Это уже крик души... что-то я не понимаю, но что!?

связь
114101601
golikoff_a ___ mail___ ru
пожалуйста дайте кто нить о себе знатьsmile.gif а?
Diz
Посмотрите lpcusb - http://wiki.sikken.nl/index.php?title=LPCUSB
На первый взгляд очень вменяемо написанный фреймворк, собираюсь пробовать в ближайшем времени на lpc2468.
Golikov A.
Цитата(Diz @ Aug 9 2008, 04:56) *
Посмотрите lpcusb - http://wiki.sikken.nl/index.php?title=LPCUSB
На первый взгляд очень вменяемо написанный фреймворк, собираюсь пробовать в ближайшем времени на lpc2468.


Это в целом, а тут уже нужны частностиsad.gif.
Хочется знать что надо ставить а что нет.

из мануала
Bus Reset bit. On a bus reset, the device will automatically go to
the default state. In the default state:...

что это значит? устройство перейдет в дефолтное состояние, или должно автоматическ переходить?
то есть получив этот бит я должен заново инит усб настраивать все конечные точки и так далее (потому что устрйоство в дефолте), или я должен получив этот бит перевисти устрйство в дефолтное состоние?


The Set Address command is used to set the USB assigned address and enable the
(embedded) function. The address set in the device will take effect after the status phase
of the setup token. (Alternately, issuing the Set Address command twice will set the
address in the device)

как это использовать? получив запрос сет адрес я должен вызвать эту функцию и отправить пакет нулевой длинны как "ак", а контроллер сам прочухает статус фазу ответа и выставит адрес? Или всегда добить по 2 раза? Чет он не так, не так не работаетsad.gif... ошибка неожиданный пакет...

Странно что в регистре статуса прерываний контрольных точек не появляются биты еслине выключено соотвесвующее прерывание. Я ожидал осутсвие реакции на прервание,а не запрет появления соотвествующих битов%(...

надо все усб еще разок с нуля переписать... все как в мануале, а не работаетsad.gif... И не знаю на что думать, может во времянные рамки не укладываюсьsad.gif... Сколько времени дают на обработку запросов?
amw
Из вопроса видно, что Вы не понимаетет сам USB. LPC это уже частности.
Прочитайте сначала сам USB стандарт.

Цитата(Golikov A. @ Aug 9 2008, 11:44) *
из мануала
Bus Reset bit. On a bus reset, the device will automatically go to
the default state. In the default state:...

что это значит? устройство перейдет в дефолтное состояние, или должно автоматическ переходить?
то есть получив этот бит я должен заново инит усб настраивать все конечные точки и так далее (потому что устрйоство в дефолте), или я должен получив этот бит перевисти устрйство в дефолтное состоние?

Хост устанавливает USB Reset при подключении устройства к шине, при ошибках и т.п. Получив его нужно, как минимум, запретить все конечные точки кроме EP0 и перевести устройство в исходное состояние. Это значит, что в программе, в той части, которая отвечает за логику функционировани USB, нужно обнулить или установить в какое-то начальное состояние переменные и пр. И перейти в состояние готовности к получению адреса.
Цитата
The Set Address command is used to set the USB assigned address and enable the
(embedded) function. The address set in the device will take effect after the status phase
of the setup token. (Alternately, issuing the Set Address command twice will set the
address in the device)

как это использовать? получив запрос сет адрес я должен вызвать эту функцию и отправить пакет нулевой длинны как "ак", а контроллер сам прочухает статус фазу ответа и выставит адрес? Или всегда добить по 2 раза? Чет он не так, не так не работаетsad.gif... ошибка неожиданный пакет...

Нужно установить в регитсре полученный адрес. Разрешить остальные конечные точки. И перевести свою программу в рабочее состояние - то есть перейти в нормальный режим функционирования.
Цитата
Странно что в регистре статуса прерываний контрольных точек не появляются биты еслине выключено соотвесвующее прерывание.

А что тут странного? Вы же их запретили. Отку да же возмутся биты статуса запрещенных прерываний?
Цитата
Я ожидал осутсвие реакции на прервание,а не запрет появления соотвествующих битов%(...

Не стоит распространять опыт по PIC на другие архитектуры.

И для начала возмите примеры на сайте NXP.
http://www.standardics.nxp.com/support/doc...crocontrollers/
Искать на предмет "Sample Code Bundle"
И еще, возможно Вы путаете Data Sheet и User Manual? Это разные документы.
Golikov A.
Цитата(amw @ Aug 9 2008, 13:48) *
Из вопроса видно, что Вы не понимаетет сам USB. LPC это уже частности.
Прочитайте сначала сам USB стандарт.

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

Не стоит распространять опыт по PIC на другие архитектуры.

И для начала возмите примеры на сайте NXP.
http://www.standardics.nxp.com/support/doc...crocontrollers/
Искать на предмет "Sample Code Bundle"
И еще, возможно Вы путаете Data Sheet и User Manual? Это разные документы.


Из от вета видно что вы меня не очень уважаетеsmile.gif))) Чтобы сразу задать правильный тон скажем так
я знаю что мануал и дата шит разные вещи
я програмировал разные системы и кристалы ПЦ, АВР, МСП, ПЛИСЫ(если это можно считать програмированием), ТМС (и ДСП и АРМ), 51 ядро, АРМ попадался, вот пик не програмилsmile.gif))
У меня более 6 лет опыта работыsmile.gif
Я читал и понимаю стандарт УСБsmile.gif (насколько можно пнять этот многотомный труд)
И естественно я искал примеры на сайте производителя. Я не нашел, и был бы очень благодарен если вы дали бы прямую ссылку а не просто порекомендовали бы поискать...

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

Bus Reset bit. On a bus reset, the device will automatically go to
the default state. In the default state:...

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

Команда установить адрес.
Здорово что вы отправили меня к стандарту, а сами туда не загляднули, там сказано что состояние Адресован и состояние сконфигурирован разные вещи, ну да ладно. Меня опять интересует работа усб машины именно в крситале ЛПЦ2148.

The Set Address command is used to set the USB assigned address and enable the
(embedded) function. The address set in the device will take effect after the status phase
of the setup token. (Alternately, issuing the Set Address command twice will set the
address in the device)

Если читать стандарт, то на команду сет адрес надо оветить АК но со старым адресом, и только после этого его изменить. Если я правильно понимаю строчки из мануала, то это и реализованно, то есть подав команду сет адрес 1 раз контролер не установит его пока не пройдет статус фаза. То есть я вызываю сет адрес команду, и потом шлю пакет нулевой длинный, и контроллер это все отмониторит и установит адрес после принятия хостом АКА? а если надо установить адрес насильно и немедленно, то надо вызывать команду 2 раза, правильно ли я понял?

Про прерывание меня это удивило потому что если вы запретите какое либо прерывание от УСБ девайс (регистры усб девайс интеррапт), то в регистре флаги будут выставляться, а не будет генерится на него реакция. И вообще в 99% случаев это так и есть, запрещается не флаг, а реакция на флаг и тут не причем пик.

И мне хочется понять все нормально или что-то не так. Запрет прерывания в регистре прерываний конечных точек прекращает выставление флагов в статусе прерываний конечных точек? Так и должно быть?

как тогда определить посланы данные по усб или нет? Если допустим начинаете новую посылку как понять что старая уже закончена? Проверять флаги в статусе конечных точек, флаг полноты буфера конечной точки? Это корректная проверка окончания передачи?

Меня интересует именно опыт работы людей с этим кристалом, или кристалами этой серии. Я понимаю что легче светси вопрос к тому на который вы знаете ответы, но в данном случае это не актуально, простые вещи я уже проверил. Остались либо очень простые либо очень сложные

Обидно что нет аплекейшен нота по усб от производителя... Есть куча примеров, в которых огромное колличество ошибок, и по структуре которых не видно что автор имел полное понимание работы системы.
amw
Цитата(Golikov A. @ Aug 9 2008, 14:14) *
Из от вета видно что вы меня не очень уважаетеsmile.gif))) Чтобы сразу задать правильный тон скажем так

bb-offtopic.gif
Это тон дурно пахнущей попойки. Лучше воздержитесь от такого тона.

Теперь по сути.
Цитата
я знаю что мануал и дата шит разные вещи
я програмировал разные системы и кристалы ПЦ, АВР, МСП, ПЛИСЫ(если это можно считать програмированием), ТМС (и ДСП и АРМ), 51 ядро, АРМ попадался, вот пик не програмилsmile.gif))
У меня более 6 лет опыта работыsmile.gif
Я читал и понимаю стандарт УСБsmile.gif (насколько можно пнять этот многотомный труд)
И естественно я искал примеры на сайте производителя. Я не нашел, и был бы очень благодарен если вы дали бы прямую ссылку а не просто порекомендовали бы поискать...

http://www.standardics.nxp.com/support/doc...14x.uvision.zip
http://www.standardics.nxp.com/support/doc...4x.realview.zip
http://www.standardics.nxp.com/microcontro...ad/docs/308.asp
http://www.standardics.nxp.com/support/doc...usb.hid.iar.zip
http://www.standardics.nxp.com/microcontro...ad/docs/306.asp
И судя по тому, что контролер у него такой-же как и у 23xx то можно еще
http://www.standardics.nxp.com/support/doc...4xx.uvision.zip
Цитата
Bus Reset bit. On a bus reset, the device will automatically go to
the default state. In the default state:...

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

Попробую процитировать чуть больше из мануала чем Вы.
4 RST Bus Reset bit. On a bus reset, the device will automatically go to 0
the default state. In the default state:
• Device is unconfigured.
• Will respond to address 0.
• Control endpoint will be in the Stalled state.
• All endpoints not realized except control endpoint EP0 and
EP1.
• Data toggling is reset for all endpoints.
• All buffers are cleared.
• There is no change to the endpoint interrupt status.
• DEV_STAT interrupt is generated.
0 This bit is cleared when read.
1 This bit is set when the device receives a bus reset.

Таким образом Вы получите этот бит = 1 когда хост установит состояние на шине "Bus Reset"
Сколько EP у Вас активных при получении этого бита? Вот и запретите лишние. Оставте только EP0
Цитата
Команда установить адрес.
Здорово что вы отправили меня к стандарту, а сами туда не загляднули, там сказано что состояние Адресован и состояние сконфигурирован разные вещи, ну да ладно. Меня опять интересует работа усб машины именно в крситале ЛПЦ2148.

The Set Address command is used to set the USB assigned address and enable the
(embedded) function. The address set in the device will take effect after the status phase
of the setup token. (Alternately, issuing the Set Address command twice will set the
address in the device)

Если читать стандарт, то на команду сет адрес надо оветить АК но со старым адресом, и только после этого его изменить. Если я правильно понимаю строчки из мануала, то это и реализованно, то есть подав команду сет адрес 1 раз контролер не установит его пока не пройдет статус фаза. То есть я вызываю сет адрес команду, и потом шлю пакет нулевой длинный, и контроллер это все отмониторит и установит адрес после принятия хостом АКА? а если надо установить адрес насильно и немедленно, то надо вызывать команду 2 раза, правильно ли я понял?

Насильно и немедленно не получится потому что сначала хост обращается по адресу 0, а потом присвоит правильный адрес и сконфигурирует девайс.
Таким образом при включении питания Вы ставите адрес 0 и разрешаете девайс. А потом, когда получите от хоста SET_ADDRESS request установите адрес в этом регистре вторично. Вот Вам и "два раза установил адрес"
Цитата
Про прерывание меня это удивило потому что если вы запретите какое либо прерывание от УСБ девайс (регистры усб девайс интеррапт), то в регистре флаги будут выставляться, а не будет генерится на него реакция. И вообще в 99% случаев это так и есть, запрещается не флаг, а реакция на флаг и тут не причем пик.

И мне хочется понять все нормально или что-то не так. Запрет прерывания в регистре прерываний конечных точек прекращает выставление флагов в статусе прерываний конечных точек? Так и должно быть?

как тогда определить посланы данные по усб или нет? Если допустим начинаете новую посылку как понять что старая уже закончена? Проверять флаги в статусе конечных точек, флаг полноты буфера конечной точки? Это корректная проверка окончания передачи?

Меня интересует именно опыт работы людей с этим кристалом, или кристалами этой серии. Я понимаю что легче светси вопрос к тому на который вы знаете ответы, но в данном случае это не актуально, простые вещи я уже проверил. Остались либо очень простые либо очень сложные

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

Прерывания от конечных точек разрешаются в регистре USBEpIntEn. Установив бит в единицу Вы получите флаг в соответствующем бите регистра USBEpIntSt когда состояние точки изменится (данные приняты/отправлены и т.д).
Прерывание же процессора от конечных точек задается в регистре USBDevIntEn биты 6 и 7.
Вы говорите о каком регистре? Я так понял что о первом. Тогда не разрешив биты Вы не увидите флагов.
Golikov A.
Привет! Спасибо за ответ.

Опустим взаимные упреки... глупо и бесполезно


По сути: Примеры эти у меня есть, это не примеры от филипса, и в них есть 100% ошибки. Причем многоsad.gif


Про ресет
То есть когда я получаю этот бит, мне надо перевести устройство в дефалт стайт, само оно ничего не сделает. А почему я не могу зарелайзид все необходимые контрольные точки сразу? В стандарте вроде это не запрещается или я пропустил? Или это ограничения усб машины ЛПЦ?

Про адрес.
Так сколько раз надо вызывать функцию при установке адреса?
Первый раз при инициализации задать адрес 0 и енайбл поставить в 1, чтобы устройство стало отвечать на нулевой адрес, а при запросе Сет Адрес установить адрес еще раз, чтобы устройство стало овтечать на новый адрес?
И без удачной статус фазы адрес все равно не установится?

Для установки адреса не требуются двойные вызовы фукнции СетАдрес?


Про прерывания УСБ у меня с ними полный бардакsad.gif.
Описываю ситуацию, потому что сам уже объяснить ничего не могу.

Взял переписал все функции УСБ заново, с нуля.
Получил работающий вариант, потому что забыл поставить обнуление прерывания от нулевой контрольной точки. Но добавления очищение прерывания нулевой контрольной точки все опять перестало работать... ничего не двигается дальше установки адреса.

Что вызывает генерацию прерывания нулевой контрольной точки? И может ли данные после отправки в буффер не быть посланны? То есть при посылке данных контроллер посылает их один раз или пока не получит АСК? Я иногда полчаю статус нулевой выходнйо конечной точки СТАЛЛЕД.

А когда вызывана функция очистки буфера выходной точки, это только разрешает принять новое сообщение или и стирает данные? То есть при попытке их считать я опять их получу?

У вас нет ли своего примера УСБ? или не окажите ли мне честь посмотреть мой код?
Golikov A.
Ура с бардаком разобрался, я убирал флаг после ответа на сетап пакет, и оказывается за это время успевал придти еще один сетап пакет. Стал очищать прерывание до обработки пришедшего пакета, работоспособность возобновилась, но как-то прям все на грани, чуть в сторону и уже не успеваю обработать...

Отсюда вопрос, когда надо очищать буфер выходной контрольной точки? как только считал Сетап пакет, или после того как на него ответил? Какие там тайм оуты на запросы хоста?

Еще один вопрос, надо ли очищать регистры типа ИнтераптКлеар (сбрасывающие сигналы регистры). Где то в мануале нашел что если там стоит 1 в том бите который хотите очистить (осталось с прошлого раза), то ничего не сбросится, сначала надо обнулить регистр а потом записать 1. Это так или нет? Или это не всегда так, в смысле зависит от регистра?

И еще вопрос, в описании УСБ есть что клок усб домена меньше чем клок проца, и потому надо как минимум 5 клоков между записями в регистры управления усб. Я правильно понял или нет? И как по уму делать паузу в 5 клоков? а если пишешь на С?



О и последние вспомнил, нужно толкование по поводу команды выбрать конечную точку, очистить прерывание. Я так понимаю выбрать конечную точку - очистить прерывание очищает только флаги Сетап покет и ОверВрайт, но не очищщает бит в статусе прерываний конечных точек. Что еще очищается командой выбрать конечную точку, очистить прерывание?
amw
Цитата(Golikov A. @ Aug 10 2008, 21:10) *
По сути: Примеры эти у меня есть, это не примеры от филипса, и в них есть 100% ошибки. Причем многоsad.gif
Про ресет

Не знаю на счет 100%, но очень помогает. Фактически без них у меня ничего не работало. Пока не начал находить отличия своей программы от примера.
Цитата
То есть когда я получаю этот бит, мне надо перевести устройство в дефалт стайт, само оно ничего не сделает. А почему я не могу зарелайзид все необходимые контрольные точки сразу? В стандарте вроде это не запрещается или я пропустил? Или это ограничения усб машины ЛПЦ?

Да. Ничего не сделает. Максимум что выполнится само - это ACK на уже принятый пакет и NAK на следующий пока не Вы не укажете что событие отработано. На счет автомата в ЛПЦ ничего сказать не могу - это вопрос к NXP.
Цитата
Про адрес.
Так сколько раз надо вызывать функцию при установке адреса?
Первый раз при инициализации задать адрес 0 и енайбл поставить в 1, чтобы устройство стало отвечать на нулевой адрес, а при запросе Сет Адрес установить адрес еще раз, чтобы устройство стало овтечать на новый адрес?
И без удачной статус фазы адрес все равно не установится?

Разумеется. В дефолтноми состоянии устройство отвечает на адрес ноль и только по контрольной конечной точке ноль. Таков стандарт USB.
Потом присваиватся адрес. После его присвоения устройство продолжает отвечать на контрольную точку ноль, но уже по новому адресу. А после установки конфигурации SET_CONFIG, скажем так в процессе установки конфигурации, включаются в работу остальные конечные точки.
В принципе контрольных конечных точек может быть больше одной и они (те что больше 1) будут иметь номера больше нуля конечно, но на практике я не знаю как это применить. Разве что для мультифункциональных устройств. Но и тут я не уверен, никогда не видел устройства с количеством контрольных конечных точек больше одной.
Цитата
Для установки адреса не требуются двойные вызовы фукнции СетАдрес?
Про прерывания УСБ у меня с ними полный бардакsad.gif.
Описываю ситуацию, потому что сам уже объяснить ничего не могу.

Вот на счет двойных вызовов что-то было. Сейчас не помню точно где и когда. Приду домой - гляну. А вообще-то по этому поводу как раз пример и помог. У меня был LPC2368.
Цитата
Взял переписал все функции УСБ заново, с нуля.
Получил работающий вариант, потому что забыл поставить обнуление прерывания от нулевой контрольной точки. Но добавления очищение прерывания нулевой контрольной точки все опять перестало работать... ничего не двигается дальше установки адреса.

Что вызывает генерацию прерывания нулевой контрольной точки? И может ли данные после отправки в буффер не быть посланны? То есть при посылке данных контроллер посылает их один раз или пока не получит АСК? Я иногда полчаю статус нулевой выходнйо конечной точки СТАЛЛЕД.

Прерывание любой конечной точки генерируется при
- Успешной отправке данных.
- Успешном приеме данных.
- Возникновении ошибки.
- Получении STALL.
Если данные в буфере - то они будут передаваться. Специально не проверял, но думаю что до получения ACK.
На счет STALLED. Что Вы шлете в ответ на GET_DEVICE_QUALIFIER_DESCRIPTOR? Поскольку в LPC USB FullSpeed а не HighSpeed, то нужно слать STALL. Потом его нужно очищать, когда STALL будет послан хосту. Если этого не сделать - то точка будет в состоянии STALLED вечно.
И тут еще вот что.
LPC нам помогает создавать путаницу с номерами точек. Поскольку EP0 по терминологии USB двунаправленная, а по терминологии LPC - однонаправленная, то нужно не забывать, что физически в LPC под EP0 задействованы две конечные точки - 0 и 1.
Цитата
А когда вызывана функция очистки буфера выходной точки, это только разрешает принять новое сообщение или и стирает данные? То есть при попытке их считать я опять их получу?

Опять же по памяти не скажу точно, но в римере это место точно правильно.
Цитата
У вас нет ли своего примера УСБ? или не окажите ли мне честь посмотреть мой код?

Есть, приду домой - выложу.

Цитата(Golikov A. @ Aug 11 2008, 12:24) *
Ура с бардаком разобрался, я убирал флаг после ответа на сетап пакет, и оказывается за это время успевал придти еще один сетап пакет. Стал очищать прерывание до обработки пришедшего пакета, работоспособность возобновилась, но как-то прям все на грани, чуть в сторону и уже не успеваю обработать...

Отсюда вопрос, когда надо очищать буфер выходной контрольной точки? как только считал Сетап пакет, или после того как на него ответил? Какие там тайм оуты на запросы хоста?

Когда считал пакет. Отправлять ответ необязательно smile.gif.
Цитата
Еще один вопрос, надо ли очищать регистры типа ИнтераптКлеар (сбрасывающие сигналы регистры). Где то в мануале нашел что если там стоит 1 в том бите который хотите очистить (осталось с прошлого раза), то ничего не сбросится, сначала надо обнулить регистр а потом записать 1. Это так или нет? Или это не всегда так, в смысле зависит от регистра?

Нужно. Регистры xxxClr - только для записи. запись 1 в соответствующий бит - очищает бит в регистре xxxSt (соответствующего статуса). Если этого не делать - Вы будете ловить статусы непрерывно и многократно, несмотря на то, что они уже отработаны при первом разе. На каждый регистр St есть регистр Clr.
Цитата
И еще вопрос, в описании УСБ есть что клок усб домена меньше чем клок проца, и потому надо как минимум 5 клоков между записями в регистры управления усб. Я правильно понял или нет? И как по уму делать паузу в 5 клоков? а если пишешь на С?

На счет 5 клоков не знаю. Но у меня всегда ядро работает на максимальной частоте (2368 - 72MHz), а USB соответственно на 48 MHz. Но на счет 5 клоков я не помню такого вообще. В особокритичных местах пишем в регистр xxxEn а потом читаем соответствующий регистр xxxState пока там не установится бит статуса. Это то-же есть в примерах.
Цитата
О и последние вспомнил, нужно толкование по поводу команды выбрать конечную точку, очистить прерывание. Я так понимаю выбрать конечную точку - очистить прерывание очищает только флаги Сетап покет и ОверВрайт, но не очищщает бит в статусе прерываний конечных точек.

Да. Прерывания от EP очищаются в регистре USBEpIntClr.
Цитата
Что еще очищается командой выбрать конечную точку, очистить прерывание?

Внутреннее состояние USB машины LPC как я понимаю.
Golikov A.
Привет!
Вот сейчас почитал и думаю как трактовать ваши ответы? Как неуважение ко мне или как вашу некомпетентность. Вы не понимаете моих вопросов или не считаете важным понимать?


Может кто-то написать схему обарботки прерываний от усб сетап пакета? Или прокомментировать мою схему

моя схема такая:

по приходу прерывания от усб,

проверяю что это за флаг по регистру USBDevIntSt.
если есть флаг EP_FAST (на нем у меня висит прием нулевой контрольной точки)

очищаю прерывание 0 контрольной точки в регистре USBEpIntSt и получаю ее статус.
очищаю флаг EP_FAST

если в статусе конечной точки стоит флаг сетап пакет вызываю функцию считывания сетап пакета и обработки

В ней устанавливаю режим чтения,
жду установки флага готовности длинны данных
читаю даные
вызываю команду выбор контрольной точки и очистки прерываний
проверяю что нет флага овервриате (если есть то перечитываю сетап еще раз)

очищаю буфер нулевой контрольной точки

обрабатываю сетап покет.

Проблемма следующая, неуспев обработать первый запрос, я получаю уже следующий. А в прошлых контроллерах такого не было, я там успевал еще получить АСК и написать что его получил, и прочее...
Сейчас добавление обработки АСК я начинаю неуспевать обрабатывать сетап пакеты... У меня есть ощущение что я делаю что-то раньше времени, то ли буфер надо очащать уже после ответа, то ли не вызывать команду очистки прерываний усб домена.

В результате я временами получаю ресет на шине, я так понимаю это связанно с тем что выходит таймоут на ответ по запросу хоста. Какие вообще таймоуты на ответ? У УСБ 1.0 и 2.0 они разные?
galjoen
Цитата(Golikov A. @ Aug 11 2008, 16:06) *
Проблемма следующая, неуспев обработать первый запрос, я получаю уже следующий. А в прошлых контроллерах такого не было, я там успевал еще получить АСК и написать что его получил, и прочее...
Сейчас добавление обработки АСК я начинаю неуспевать обрабатывать сетап пакеты... У меня есть ощущение что я делаю что-то раньше времени, то ли буфер надо очащать уже после ответа, то ли не вызывать команду очистки прерываний усб домена.

В результате я временами получаю ресет на шине, я так понимаю это связанно с тем что выходит таймоут на ответ по запросу хоста. Какие вообще таймоуты на ответ? У УСБ 1.0 и 2.0 они разные?

1. С LPC не работал, но в USB разбираюсь.
2. Транзакция SETUP должна заканчиваться управлящим чтением или записью. Т.к. вы знаете USB, то не буду писать, что это такое.
3. У LPC управляющее чтение (запись) видимо формируются автоматически, в отличие от тех контроллеров, которые вы использовали ранее.
4. Нужно научится держать хост на NAK-ах в стадии "состояние". Т.е. в случае передачи данных от хоста (или без данных), на NAK-ах на IN прежде чем слать ему PID DATA1 0й длины (управляющее чтение). В случае SETUP с передачей данных хосту - на OUT от хоста с ID пакета DATA1 и длиной данных =0 (управляющая запись). За это время вы закончите обработку этой SETUP транзакции. Наверняка у LPC есть такая возможность.
5. В таком состоянии можно продержать хост до 5 секунд (под Win). Под Linux это время задаётся.
Golikov A.
Цитата(galjoen @ Aug 11 2008, 16:45) *
1. С LPC не работал, но в USB разбираюсь.
2. Транзакция SETUP должна заканчиваться управлящим чтением или записью. Т.к. вы знаете USB, то не буду писать, что это такое.
3. У LPC управляющее чтение (запись) видимо формируются автоматически, в отличие от тех контроллеров, которые вы использовали ранее.
4. Нужно научится держать хост на NAK-ах в стадии "состояние". Т.е. в случае передачи данных от хоста (или без данных), на NAK-ах на IN прежде чем слать ему PID DATA1 0й длины (управляющее чтение). В случае SETUP с передачей данных хосту - на OUT от хоста с ID пакета DATA1 и длиной данных =0 (управляющая запись). За это время вы закончите обработку этой SETUP транзакции. Наверняка у LPC есть такая возможность.
5. В таком состоянии можно продержать хост до 5 секунд (под Win). Под Linux это время задаётся.


Да ЛПЦ берет на себя всю нижнюю обработку усб, И выдает уже полученные данные, и отмечает сетап пакеты.

Можете мне пояснить пункт 4-5, а именно.

В лпц сделанно так, когда он получил Сетап пакет он выставляет прерывание, а дальше пока я не сделаю определенных действий он будет отвечать НАК на любые попытки хоста послать мне данные.
Также он будет отвечать НАК на любые попытки хоста считать данные.

если я вас правильно понял в винде это состояние будет 5 секунд?

Будет ли хост пытаться отправить другие сетап пакеты не получив ответ на первый и не выждав тайм оута?

Если же будет такая ситуация что после приема сетап пакета но до отсылки ответа, контроллер сможет принять данные, то есть ответит АСК на следующую оут транзакицю, Может ли эта транзакция произойти до того как будут посланны данные в ИН фазе? То есть на запросы ин контроллер отвечает НАК, а на любой оут запрос ответить АСК, может ли быть такая ситуация что хост пошлет новый запрос не получив ответа на предыдущий?

Все интересует именно под винду, буду очень благодарен за ответы.
galjoen
Цитата(Golikov A. @ Aug 11 2008, 17:22) *
Да ЛПЦ берет на себя всю нижнюю обработку усб, И выдает уже полученные данные, и отмечает сетап пакеты.

Можете мне пояснить пункт 4-5, а именно.

В лпц сделанно так, когда он получил Сетап пакет он выставляет прерывание, а дальше пока я не сделаю определенных действий он будет отвечать НАК на любые попытки хоста послать мне данные.
Также он будет отвечать НАК на любые попытки хоста считать данные.

если я вас правильно понял в винде это состояние будет 5 секунд?

Совершенно верно. Но можно также (в случае передачи данных от хоста - OUT) прочитать все данные, но транзакцию не завершать. Т.е. продержать хост на NAK-ах на IN, а не слать ему пакет данных 0й длины с маркером DATA1, завершающий транзакцию.
Цитата(Golikov A. @ Aug 11 2008, 17:22) *
Будет ли хост пытаться отправить другие сетап пакеты не получив ответ на первый и не выждав тайм оута?

Нет не будет.
Цитата(Golikov A. @ Aug 11 2008, 17:22) *
Если же будет такая ситуация что после приема сетап пакета но до отсылки ответа, контроллер сможет принять данные, то есть ответит АСК на следующую оут транзакицю, Может ли эта транзакция произойти до того как будут посланны данные в ИН фазе? То есть на запросы ин контроллер отвечает НАК, а на любой оут запрос ответить АСК, может ли быть такая ситуация что хост пошлет новый запрос не получив ответа на предыдущий?

Все интересует именно под винду, буду очень благодарен за ответы.

Не совсем понял вопрос. Вас интересует передача данных от хоста устройству или от устройства хосту? И на что конкретно контроллер отвечает ACK? На сам пакет SETUP, на данные DATA1/0 или на управляющую запись от хоста?
Но в любом случае новая транзакция не начнётся прежде, чем завершится начатая.
Golikov A.
Цитата(galjoen @ Aug 11 2008, 18:08) *
Не совсем понял вопрос. Вас интересует передача данных от хоста устройству или от устройства хосту? И на что конкретно контроллер отвечает ACK? На сам пакет SETUP, на данные DATA1/0 или на управляющую запись от хоста?
Но в любом случае новая транзакция не начнётся прежде, чем завершится начатая.



То есть СЕТАП фаза
потом должна быть дата фаза, и если эта фаза от контролера к хосту, то пока не придет пакет или сталл или не выйдет таймоут, хост не сгенерит новый сетап. Это хорошо...

А если был сетап запрос, потом контроллер хосту послал данные, и на следующую посылку от хоста к контроллеру, контроллер овтечает НАК, что будет? Хост выждет таймоут и потом сгенерит ресет на шине? Или сразу сгенерит ресет? А если накать после хендшейк (статус) фазы?

еще один вопрос меня долго мучает
Хендшайк фаза если это сетап пакет без данных или выходная посылка, то контроллер получив данные должен послать в ответ пакет нулевой длинны, как хендшайк фаза.
А если это входная посылка? то получив данные хост посылает пакет нулевой длинны? или он удовольствуется АСКом на данные в дата фазе? физически посылка есть от хоста в контроллер в хендшейк фазе? и главное если эта посылка есть, регистрируется ли эта посылка ЛПЦом как посылка данных?

Да!, и правда ли необходимо если посылка завершается посылкой пакета максимальной длинны буфера конечной точки, послать еще в конце всего пакета нулевой длинны? А если это однопакетная посылка, но длинной в макс размер буффера, то надо ли слать пакет нулевой длинны в конце? или это какое то неверное толкование стандарта? Важен размер буффера конечной точки или важен максимальный размер буффера для данной реализации стандарта, то есть 1.0, 2.0, фулл спид, лов спид?
amw
Цитата(Golikov A. @ Aug 11 2008, 15:06) *
Привет!
Вот сейчас почитал и думаю как трактовать ваши ответы? Как неуважение ко мне или как вашу некомпетентность. Вы не понимаете моих вопросов или не считаете важным понимать?
Может кто-то написать схему обарботки прерываний от усб сетап пакета? Или прокомментировать мою схему

Помнится Вы говорили что знаете USB и работали с MCU большого количества производителей.
А теперь задаете вопросы, на которые я могу только сказать, что повторять не буду, и посоветую почитать таки USB спецификацию и мануал на LPC.

Обещаное прилагаю, хотя вряд-ли Вам это поможет. В названных мною примерах это все есть.
galjoen
Цитата(Golikov A. @ Aug 11 2008, 18:30) *
То есть СЕТАП фаза
потом должна быть дата фаза, и если эта фаза от контролера к хосту, то пока не придет пакет или сталл или не выйдет таймоут, хост не сгенерит новый сетап. Это хорошо...

А если был сетап запрос, потом контроллер хосту послал данные, и на следующую посылку от хоста к контроллеру, контроллер овтечает НАК, что будет? Хост выждет таймоут и потом сгенерит ресет на шине? Или сразу сгенерит ресет? А если накать после хендшейк (статус) фазы?

NAK-ать можно всегда (5 сек), кроме как на SETUP.
Цитата(Golikov A. @ Aug 11 2008, 18:30) *
еще один вопрос меня долго мучает
Хендшайк фаза если это сетап пакет без данных или выходная посылка, то контроллер получив данные должен послать в ответ пакет нулевой длинны, как хендшайк фаза.
А если это входная посылка? то получив данные хост посылает пакет нулевой длинны? или он удовольствуется АСКом на данные в дата фазе? физически посылка есть от хоста в контроллер в хендшейк фазе? и главное если эта посылка есть, регистрируется ли эта посылка ЛПЦом как посылка данных?

При входной (для хоста) посылке хост шлёт пакет данных 0й длины с маркером DATA1. На него тоже можно слать NAK (до ACK).
Цитата(Golikov A. @ Aug 11 2008, 18:30) *
Да!, и правда ли необходимо если посылка завершается посылкой пакета максимальной длинны буфера конечной точки, послать еще в конце всего пакета нулевой длинны? А если это однопакетная посылка, но длинной в макс размер буффера, то надо ли слать пакет нулевой длинны в конце? или это какое то неверное толкование стандарта? Важен размер буффера конечной точки или важен максимальный размер буффера для данной реализации стандарта, то есть 1.0, 2.0, фулл спид, лов спид?

Важен размер буфера контрольного канала (EP0), описанный в дескрипторе DEVICE. В случае кратности данных его размеру здесь все рекомендуют слать пакет 0й длины. Но лично я в таком случае делаю так:
1. Смотрю (на NAK-ах), что хост хочет от меня. Для этого определяю на что шлются NAK-и.
2. Если на IN, то шлю 0й пакет.
3. Если на OUT, то шлю ACK (завершаю транзакцию)

Делаю так, т.к. сталкивался с тем, что разрешённый к отправке пакет данных 0й длины воспринимался хостом как подтверждение для следующей SETUP-ной транзакции. Т.е. хост разбирался с длиной данных и без 0-го пакета, завершал эту транзакцию, начинал следующую (слал SETUP и IN), и получал разрешённый к отправке 0й пакет, оставшийся от предыдущей транзакции. И считал его управляющим чтением.

В стандарте как-то расплывчато сказано, что этот 0й пакет может потребоваться, а может и не потребоваться. Мне кажется, что 0й пакет не требуется если хост знает длину данных, которые д.б. переданы ему. А если не знает, то ориентируется по 0-му пакету (или по пакету не максимальной длины). Вроде логично. Но на железке не проверял. Всё както некогда. М.б. вы разберётесь? Тогда отпишите.
Golikov A.
Цитата(galjoen @ Aug 11 2008, 19:57) *
NAK-ать можно всегда (5 сек), кроме как на SETUP.

При входной (для хоста) посылке хост шлёт пакет данных 0й длины с маркером DATA1. На него тоже можно слать NAK (до ACK).

Важен размер буфера контрольного канала (EP0), описанный в дескрипторе DEVICE. В случае кратности данных его размеру здесь все рекомендуют слать пакет 0й длины. Но лично я в таком случае делаю так:
1. Смотрю (на NAK-ах), что хост хочет от меня. Для этого определяю на что шлются NAK-и.
2. Если на IN, то шлю 0й пакет.
3. Если на OUT, то шлю ACK (завершаю транзакцию)

Делаю так, т.к. сталкивался с тем, что разрешённый к отправке пакет данных 0й длины воспринимался хостом как подтверждение для следующей SETUP-ной транзакции. Т.е. хост разбирался с длиной данных и без 0-го пакета, завершал эту транзакцию, начинал следующую (слал SETUP и IN), и получал разрешённый к отправке 0й пакет, оставшийся от предыдущей транзакции. И считал его управляющим чтением.

В стандарте как-то расплывчато сказано, что этот 0й пакет может потребоваться, а может и не потребоваться. Мне кажется, что 0й пакет не требуется если хост знает длину данных, которые д.б. переданы ему. А если не знает, то ориентируется по 0-му пакету (или по пакету не максимальной длины). Вроде логично. Но на железке не проверял. Всё както некогда. М.б. вы разберётесь? Тогда отпишите.



есть подозраение что если возвращаешь даные той длинны что запрашивал хост, то пакет не нужен, А если с длинной меньшей заданной, то нужен в случае кратности. Просто в кристалах типа ЛПЦ и прочих с контроллером усб внутри, уровень пидов пакетов недоступен, кристал многое от механизма берет на себя. Я даже не могу выбрать с дата1 или дата0 уйдет пакет нулевой длинны, это делает сам кристалл... Так что я все равно не смогу разобраться...

Спасибо ваши ответы мне помогли.

Цитата(amw @ Aug 11 2008, 19:53) *
Помнится Вы говорили что знаете USB и работали с MCU большого количества производителей.
А теперь задаете вопросы, на которые я могу только сказать, что повторять не буду, и посоветую почитать таки USB спецификацию и мануал на LPC.

Обещаное прилагаю, хотя вряд-ли Вам это поможет. В названных мною примерах это все есть.


Да вы правы, ваш пример мне действительно не очень интересен. Вы не смогли ответить ни на один вопрос до этого с первого раза, даже сейчас вы ответили не на поставленный вопрос, а на что-то опять вами понятое...

Сделали ваш прибор на основе примера с ошибками, и считаете это нормальным подходом? Потом будете создавать темы из раздела, после 5 часов работы, система перестает отвечать на запросы, и обсуждать проблемы винды и юникса... По вашим ответам ясно что полного понимания работы вы не имеете, поэтому и опыт ваш не очень интересен!
amw
Цитата(Golikov A. @ Aug 11 2008, 20:21) *
Сделали ваш прибор на основе примера с ошибками, и считаете это нормальным подходом?

Может укажете мне, где в примерах от NXP 100%-ная ошибка? А в моем файле?
Или Вы считаете ошибками все, что не преподносит Вам готовое решение Вашей задачи? Смею Вас огорчить, пример - это не решение, а всего лиш подсказка.
Как-то Ваши вопросы не укладываются в Ваши же утверждения об Вашем опыте и знаниях всего и вся.

[DELETED]
Axel
Цитата(Golikov A. @ Aug 11 2008, 21:21) *
...Спасибо ваши ответы мне помогли....
Да вы правы, ваш пример мне действительно не очень интересен. Вы не смогли ответить ни на один вопрос до этого с первого раза, даже сейчас вы ответили не на поставленный вопрос, а на что-то опять вами понятое...

... По вашим ответам ясно что полного понимания работы вы не имеете, поэтому и опыт ваш не очень интересен!


Оценка Вашего профессионального уровня - дело Ваших работодателей или заказчиков, но с воспитанием и культурой общения у Вас точно не очень...
Golikov A.
Уважаемый galjoen

Не подскажете ли мне еще по стандарту, состояния суспенд и ресет это состояния которые вызываются не посылками а состоянием шины.

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

хочу понять чтобы понять есть ли у ЛПЦ такие возможности smile.gif)))))))
galjoen
Цитата(Golikov A. @ Aug 12 2008, 12:49) *
Уважаемый galjoen

Не подскажете ли мне еще по стандарту, состояния суспенд и ресет это состояния которые вызываются не посылками а состоянием шины.

Лично моё мнение, что суспенд создан ТОЛЬКО: 1. для экономии электроэнергии потребляемой устройством от USB и 2. для индикации, что нет связи с хостом. В суспенд устройство переходит в случае неполучения SOF от хоста в течении 3 мс. Т.е. при наличии внешнего питания - если связь с хостом пропала, а действительно суспенд или просто выдернули шнур в этом случае различить со стороны устройства невозможно. Различие будет только при последующем включении устройства. Из суспенда выйдет без сброса настроек. А при втыкании пройдёт через ресет, сетадрес и т.д.
Цитата(Golikov A. @ Aug 12 2008, 12:49) *
1. Если хост требует суспенда от устройства (может ли он это делать), обязано ли устройство переходить в суспенд режим?
2. А если не обязано и не хочет, что оно должно ответить? Как подать сигнал невозможносоти операции?

3. хочу понять чтобы понять есть ли у ЛПЦ такие возможности smile.gif)))))))

1. Хост не может требовать суспенд от устройства. По крайней мере хост не может отличить суспенд и рабочий режим устройства без посылки к.л. маркеров. Но если он посылает маркеры, то сам не в режиме суспенд. Фактически стандарт требует, чтобы при отсутствии к.л. маркеров от хоста (в т.ч. SOF) в течении 3 мс устройство потребляло не более 0.5 ма от USB. А при последующем выходе из суспенда по стандарту устройству будет дано время на пробуждение (реально выдерживается не всеми хостами).

2. Непонятно зачем. Но есть сиглал пробуждения от устройства - ресуме. В win есть галка разрешающая устройству будить хост и весь компьютер. Я не пользовался т.к. не было таких задач.

3. Возможности такие д.б. Даже если их нет, то всё это реализуемо програмно. Самое сложное тут потреблять 0.5 ма от USB (при отсутствии внешнего питания). Обязательно приходится выключать тактовый генератор.

А вообще я согласен с Axel, и призываю отказаться от оценок уровней и прочего флуда в этой теме.
Golikov A.
Цитата(galjoen @ Aug 12 2008, 14:17) *
Лично моё мнение, что суспенд создан ТОЛЬКО: 1. для экономии электроэнергии потребляемой устройством от USB и 2. для индикации, что нет связи с хостом. В суспенд устройство переходит в случае неполучения SOF от хоста в течении 3 мс. Т.е. при наличии внешнего питания - если связь с хостом пропала, а действительно суспенд или просто выдернули шнур в этом случае различить со стороны устройства невозможно. Различие будет только при последующем включении устройства. Из суспенда выйдет без сброса настроек. А при втыкании пройдёт через ресет, сетадрес и т.д.

1. Хост не может требовать суспенд от устройства. По крайней мере хост не может отличить суспенд и рабочий режим устройства без посылки к.л. маркеров. Но если он посылает маркеры, то сам не в режиме суспенд. Фактически стандарт требует, чтобы при отсутствии к.л. маркеров от хоста (в т.ч. SOF) в течении 3 мс устройство потребляло не более 0.5 ма от USB. А при последующем выходе из суспенда по стандарту устройству будет дано время на пробуждение (реально выдерживается не всеми хостами).

2. Непонятно зачем. Но есть сиглал пробуждения от устройства - ресуме. В win есть галка разрешающая устройству будить хост и весь компьютер. Я не пользовался т.к. не было таких задач.

3. Возможности такие д.б. Даже если их нет, то всё это реализуемо програмно. Самое сложное тут потреблять 0.5 ма от USB (при отсутствии внешнего питания). Обязательно приходится выключать тактовый генератор.

А вообще я согласен с Axel, и призываю отказаться от оценок уровней и прочего флуда в этой теме.


3. В этом и проблема, совершенно нет возможности переходить всей схемой в малое потребление. Поэтому и думал можно ли как нибудь от этого отказаться, при этом не нарушить стандарт...

Про флуд я только за! Вы еще не видели неотредактирвоаных постов.
Моя позиция если знаешь овтет, - ответь, если не знаешь не высказывайся... А высказываться не разобравшись в вопросе - не уважать себя и колег.
galjoen
Цитата(Golikov A. @ Aug 12 2008, 14:36) *
3. В этом и проблема, совершенно нет возможности переходить всей схемой в малое потребление. Поэтому и думал можно ли как нибудь от этого отказаться, при этом не нарушить стандарт...

Решение есть, я пользуюсь, но подсказывать не буду т.к. оно принадлежит фирме и я обещал не разглашать. Но если получше изучите стандарт - можете додуматься сами. Но и в этом случае прошу особо не распостраняться... Конкурентное преимущество всётаки.
Golikov A.
Цитата(galjoen @ Aug 12 2008, 14:49) *
Решение есть, я пользуюсь, но подсказывать не буду т.к. оно принадлежит фирме и я обещал не разглашать. Но если получше изучите стандарт - можете додуматься сами. Но и в этом случае прошу особо не распостраняться... Конкурентное преимущество всётаки.



Я заинтригованsmile.gif)) Не это не тот уровень разработки не будут посягать на ваши наработкиsmile.gif,
я думаю на начальных этапах игнорировать этот сигнал... Это же для экономии энергии, в винде хост еще же не умеет отключать устройтсва из-за преувеличеного потребления (надеюсьsmile.gif))). Читал где то что усб 3.0 так будет уметь, но до него надо еще дожить...

Спасибо.



Практически все вопросы по ЛПЦ выяснил, остался последний.
Надо ли обнулять Клеар регистры после(перед) записью в них.
aaarrr
Цитата(Golikov A. @ Aug 12 2008, 16:24) *
Это же для экономии энергии, в винде хост еще же не умеет отключать устройтсва из-за преувеличеного потребления (надеюсьsmile.gif))).

Хаб у меня отключает со свистом. Правда, только при КЗ.
Golikov A.
Цитата(aaarrr @ Aug 12 2008, 16:29) *
Хаб у меня отключает со свистом. Правда, только при КЗ.


Предохранитель? Или вы мониторите порты на потребление?

Вот вопрос%( не использовать ваш хаб, или по уму запарится и сделать суспенд режим... Эм... что же выбратьsmile.gif)))) Учитывая внутренее использование, не использовать хаб победилоsmile.gif!
aaarrr
Цитата(Golikov A. @ Aug 12 2008, 16:49) *
Предохранитель? Или вы мониторите порты на потребление?

Хаб не мой, он в монитор встроен. А отключает винда с криком: "Power surge on port X".
Golikov A.
Цитата(aaarrr @ Aug 12 2008, 16:52) *
Хаб не мой, он в монитор встроен. А отключает винда с криком: "Power surge on port X".


Понятно, будем делать по уму значит...
galjoen
Цитата(Golikov A. @ Aug 12 2008, 17:00) *
Понятно, будем делать по уму значит...

По уму конечно лучше, сам так сделал. Но у меня ещё от ионистора всё это питатся может (без подключения к USB).
Но вот если мышку рассмотреть. Обычную оптическую. Она в режиме суспенд свой красный светодиод не выключает. Неужели там меньше 0.5 ма? Думаю, что больше (хотя не мерял). А кто нибудь встречал чтоб комп на мышку в суспенде ругался? Или в USB 3.0 будет? И всё это задумано с целью нас всех заставить мышки поменять?
Golikov A.
Цитата(galjoen @ Aug 12 2008, 20:40) *
По уму конечно лучше, сам так сделал. Но у меня ещё от ионистора всё это питатся может (без подключения к USB).
Но вот если мышку рассмотреть. Обычную оптическую. Она в режиме суспенд свой красный светодиод не выключает. Неужели там меньше 0.5 ма? Думаю, что больше (хотя не мерял). А кто нибудь встречал чтоб комп на мышку в суспенде ругался? Или в USB 3.0 будет? И всё это задумано с целью нас всех заставить мышки поменять?


Про 3.0 пока слухи, но там у хоста будет возможность прям линию питания отрубить. То есть будет прям физическое выключение. Я вот тоже думаю если сигнал суспенд игнорировать, всмысле никаких действий прибором не делать, так как если управления по усб нет то чего ему работать, а так прям за потребление меньше 0.5 ма не биться, то и нормально... Очень уж не охото всю перефирию глушить, а потом при пробуждении обратно инитить...
Golikov A.
УРА за АКАло.. Может кому то будет полезно...

Регистр USBCTRL в котором устанавливается режим чтения и записи. Эти биты снимаются если при записи записал все байты, или при чтении все прочитал. Но если эти биты оставить (получить длину пакета и выйти, или выйти с ошибкой до окончания чтения), ЛПЦ генерит при запросах какие-то ошибки и мигом происходит Ресет шины.

Команда Сет адрес действительно для насильной установке адреса требует двойного вызова. Потому как при одинарном вызове адрес присвоится только после удачной статус фазы сетап запроса. Что гарантирует ответ АСК по старому адресу и только после этого смену адреса как требует стандарт.

Последний вопрос который меня еще терзает, это очистка клеар регистров. Кто может внести ясность?
вот из мануала

For example, if VICSoftInt = 0x0000 0005 and bit 0 has to be
cleared, VICSoftIntClear = 0x0000 0001 will accomplish this. Before the new clear
operation on the same bit in VICSoftInt using writing into VICSoftIntClear is performed in
the future, VICSoftIntClear = 0x0000 0000 must be assigned. Therefore writing 1 to any
bit in Clear register will have one-time-effect in the destination register

Это верно только про этот регистр, или любой клиар регистр надо очищать, то есть делать вот так

DEVINTCLR = (USB_DEV_CDFULL|USB_DEV_CCEMPT); //clear all command int bits
DEVINTCLR = 0x00; //restore clr register
DEVINTCLR = (USB_DEV_CDFULL|USB_DEV_CCEMPT); //clear all command int bits

иначе повторный вызов не произведет никакой очистки...

Ну и вопрос, есть какой-нибудь усб-снифер, при помощи которого можно прослушать обмен с еще несконфигуренными устройствами? До того как виндоус зарегистрировал устройство? На шине проходит один лишний ресет, хочу понять чем он вызван... а мой снифер не видит подключаемые устройства, только опознанные виндусомsad.gif((

П.С Всем спасибо кто учувствовал в дискуссии...
drovik
В текст пока не вникал, но хотелось-бы увидеть дескрипторы для начала.
Golikov A.
Цитата(drovik @ Aug 14 2008, 12:29) *
В текст пока не вникал, но хотелось-бы увидеть дескрипторы для начала.


Зачемsmile.gif?

Почему когда спрашиваешь как в ЛПЦ задать адрес, тебе расказывают что в стандарте усб есть команда сет адрес. Почему когда спрашиваешь как организована функция отсулки данных, тебя спрашивают а дескрипторы правильные?


С этой темой разобрались уже.

1. Если не разрешено прерывание на входную конечную точку(данные от контролера к хосту), флаг не появляется в статусе.
2. Если очищать прерывания на выходную конечную точку после обработки. Можно пропустить следующий пришедший запрос, хост выдает их очень резво.
3. Если не очищать регистр USBCTRL, то недописав полные данные (в функции были пару выходов с оишбкой), это приводит в итоге к ресету на шине.

Пока не понял почему конечные точки находятся в состояние сталлед, хотя обмен дескрипторами идет уже нормальный.

И еще не выяснено как контролировать успешность отсылки данных хосту, просто флаг загружености буфера конечной точки не подходит, если начинать посылку сразу как убрался этот флаг, данные уходят неправильные...


А дескрипторы тут совершенно непричем...
Golikov A.
Всем привет!

Извеняюсь с выбором подфорума, наверное сюда...

Кто реализовал усб на ЛПЦ2148 или подобных. Как вы реализовывали реакцию на запрос CLEAR_FEATURE?

Что то у меня часто ресет выходит...
Golikov A.
Цитата(Golikov A. @ Aug 16 2008, 02:29) *
Всем привет!

Извеняюсь с выбором подфорума, наверное сюда...

Кто реализовал усб на ЛПЦ2148 или подобных. Как вы реализовывали реакцию на запрос CLEAR_FEATURE?

Что то у меня часто ресет выходит...


Сам нашел ответ. может кому пригодится

При ресете нашине УСБ, ЛПЦ переходит в ресетное состояние. Сбрасывает релайзы на точках, очищает буферы, делает 0 адрес, и переходит в неконфигурированное состояние. Это кристал делает сам, а не просит от разработчика. Только флаги разрешения прерываний не трогает.
В итоге я терял пару конечных точку, потому и клиар фича появлялся, и АСКать на него не давало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.