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

 
 
> USB LPC2000, как работае
Golikov A.
сообщение Aug 7 2008, 13:03
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Привет!

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

На ЛПЦ 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;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Diz
сообщение Aug 9 2008, 00:56
Сообщение #2


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

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Посмотрите lpcusb - http://wiki.sikken.nl/index.php?title=LPCUSB
На первый взгляд очень вменяемо написанный фреймворк, собираюсь пробовать в ближайшем времени на lpc2468.

Сообщение отредактировал Diz - Aug 9 2008, 00:57
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 9 2008, 08:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(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... Сколько времени дают на обработку запросов?
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 9 2008, 09:48
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Из вопроса видно, что Вы не понимаетет сам 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? Это разные документы.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 9 2008, 11:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(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% случаев это так и есть, запрещается не флаг, а реакция на флаг и тут не причем пик.

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

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

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

Обидно что нет аплекейшен нота по усб от производителя... Есть куча примеров, в которых огромное колличество ошибок, и по структуре которых не видно что автор имел полное понимание работы системы.
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 10 2008, 17:38
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(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.
Вы говорите о каком регистре? Я так понял что о первом. Тогда не разрешив биты Вы не увидите флагов.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 10 2008, 18:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Привет! Спасибо за ответ.

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


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


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

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

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


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

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

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

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

У вас нет ли своего примера УСБ? или не окажите ли мне честь посмотреть мой код?
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 11 2008, 11:25
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(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 как я понимаю.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 11 2008, 12:06
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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


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

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

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

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

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

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

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

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

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

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

В результате я временами получаю ресет на шине, я так понимаю это связанно с тем что выходит таймоут на ответ по запросу хоста. Какие вообще таймоуты на ответ? У УСБ 1.0 и 2.0 они разные?
Go to the top of the page
 
+Quote Post
galjoen
сообщение Aug 11 2008, 12:45
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(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 это время задаётся.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Golikov A.   USB LPC2000   Aug 7 2008, 13:03
- - Golikov A.   Здравствуйте! Дальнейшие копания привели меня...   Aug 8 2008, 20:34
|- - Golikov A.   Ура с бардаком разобрался, я убирал флаг после отв...   Aug 11 2008, 09:24
||- - Golikov A.   Цитата(galjoen @ Aug 11 2008, 16:45) 1. С...   Aug 11 2008, 13:22
||- - galjoen   Цитата(Golikov A. @ Aug 11 2008, 17:22) Д...   Aug 11 2008, 14:08
||- - Golikov A.   Цитата(galjoen @ Aug 11 2008, 18:08) Не с...   Aug 11 2008, 14:30
||- - galjoen   Цитата(Golikov A. @ Aug 11 2008, 18:30) Т...   Aug 11 2008, 15:57
||- - Golikov A.   Цитата(galjoen @ Aug 11 2008, 19:57) NAK-...   Aug 11 2008, 17:21
|||- - amw   Цитата(Golikov A. @ Aug 11 2008, 20:21) С...   Aug 11 2008, 20:48
|||- - Axel   Цитата(Golikov A. @ Aug 11 2008, 21:21) ....   Aug 12 2008, 05:41
||- - Golikov A.   Уважаемый galjoen Не подскажете ли мне еще по ста...   Aug 12 2008, 08:49
||- - galjoen   Цитата(Golikov A. @ Aug 12 2008, 12:49) У...   Aug 12 2008, 10:17
||- - Golikov A.   Цитата(galjoen @ Aug 12 2008, 14:17) Личн...   Aug 12 2008, 10:36
||- - galjoen   Цитата(Golikov A. @ Aug 12 2008, 14:36) 3...   Aug 12 2008, 10:49
||- - Golikov A.   Цитата(galjoen @ Aug 12 2008, 14:49) Реше...   Aug 12 2008, 12:24
||- - aaarrr   Цитата(Golikov A. @ Aug 12 2008, 16:24) Э...   Aug 12 2008, 12:29
||- - Golikov A.   Цитата(aaarrr @ Aug 12 2008, 16:29) Хаб у...   Aug 12 2008, 12:49
||- - aaarrr   Цитата(Golikov A. @ Aug 12 2008, 16:49) П...   Aug 12 2008, 12:52
||- - Golikov A.   Цитата(aaarrr @ Aug 12 2008, 16:52) Хаб н...   Aug 12 2008, 13:00
||- - galjoen   Цитата(Golikov A. @ Aug 12 2008, 17:00) П...   Aug 12 2008, 16:40
||- - Golikov A.   Цитата(galjoen @ Aug 12 2008, 20:40) По у...   Aug 12 2008, 17:17
||- - Golikov A.   УРА за АКАло.. Может кому то будет полезно... Рег...   Aug 12 2008, 21:14
|- - amw   Цитата(Golikov A. @ Aug 11 2008, 15:06) П...   Aug 11 2008, 15:53
- - drovik   В текст пока не вникал, но хотелось-бы увидеть дес...   Aug 14 2008, 08:29
|- - Golikov A.   Цитата(drovik @ Aug 14 2008, 12:29) В тек...   Aug 14 2008, 08:57
- - Golikov A.   Всем привет! Извеняюсь с выбором подфорума, н...   Aug 15 2008, 22:29
- - Golikov A.   Цитата(Golikov A. @ Aug 16 2008, 02:29) В...   Aug 17 2008, 22:12


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

 


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


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