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

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

при изменении адреса допустим на 0x03 вообще ничего не происходит.

Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд.

Лучше вообще не объявляйте эту EP.

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


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

Так у вас вообще OUT EP с адресом 3 вообще обслуживается? Хотя-бы NAK отвечает? Если нет, то после 3 (или 5?) безответных запросов ваш девайс сбросят. А если NAKи слать, то через 5 секунд.

Лучше вообще не объявляйте эту EP.

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

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

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


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

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

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

Дескрипторы-то у вас передаются? Устройство ведь виндоусом пределяется? Оно в списке устройств USB есть?

Если есть, то:

1. Убрать дескриптор 2й EP.

2. Кол-во EP в дескрипторе интерфейса =1.

3. Общая длина в конфигурации на 7 меньше.

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


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

Дескрипторы-то у вас передаются? Устройство ведь виндоусом пределяется? Оно в списке устройств USB есть?

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

Если есть, то:

1. Убрать дескриптор 2й EP.

2. Кол-во EP в дескрипторе интерфейса =1.

3. Общая длина в конфигурации на 7 меньше.

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

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


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

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

 

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

Не другую, а ОДНУ. У вас сейчас 2 EP, с одинаковым адресом. Одна передающая (IN) её вы пытаетесь обслуживать. Другая принимающая (OUT). Вы её вообще обслуживаете??? Судя по логу - нет. Если нет, то она (необслуживаемая, но описанная EP) и является причиной сброса девайса.

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


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

Не другую, а ОДНУ. У вас сейчас 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);
    }
}

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


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

стала появляться ошибка

с одной конечной точкой такая фигня... и ещё не с первого раза конфигурируется...

при записи в регистр тест мод вот этого бита "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." вообще устройство не определяется...

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


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

вот теперь я точно ничего не понимаю... почему одинаковые адреса?? в книге Агурова написано

1. В книге Агурова под термином "канал сообщений", вероятно имелся в виду контрольный канал (EP 0). Но там вообще не нужно описывать EP, указывается только размер пакета (в дескрипторе DEVICE).

2. Вы пытаетесь пользоваться USB не разобравшись в том, что собственно там происходит. В надежде, что всё сразу заработает и вам не понадобится разбираться с теорией, вы потеряли столько времени, сколько вам бы хватило для изучения этой самой теории.

5. Аппноуты полезны только в том случае, если вы уже обладаете знанием теории.

6. Вот прикрепляю главу 8 (перевод не очень) сначала разберитесь с ней.

CH08_R.DOC

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


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

1. В книге Агурова под термином "канал сообщений", вероятно имелся в виду контрольный канал (EP 0). Но там вообще не нужно описывать EP, указывается только размер пакета (в дескрипторе DEVICE).

2. Вы пытаетесь пользоваться USB не разобравшись в том, что собственно там происходит. В надежде, что всё сразу заработает и вам не понадобится разбираться с теорией, вы потеряли столько времени, сколько вам бы хватило для изучения этой самой теории.

5. Аппноуты полезны только в том случае, если вы уже обладаете знанием теории.

6. Вот прикрепляю главу 8 (перевод не очень) сначала разберитесь с ней.

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

 

но как мне кажется ошибка не в том, что я делаю что-то неправильно, а просто где-то накосячил...

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


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

ну насколько я понимаю весь этот процес...

хост шлёт мне 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;
}

 

з.ы. удалось только сделать приём данных...

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


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

может быть всё дело в скорости записи... у меня 2 байта пишутся за 500нС... 64 байта следовательно пишутся за 16мкС... я имею ввиду буфер на микросхеме... хотя с другой стороны почти с такой же скоростью 64 байта и читаются...

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


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

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

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

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

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

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

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

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

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

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