|
драйвер USBIO проблема передачи данных, передаётся первый пакет в 512байт второй не получает приложение... |
|
|
|
Jun 30 2008, 15:25
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jun 30 2008, 18:20)  В отсутствии переключения TOGGLE (DATA1/DATA0). enable disable endpoint?
Сообщение отредактировал Mozart - Jun 30 2008, 15:30
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jun 30 2008, 16:18
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jun 30 2008, 19:25)  enable disable endpoint? Нет. В чередовании идентификатора пакета (PID) DATA1 и DATA0 у передаваемых данных. Если два блока данных передаются с одинаковыми DATA, то принимающий считает, что его ACK на 1й блок не дошёл (был повреждён) и передающий перепослал те-же данные (т.к. PID тот-же) , шлёт ACK, а эти данные отбрасывает. Обычно переключение обозначается TOGGLE. У ISP1581 не знаю как обозначается (не пользовался). М.б. у неё автоматически переключается - тогда enable disable endpoint нельзя т.к. 1й пакет всегда будет с DATA1. Но д.б. режим и с переключением вручную. Д.б. так: 1. отключаю прерывания 2. выбираю конечную точку и устанавливаю длину буфера 3. заполняю буфер данными 4. Устанавливаю TOGGLE 5. Разрешаю передачу (TxEN?), а не "4. устанавливаю сигнал ACK"? 6. включаю прерывания.
|
|
|
|
|
Jun 30 2008, 16:23
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
я заново пересмотрел datasheet Цитата Note: ‘Stalling’ a data endpoint will confuse the Data Toggle bit on the stalled endpoint because the internal logic picks up from where it has stalled. Therefore, the Data Toggle bit must be reset by disabling and re-enabling the corresponding endpoint (by setting the bit ‘ENABLE’ to 0 or 1 in the endpoint type register) to reset the PID. больше про Toggle data ничего не сказано...а в programmers guide Код // Clear the data toggle bit to (set to 0) and clear buffers before clear stall of // the endpoint. wEPCFG = ISP1581_GetEndpointConfig(endp); ISP1581_SetEndpointConfig(endp, 0); // disable endpoint * // Enable endpoint, clear the buffer and set the data toggle bit to 0. ISP1581_SetEndpointConfig(endp, wEPCFG); ISP1581_SetEndpointStatus(endp, 0); // clear the Stall condition of the //endpoint. Chap9_ControlWriteHandshake(); только вот это... что такое Chap9_ControlWriteHandshake();?? точнее как она описывается...??
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 1 2008, 08:17
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jun 30 2008, 20:18)  Нет. В чередовании идентификатора пакета (PID) DATA1 и DATA0 у передаваемых данных. Если два блока данных передаются с одинаковыми DATA, то принимающий считает, что его ACK на 1й блок не дошёл (был повреждён) и передающий перепослал те-же данные (т.к. PID тот-же) , шлёт ACK, а эти данные отбрасывает. Обычно переключение обозначается TOGGLE. У ISP1581 не знаю как обозначается (не пользовался). М.б. у неё автоматически переключается - тогда enable disable endpoint нельзя т.к. 1й пакет всегда будет с DATA1. Но д.б. режим и с переключением вручную. Д.б. так: 1. отключаю прерывания 2. выбираю конечную точку и устанавливаю длину буфера 3. заполняю буфер данными
4. Устанавливаю TOGGLE 5. Разрешаю передачу (TxEN?), а не "4. устанавливаю сигнал ACK"?
6. включаю прерывания. у ISP1581 автоматически происходит передача когда регистр buffer length становится равным MaxPcktSizе, если размер данных меньше MaxPcktSizе то можно битом VENDP дёрнуть и они якобы уйдут, ручное переключение TOGGLE я так понимаю нет, а если есть то где? я не нашёл. а сигнал АСК, вообще устанавливать не надо?
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 1 2008, 14:53
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
я прикрепил лог... из него видно что приходят запросы от хоста, и передаю я только один раз... а после закрытия устройства мне пишет это прога что я не отвечал на эти заросы... как мне надо на них ответить??
Прикрепленные файлы
UTLog.rar ( 1.07 килобайт )
Кол-во скачиваний: 41
UTLog.html ( 136.69 килобайт )
Кол-во скачиваний: 161
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 1 2008, 19:11
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jul 1 2008, 12:17)  а сигнал АСК, вообще устанавливать не надо? При передаче хосту (IN) ACK приходит от хоста, и его устанавливать не надо. Можно и нужно проверить пришёл-ли ACK от хоста в ответ на вашу передачу ему. С логами что-то не разобрался. Что там за передача OUT к передающей (0x82) EP? Или это с точки зрения URB запросов OUT? Но видимо происходят посылки NAK в ответ на IN от хоста (PENDING)? А какие прерывания (по какому событию) вы используете от EP N2? У bulk EP буфер можно заполнять заранее, т.е. использовать прерывания по опустошению буфера (успешной передаче - приёму ACK от хоста). А вообще, чтоб было понятно, выложите дескрипторы вашего устройства - DEVICE, CONFIGURATION, INTERFACE, ENDPOINT и все которые ещё/если есть.
|
|
|
|
|
Jul 1 2008, 19:39
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
0x82 это адрес конечной точки, в данном случае она вторая EP2TX (IN). Код CONFIGURATION_DESCRIPTOR config_descriptor = { SIZEOF_USB_CONFIGURATION_DESCRIPTOR,//...bLength USB_CONFIGURATION_DESCRIPTOR_TYPE, //...bDescriptorType CONFIG_DESCRIPTOR_LENGTH, 0, //...wTotalLength 0x01, //...bNumInterfaces 0x01, //...bConfigurationValue 0x00, //...iConfiguration 0x60, //...bmAttributes 0x01 //...MaxPower };
INTERFACE_DESCRIPTOR interface_descriptor = { SIZEOF_USB_INTERFACE_DESCRIPTOR, //...bLength USB_INTERFACE_DESCRIPTOR_TYPE, //...bDescriptorType 0x00, //...bInterfaceNumber 0x00, //...bAlternateSetting NUM_ENDPOINTS, //...bNumEndpoints USB_CLASS_CODE_TEST_CLASS_DEVICE, //...bInterfaceClass USB_SUBCLASS_CODE_TEST_CLASS, //...bInterfaceSubClass USB_PROTOCOL_CODE_TEST_CLASS, //...bInterfaceProtocol 0x00 //...iInterface };
ENDPOINT_DESCRIPTOR EP2_TXDescr = { SIZEOF_USB_ENDPOINT_DESCRIPTOR, //...bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //...bDescriptorType 0x82, //...bEndpointAddress USB_ENDPOINT_TYPE_BULK, //...bmAttributes EP2_PACKET_SIZE&0xff,EP2_PACKET_SIZE/256,//...wMaxPacketSize // 0x20,0x3, //...wMaxPacketSize 0x0A //...bInterval }; ENDPOINT_DESCRIPTOR EP2_RXDescr = { SIZEOF_USB_ENDPOINT_DESCRIPTOR, //...bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //...bDescriptorType 0x02, //...bEndpointAddress USB_ENDPOINT_TYPE_BULK, //...bmAttributes EP2_PACKET_SIZE&0xff,EP2_PACKET_SIZE/256, //...wMaxPacketSize // 0x40,0x4, //...wMaxPacketSize 0x0A //...bInterval }; а как проверить приход сигнала АСК от хоста?
Сообщение отредактировал Mozart - Jul 1 2008, 19:40
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 1 2008, 20:22
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jul 1 2008, 23:39)  0x82 это адрес конечной точки, в данном случае она вторая EP2TX (IN). 1. У вас две конечные точки с адресом 2. Первая принимающая (IN) 0x82 и вторая передающая 0x02. Так делать нельзя (забыл где читал), адреса д.б. разными (например 0x82 и 0x03). 2. Зачем вам удалённое пробуждение? 0x60, //...bmAttributes 3. Внешнее питание, и при этом потребление 2 мА? 0x01 //...MaxPower 4. В дескрипторе конфигурации: 0, //...wTotalLength А там д.б. длины дескрипторов: конфигурации (9) + интерфейса (9) + EP (7*2) =32. Странно, что вообще работает. 5. Чему равны поля NUM_ENDPOINTS, //...bNumEndpoints USB_CLASS_CODE_TEST_CLASS_DEVICE, //...bInterfaceClass USB_SUBCLASS_CODE_TEST_CLASS, //...bInterfaceSubClass USB_PROTOCOL_CODE_TEST_CLASS, //...bInterfaceProtocol ? Цитата(Mozart @ Jul 1 2008, 23:39)  а как проверить приход сигнала АСК от хоста? В описании ISP1581 это д.б. описано. Про дескрипторы прочтите главу 9, которую я посылал. Там только нет HIGH SPEED дескриптора, как впрочем и у вас. А у вас FS или HS девайс? Если FS - длину пакета EP = 0x200 нельзя - 0x40 max.
|
|
|
|
|
Jul 1 2008, 20:35
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
0x01 //...MaxPower - это случайно затисалось, там должен быть нуль... NUM_ENDPOINTS, //...bNumEndpoints = 2 USB_CLASS_CODE_TEST_CLASS_DEVICE, //...bInterfaceClass = 0xDC USB_SUBCLASS_CODE_TEST_CLASS, //...bInterfaceSubClass = 0xA0 USB_PROTOCOL_CODE_TEST_CLASS, //...bInterfaceProtocol = 0xB0 ИМХО даташит на этот исп ущербен... Цитата(galjoen @ Jul 2 2008, 00:22)  Про дескрипторы прочтите главу 9, которую я посылал. Там только нет HIGH SPEED дескриптора, как впрочем и у вас. А у вас FS или HS девайс? Если FS - длину пакета EP = 0x200 нельзя - 0x40 max. точно!!! у мну же драйвер на фулл спиде вообще работает... и я где - то читал что так оно и есть в книге Агурова кажется....
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 2 2008, 08:09
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jul 2 2008, 00:22)  4. В дескрипторе конфигурации: 0, //...wTotalLength все дескрипторы описал как однобайтные, и wTotalLength в моём случае равен CONFIG_DESCRIPTOR_LENGTH = 32 Цитата(galjoen @ Jul 2 2008, 00:22)  2. Первая принимающая (IN) 0x82 и вторая передающая 0x02 при изменении адреса допустим на 0x03 вообще ничего не происходит. ничего не изменилось...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 4 2008, 14:28
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jul 2 2008, 12:09)  при изменении адреса допустим на 0x03 вообще ничего не происходит. Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд. Лучше вообще не объявляйте эту EP.
|
|
|
|
|
Jul 4 2008, 14:35
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jul 4 2008, 18:28)  Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд. Лучше вообще не объявляйте эту EP. так чего делать???... я уже в тупике... я даже не знаю что предположить... вплоть до того что сама микросхема того... хотя на запросы отвечает, и правильно отвечает... заметил вот какую штуку, если закрыть потом открыть устройство, то передается один пакет который я записал в фифо.
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 4 2008, 14:53
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jul 4 2008, 18:35)  так чего делать???... я уже в тупике... я даже не знаю что предположить... вплоть до того что сама микросхема того... хотя на запросы отвечает, и правильно отвечает... заметил вот какую штуку, если закрыть потом открыть устройство, то передается один пакет который я записал в фифо. Дескрипторы-то у вас передаются? Устройство ведь виндоусом пределяется? Оно в списке устройств USB есть? Если есть, то: 1. Убрать дескриптор 2й EP. 2. Кол-во EP в дескрипторе интерфейса =1. 3. Общая длина в конфигурации на 7 меньше.
|
|
|
|
|
Jul 4 2008, 14:59
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jul 4 2008, 18:53)  Дескрипторы-то у вас передаются? Устройство ведь виндоусом пределяется? Оно в списке устройств USB есть? ну дык в том то и дело что девайсина определилась... Цитата(galjoen @ Jul 4 2008, 18:53)  Если есть, то: 1. Убрать дескриптор 2й EP. 2. Кол-во EP в дескрипторе интерфейса =1. 3. Общая длина в конфигурации на 7 меньше. т.е. попробовать использвать другую ЕР??... попробую сегодня вечером... мысль...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 5 2008, 11:12
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jul 4 2008, 19:07)  Не другую, а ОДНУ. У вас сейчас 2 EP, с одинаковым адресом. Одна передающая (IN) её вы пытаетесь обслуживать. Другая принимающая (OUT). Вы её вообще обслуживаете??? Судя по логу - нет. Если нет, то она (необслуживаемая, но описанная EP) и является причиной сброса девайса. вот теперь я точно ничего не понимаю... почему одинаковые адреса?? в книге Агурова написано Цитата код адреса bEndpointAddress сожержит следующие биты: [7] направление передачи (игнорируется для каналов сообщений) 0 - OUT (от хоста) 1 - IN (к хосту) насколько я понимаю лог, то OUT это запрос направленный из хоста в девайс, в котором и есть запрос на передачу данных. из девайса в хост (IN). а вот если устройство закрыть, открыть, установить конфигурацию, то передаётся ещё один пакет... при закрытии выаолняется запрос SetConfig: ReqUSB->wValue = 0; при установке конфигурации ReqUSB->wValue = 0х01 Код void SetConfig(void) { IntFlag &= ~(1 << ISP_INT_EP0RX); //USB_Int_Flag.BITS.EP0RX = 0;
if(ReqUSB->wValue == 0) { Device_Config_Value = 0; ep0in_ack(); wait_ep0tx(); } //else if (ReqUSB->wValue == 0x0100) else if (ReqUSB->wValue == 0x01) { Device_Config_Value = (unsigned char)(ReqUSB->wValue); ep0in_ack(); wait_ep0tx(); } else { //WriteByteToISP(ISP_REG_ENDP_INDX, 1); WriteByteToISP(ISP_REG_ENDP_INDX, ISP_ENDP_EP0TX); CntrlFun |= (1 << ISP_CNTRL_STALL); WriteByteToISP(ISP_REG_CNTRL_FUN, CntrlFun); while (!(IntFlag & (1 << ISP_INT_EP0SET))) { IntFlag |= ReadByteFromISP(ISP_REG_INT); WriteByteToISP(ISP_REG_INT, IntFlag); if ((IntFlag & (1 << ISP_INT_SUSP)) || (IntFlag & (1 << ISP_INT_RESET))) return; } IntFlag &= ~(1 << ISP_INT_EP0TX); } }
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 5 2008, 21:52
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
прилагаю лог... енумерации и пр...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 6 2008, 18:29
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
стала появляться ошибка Цитата pipe82: Error code 0xE0000011: HC Error: XACT Error
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 7 2008, 06:49
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(Mozart @ Jul 6 2008, 22:29)  стала появляться ошибка с одной конечной точкой такая фигня... и ещё не с первого раза конфигурируется... при записи в регистр тест мод вот этого бита "FORCEFS" который "A logic 1 forces the physical layer to full-speed mode only and disables the chirp detection logic."
Сообщение отредактировал Mozart - Jul 7 2008, 06:57
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 7 2008, 13:11
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Mozart @ Jul 5 2008, 15:12)  вот теперь я точно ничего не понимаю... почему одинаковые адреса?? в книге Агурова написано 1. В книге Агурова под термином "канал сообщений", вероятно имелся в виду контрольный канал (EP 0). Но там вообще не нужно описывать EP, указывается только размер пакета (в дескрипторе DEVICE). 2. Вы пытаетесь пользоваться USB не разобравшись в том, что собственно там происходит. В надежде, что всё сразу заработает и вам не понадобится разбираться с теорией, вы потеряли столько времени, сколько вам бы хватило для изучения этой самой теории. 5. Аппноуты полезны только в том случае, если вы уже обладаете знанием теории. 6. Вот прикрепляю главу 8 (перевод не очень) сначала разберитесь с ней.
Прикрепленные файлы
CH08_R.DOC ( 263.5 килобайт )
Кол-во скачиваний: 72
|
|
|
|
|
Jul 7 2008, 14:15
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
Цитата(galjoen @ Jul 7 2008, 17:11)  1. В книге Агурова под термином "канал сообщений", вероятно имелся в виду контрольный канал (EP 0). Но там вообще не нужно описывать EP, указывается только размер пакета (в дескрипторе DEVICE). 2. Вы пытаетесь пользоваться USB не разобравшись в том, что собственно там происходит. В надежде, что всё сразу заработает и вам не понадобится разбираться с теорией, вы потеряли столько времени, сколько вам бы хватило для изучения этой самой теории. 5. Аппноуты полезны только в том случае, если вы уже обладаете знанием теории. 6. Вот прикрепляю главу 8 (перевод не очень) сначала разберитесь с ней. я её перечитываю периодически... спасибо за чаптер 8... но как мне кажется ошибка не в том, что я делаю что-то неправильно, а просто где-то накосячил...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
|
Jul 8 2008, 15:03
|

