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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> драйвер USBIO проблема передачи данных, передаётся первый пакет в 512байт второй не получает приложение...
Mozart
сообщение Jun 27 2008, 19:53
Сообщение #1


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

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



использую usb микросхему ISP1581 включенную в режиме GENERIC_MODE.
Скачала с сайта _http://www.thesycon.de/eng/usbio.shtml_ драйвер USBIO и "demo application executable (usbioapp.exe)"
Endpoint настроен как bulk максимальный размер пакета 512байт. При запросе на передачу данных в хост происходит прерывание к примеру от второй endpoint = EP2TX.
после произошедшего прерывания моя последовательность действий такая:

1. отключаю прерывания
2. выбираю конечную точку и устанавливаю длину буфера
3. заполняю буфер данными
4. устанавливаю сигнал ACK
5. включаю прерывания.

когда прерывание происходит второй раз то компьютер уже ничего не получает.
в чём может быть проблема?
з.ы. Прерывание второй раз происходит смотрел под отладчиком


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 30 2008, 14:20
Сообщение #2


Знающий
****

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



Цитата(Mozart @ Jun 27 2008, 23:53) *
в чём может быть проблема?

В отсутствии переключения TOGGLE (DATA1/DATA0).
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jun 30 2008, 15:25
Сообщение #3


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

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



Цитата(galjoen @ Jun 30 2008, 18:20) *
В отсутствии переключения TOGGLE (DATA1/DATA0).

enable disable endpoint?

Сообщение отредактировал Mozart - Jun 30 2008, 15:30


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 30 2008, 16:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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. включаю прерывания.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jun 30 2008, 16:23
Сообщение #5


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

Группа: Свой
Сообщений: 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();?? точнее как она описывается...??


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jun 30 2008, 16:31
Сообщение #6


Знающий
****

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



Цитата(Mozart @ Jun 30 2008, 20:23) *
что такое Chap9_ControlWriteHandshake();?? точнее как она описывается...??

Это глава 9 описания работы USB. А именно передача через контрольный канал. Можно скачать с usb.org или вот русский перевод.
Прикрепленный файл  CH09_R.DOC ( 335 килобайт ) Кол-во скачиваний: 1057
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 1 2008, 08:17
Сообщение #7


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

Группа: Свой
Сообщений: 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 я так понимаю нет, а если есть то где? я не нашёл.
а сигнал АСК, вообще устанавливать не надо?


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 1 2008, 14:53
Сообщение #8


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

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



я прикрепил лог... из него видно что приходят запросы от хоста, и передаю я только один раз... а после закрытия устройства мне пишет это прога что я не отвечал на эти заросы... как мне надо на них ответить??
Прикрепленные файлы
Прикрепленный файл  UTLog.rar ( 1.07 килобайт ) Кол-во скачиваний: 41
Прикрепленный файл  UTLog.html ( 136.69 килобайт ) Кол-во скачиваний: 161
 


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jul 1 2008, 19:11
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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 и все которые ещё/если есть.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 1 2008, 19:39
Сообщение #10


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

Группа: Свой
Сообщений: 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


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
galjoen
сообщение Jul 1 2008, 20:22
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 1 2008, 20:35
Сообщение #12


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

Группа: Свой
Сообщений: 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.


точно!!! у мну же драйвер на фулл спиде вообще работает... и я где - то читал что так оно и есть в книге Агурова кажется....


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 2 2008, 08:09
Сообщение #13


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

Группа: Свой
Сообщений: 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 вообще ничего не происходит.

ничего не изменилось... crying.gif


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 3 2008, 06:34
Сообщение #14


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

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



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


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Mozart
сообщение Jul 3 2008, 14:11
Сообщение #15


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

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



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


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post

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

 


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


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