Перейти к содержанию
    

драйвер USBIO проблема передачи данных

использую 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. включаю прерывания.

 

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

в чём может быть проблема?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в чём может быть проблема?

В отсутствии переключения TOGGLE (DATA1/DATA0).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В отсутствии переключения TOGGLE (DATA1/DATA0).

enable disable endpoint?

Изменено пользователем Mozart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. включаю прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я заново пересмотрел 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();?? точнее как она описывается...??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что такое Chap9_ControlWriteHandshake();?? точнее как она описывается...??

Это глава 9 описания работы USB. А именно передача через контрольный канал. Можно скачать с usb.org или вот русский перевод.

CH09_R.DOC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. В чередовании идентификатора пакета (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 я так понимаю нет, а если есть то где? я не нашёл.

а сигнал АСК, вообще устанавливать не надо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

UTLog.rar

UTLog.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а сигнал АСК, вообще устанавливать не надо?

При передаче хосту (IN) ACK приходит от хоста, и его устанавливать не надо. Можно и нужно проверить пришёл-ли ACK от хоста в ответ на вашу передачу ему.

 

С логами что-то не разобрался. Что там за передача OUT к передающей (0x82) EP? Или это с точки зрения URB запросов OUT?

Но видимо происходят посылки NAK в ответ на IN от хоста (PENDING)? А какие прерывания (по какому событию) вы используете от EP N2? У bulk EP буфер можно заполнять заранее, т.е. использовать прерывания по опустошению буфера (успешной передаче - приёму ACK от хоста).

 

А вообще, чтоб было понятно, выложите дескрипторы вашего устройства - DEVICE, CONFIGURATION, INTERFACE, ENDPOINT и все которые ещё/если есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

?

а как проверить приход сигнала АСК от хоста?

В описании ISP1581 это д.б. описано.

 

Про дескрипторы прочтите главу 9, которую я посылал. Там только нет HIGH SPEED дескриптора, как впрочем и у вас. А у вас FS или HS девайс? Если FS - длину пакета EP = 0x200 нельзя - 0x40 max.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

ИМХО даташит на этот исп ущербен...

 

Про дескрипторы прочтите главу 9, которую я посылал. Там только нет HIGH SPEED дескриптора, как впрочем и у вас. А у вас FS или HS девайс? Если FS - длину пакета EP = 0x200 нельзя - 0x40 max.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4. В дескрипторе конфигурации:

0, //...wTotalLength

все дескрипторы описал как однобайтные, и wTotalLength в моём случае равен CONFIG_DESCRIPTOR_LENGTH = 32

2. Первая принимающая (IN) 0x82 и вторая передающая 0x02
при изменении адреса допустим на 0x03 вообще ничего не происходит.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...