Частый гость
 
Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829

|
ну насколько я понимаю весь этот процес... хост шлёт мне IN пакет, по мануалу я заполняю буфер и шлю "ОК" (хз что они имеют ввиду под "ОК"), потом хост мне шлёт АСК в случае успешного принятия этих данных, или вообще ничего не шлёт, что свидетельствует о том что хост данные не принял. также по мануалу, данные автоматически передаются когда счётчик ФИФО достигает Max Packe Size или до тех пор пока я принудительно их не отправлю... я обращался в nxp на предмет что такое "ОК" и как мне проверить приход сигнала АСК, и нужно ли его проверять... они мне ничего не сказали, что всё мол по стандарту, а потом отослали в ближайшую их службу... идиоты или я дурак.... если честно то я до сих не понимаю что мне делать... точнее как может в программе надо что-то установить?? люди... не дайте пропасть моей грешной душе... может быть я какой-нибудь запрос не верно обрабатываю?... может suspend resume... вот мой кусок кода Код unsigned int write_endpoint(unsigned char endp, unsigned int lenB, unsigned char *buf) {
unsigned int data; WriteByteToISP(ISP_REG_ENDP_INDX, endp); WriteByteToISP(ISP_REG_BUFF_LENGTH, lenB);
SetAddr(ISP_REG_DATA); while (lenB) { data = *buf++; data |= *buf++ << 8; WriteData(data); lenB -= 2; }
return lenB; } з.ы. удалось только сделать приём данных...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|