Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: драйвер USBIO проблема передачи данных
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Mozart
использую 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. включаю прерывания.

когда прерывание происходит второй раз то компьютер уже ничего не получает.
в чём может быть проблема?
з.ы. Прерывание второй раз происходит смотрел под отладчиком
galjoen
Цитата(Mozart @ Jun 27 2008, 23:53) *
в чём может быть проблема?

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

enable disable endpoint?
galjoen
Цитата(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. включаю прерывания.
Mozart
я заново пересмотрел 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();?? точнее как она описывается...??
galjoen
Цитата(Mozart @ Jun 30 2008, 20:23) *
что такое Chap9_ControlWriteHandshake();?? точнее как она описывается...??

Это глава 9 описания работы USB. А именно передача через контрольный канал. Можно скачать с usb.org или вот русский перевод.
Нажмите для просмотра прикрепленного файла
Mozart
Цитата(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 я так понимаю нет, а если есть то где? я не нашёл.
а сигнал АСК, вообще устанавливать не надо?
Mozart
я прикрепил лог... из него видно что приходят запросы от хоста, и передаю я только один раз... а после закрытия устройства мне пишет это прога что я не отвечал на эти заросы... как мне надо на них ответить??
galjoen
Цитата(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 и все которые ещё/если есть.
Mozart
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
};


а как проверить приход сигнала АСК от хоста?
galjoen
Цитата(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.
Mozart
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.


точно!!! у мну же драйвер на фулл спиде вообще работает... и я где - то читал что так оно и есть в книге Агурова кажется....
Mozart
Цитата(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
Mozart
может быть я не на все запросы отвечаю??? хотя девайсина определяется... и вот что ещё заметил передача одного пакета происходит после ресета устройства... или перезагрузки программы....
Mozart
отправка одного пакета в 64 байта происходит когда я сделаю ресет устройству!!!... что может сбрасываться?... не пойму....
galjoen
Цитата(Mozart @ Jul 2 2008, 12:09) *
при изменении адреса допустим на 0x03 вообще ничего не происходит.

Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд.
Лучше вообще не объявляйте эту EP.
Mozart
Цитата(galjoen @ Jul 4 2008, 18:28) *
Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд.
Лучше вообще не объявляйте эту EP.

так чего делать???... я уже в тупике... я даже не знаю что предположить... вплоть до того что сама микросхема того... хотя на запросы отвечает, и правильно отвечает...
заметил вот какую штуку, если закрыть потом открыть устройство, то передается один пакет который я записал в фифо.
galjoen
Цитата(Mozart @ Jul 4 2008, 18:35) *
так чего делать???... я уже в тупике... я даже не знаю что предположить... вплоть до того что сама микросхема того... хотя на запросы отвечает, и правильно отвечает...
заметил вот какую штуку, если закрыть потом открыть устройство, то передается один пакет который я записал в фифо.

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

ну дык в том то и дело что девайсина определилась...
Цитата(galjoen @ Jul 4 2008, 18:53) *
Если есть, то:
1. Убрать дескриптор 2й EP.
2. Кол-во EP в дескрипторе интерфейса =1.
3. Общая длина в конфигурации на 7 меньше.

т.е. попробовать использвать другую ЕР??... попробую сегодня вечером... мысль...
galjoen
Цитата(Mozart @ Jul 4 2008, 18:59) *
ну дык в том то и дело что девайсина определилась...

т.е. попробовать использвать другую ЕР??... попробую сегодня вечером... мысль...

Не другую, а ОДНУ. У вас сейчас 2 EP, с одинаковым адресом. Одна передающая (IN) её вы пытаетесь обслуживать. Другая принимающая (OUT). Вы её вообще обслуживаете??? Судя по логу - нет. Если нет, то она (необслуживаемая, но описанная EP) и является причиной сброса девайса.
Mozart
Цитата(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);
    }
}
Mozart
прилагаю лог... енумерации и пр...
Mozart
стала появляться ошибка
Цитата
pipe82: Error code 0xE0000011: HC Error: XACT Error
Mozart
Цитата(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
с одной конечной точкой такая фигня... и ещё не с первого раза конфигурируется...
при записи в регистр тест мод вот этого бита "FORCEFS" который "A logic 1 forces the physical layer to full-speed mode only and disables the chirp detection logic." вообще устройство не определяется...
galjoen
Цитата(Mozart @ Jul 5 2008, 15:12) *
вот теперь я точно ничего не понимаю... почему одинаковые адреса?? в книге Агурова написано

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

я её перечитываю периодически... спасибо за чаптер 8...

но как мне кажется ошибка не в том, что я делаю что-то неправильно, а просто где-то накосячил...
Mozart
ну насколько я понимаю весь этот процес...
хост шлёт мне 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;
}


з.ы. удалось только сделать приём данных...
Mozart
может быть всё дело в скорости записи... у меня 2 байта пишутся за 500нС... 64 байта следовательно пишутся за 16мкС... я имею ввиду буфер на микросхеме... хотя с другой стороны почти с такой же скоростью 64 байта и читаются...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.