|
драйвер 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 вообще ничего не происходит. ничего не изменилось...
--------------------
все косяки, даже о которых не знает сам разработчик, - мои
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|