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

USB CDC (AT91SAM7S64) не работает

Здравствуйте...

Существует следующая проблема - сделал устройство на основе отладочного Evalution Kit AT91SAM7S64, внутрисхемный отладчик IAR входил в комплект и работал только со старой версией IAR 4.22 (вроде), что была на диске с Kitом, другими (старшими) версиями не определялся этот отладчик cegger IAR, а также никакие программы от более поздних версий не компилировались из-за разницы в библиотеках...

фактически - был найдет проект USB-UART, который компилировался под IAR 4.22 (но опять же с версией могу ошибиться) - плата определялась как CDC устройство... либо как класс модема, либо как usb-класс... был выбран первый случай, т.к. в этом варианте ей присваивался виртуальный COM-порт типа COM26, но хотя бы в реестре можно вынудить этот номер порта и спокойно общаться, как с обычным com-портом... и все бы хорошо... но...

У заказчика 12 компов, купленных кучей... с материнской платой GA-K8NF-9, там атлон, крякнутая винда, антивир и куча неприятностей... на нем происходит следующая картина - AT91SAM7S64 принимает сколько угодно от компа, но когда отправляет всего 1 посылку Write(&pCDC,data,leng);, далее по диодикам понятно - что он работает как надо, но в компьютер кроме первой посылки ничего больше не доходит... я испробовал кучу компов на своем предприятии - со всеми работает, включая на основе Itanium, CoreQuard и Xeon - все работает... атлонов у нас вообще нет((( но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет...

Что это может быть? Может кто-нибудь сталкивался с подобным?

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

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

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


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

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

 

Очень трудно что-то советовать. Какой у вас макс. размер пакета для данной конечной точки ? И сколько байтов вы пытаетесь отправить в машину за один раз ?

Как вариант - взять пример CDC от того же Keil, откомпилировать и посмотреть, что будет. Еще вариант - с помощью Bushound или аппаратного USB-сниффера (конечно, аппаратный сниффер гораздо лучше) посмотреть, как именно сбивается обмен ...

 

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


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

Было такое, решилось. Посмотрите как в вашем проекте идет обращение к регистрам UDP->CSR и как рекомендует документация (там есть примеры макросов). В старых версиях Атмеловского фреймвока эти самые макросы не использовались, это и приводило к такому глюку.

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


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

но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет...

Может быть, у них действительно глючный компьютер?

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

 

Заодно бредовая мысль для проверки: не просматривается ли закономерность: на компьютерах с контроллером UHCI все работает, а с OHCI - не работает, или наоборот?

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


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

prottoss

взят из старого проекта Usart-USB 1.0/BasicUSB1.1, файл cdc_enumerate.c

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

см путь... AT91SAM7S-BasicUSB/src/cdc_enumerate.c

 

kovigor

шлются сообщения по 14 байт (вместе с /r/n) с частотой от 1 до 4 Гц...

но это не принципиально - если даже 1 раз послать 1 байт - то все... плата

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

проверенно на Win7 и ALT Linux 4...

от Keil вряд ли что выйдет - полная несовместимсоть по библиотекам... от IAR 5 даже не удается...

но попробуем...

аппаратного сниффера нет... Bushound попытаюсь тоже изучить-проверить...

 

Sergey_Reva

Дело в том что весь этот проект основан на файлах, взятых с официального диска IAR... я допускал,

что там нет никаких противоречий с документацией на то время...

В новых версиях IAR не работает данный программатор впринципе, в старой Вы говорите о глюке макроса (((

Речь идет об обращениях в lib_AT91SAM7S64.h (опять же стандартный в IAR)?:

__inline void AT91F_UDP_EpStall(
    AT91PS_UDP pUDP,     // \arg pointer to a UDP controller
    unsigned char endpoint)   // \arg endpoint number
{
    pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL;
}
_inline void AT91F_UDP_EpEndOfWr(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint)  // \arg endpoint number
{
    pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;
}

__inline void AT91F_UDP_EpClear(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint,  // \arg endpoint number
    unsigned int flag)       // \arg flag to be cleared
{
    pUDP->UDP_CSR[endpoint] &= ~(flag);
}

__inline void AT91F_UDP_EpSet(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint,  // \arg endpoint number
    unsigned int flag)       // \arg flag to be cleared
{
    pUDP->UDP_CSR[endpoint] |= flag;
}

__inline unsigned int AT91F_UDP_EpStatus(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint)  // \arg endpoint number
{
    return pUDP->UDP_CSR[endpoint];
}

этот файл так же есть в приложенном демо-проекте, папка include

 

или я и тут ничего не понимаю?

 

Andrey Vasilyev

Возможно и глючный, но не один же я с такой проблемой - явно где-то это должно быть описанно, мне кажется вероятнее всего

проблема всетаки в стандартных IARных библиотеках...

 

собстна пока нашу группу компьютеров от их одного отличает только то, что у нас везде разные варианты Intel, у них тут AMD, интерфейсы у нас есть все - OHCI,UHCI и EHCI - и все работает... ну не xHCI же у них...

 

p.s. спасибо за ответы

p.s.s фактически не один пример (там их три на работу с USB) с официального диска не заработал на том компьютере, включая тот, что я выкладываю... на наших - все чудесно пашет...

AT91SAM7S64_BasicUSB_IAR4_11A_1_1.zip

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

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


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

http://www.atmel.com/dyn/resources/prod_do...nts/doc6175.pdf

пункт 35.6.10 стр 527

 

Посмотрите как необходимо устанавливать/сбрасывать флаги регистра CSRx, скорее всего у Вас действительно старый код.

Возьмите свежую версию USB framework, родную от Atmel, и проблема должна исчезнуть

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

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


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

Речь идет об обращениях в lib_AT91SAM7S64.h (опять же стандартный в IAR)?:

Вот так делать и нельзя. Правильный вариант:

#define UDP_CSR_CLR(endpoint, flags)                    \
{                                                        \
    u_int cpsr_t = store_disable_irq();                    \
    AT91C_BASE_UDP->UDP_CSR[endpoint] &= ~(flags);        \
    while(AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags));    \
    restore_irq(cpsr_t);                                \
}

#define UDP_CSR_SET(endpoint, flags)                    \
{                                                        \
    u_int cpsr_t = store_disable_irq();                    \
    AT91C_BASE_UDP->UDP_CSR[endpoint] |= (flags);        \
    while((AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags)) != (flags)); \
    restore_irq(cpsr_t);                                \
}

Как сохранить/восстановить статус прерываний (store_disable_irq(), restore_irq()) посмотрите в хелпе на свой компилятор.

 

Кроме того, следует обрамить запретом прерываний связку "установка TXPKTRDY - сброс TXCOMP".

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


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

prottoss

взят из старого проекта Usart-USB 1.0/BasicUSB1.1, файл cdc_enumerate.c

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

см путь... AT91SAM7S-BasicUSB/src/cdc_enumerate.c

Я вот почему спросил про дескриптор. Аналогичная проблема возникает при работе с штатным загрузчиком ВСЕХ МК серии AT91 через SAM-BA. На INTEL-чипсетах работает, на других НЕТ. Так что все что Вам тут выше наговорили, конечно, верно, но непосредственно к проблеме не относится. Проблема возникает как раз если работать с загрузчиком через драйвер usbser.sys.

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


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

Sergey Reva, aaarrr

Спасибо за некоторые пояснения... кажется я начинаю понимать!!!

Но чем дальше, тем труднее понимание :)

 

http://www.atmel.com/dyn/resources/prod_do...nts/doc6175.pdf

пункт 35.6.10 стр 527

 

Посмотрите как необходимо устанавливать/сбрасывать флаги регистра CSRx, скорее всего у Вас действительно старый код.

Возьмите свежую версию USB framework, родную от Atmel, и проблема должна исчезнуть

 

Удивительно какой же у вас опыт что встречали эту ошибку и нашли ее решение... Я то по наивности размышлял что в демо программе к программатору все верно... только сегодня заметил - что и демо программа то тоже не работает на этом компьютере....

 

перепробовал 3 различные версии lib_AT92SAM7S64.h... - все бестолку... один и тот же код в этом куске... а более новые frameworkи уже не содержат подобной библиотеки, там сделали CDCDriver.c, USBD_UDP.c, CDCLine.c и еще много чего... не так все просто и не хочет оно собираться в 4.11 как не крутил я их около часу, но опять же хочется разобраться окончательно и попытаться исправить исходную библиотеку, если конечно вы поможете...

 

допустим

u_int cpsr_t = store_disable_irq();

я так понимаю речь идет о нечто вроде

volatile unsigned int reg = AT91C_BASE_UDP->UDP_CSR[endpoint]; \
        reg |= REG_NO_EFFECT_1_ALL; 
reg &= ~(flags); \
        AT91C_BASE_UDP->UDP_CSR[endpoint] = reg; \
        while ( (AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags)) == (flags)); \

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


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

Замените пока работу с флагами на корректный вариант:

__inline void AT91F_UDP_EpEndOfWr(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint)  // \arg endpoint number
{
    __istate_t isate = __get_interrupt_state();
    __disable_interrupt();
    pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY;
    while(!(pUDP->UDP_CSR[endpoint] & AT91C_UDP_TXPKTRDY));
    __set_interrupt_state(istate);
}

__inline void AT91F_UDP_EpClear(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint,  // \arg endpoint number
    unsigned int flag)       // \arg flag to be cleared
{
    __istate_t isate = __get_interrupt_state();
    __disable_interrupt();
    pUDP->UDP_CSR[endpoint] &= ~(flag);
    while((pUDP->UDP_CSR[endpoint] & (flag)) == (flag));
    __set_interrupt_state(istate);
}

__inline void AT91F_UDP_EpSet(
    AT91PS_UDP pUDP,         // \arg pointer to a UDP controller
    unsigned char endpoint,  // \arg endpoint number
    unsigned int flag)       // \arg flag to be cleared
{
    __istate_t isate = __get_interrupt_state();
    __disable_interrupt();
    pUDP->UDP_CSR[endpoint] |= flag;
    while((pUDP->UDP_CSR[endpoint] & (flag)) != (flag));
    __set_interrupt_state(istate);
}

Надеюсь, IAR 4.33 переварит.

 

Ну и про TXPKTRDY-TXCOMP не забудьте.

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


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

Sergey Reva, aaarrr

Спасибо за некоторые пояснения... кажется я начинаю понимать!!!

Но чем дальше, тем труднее понимание :)

 

http://www.atmel.com/dyn/resources/prod_do...nts/doc6175.pdf

пункт 35.6.10 стр 527

 

Посмотрите как необходимо устанавливать/сбрасывать флаги регистра CSRx, скорее всего у Вас действительно старый код.

Возьмите свежую версию USB framework, родную от Atmel, и проблема должна исчезнуть

 

Удивительно какой же у вас опыт что встречали эту ошибку и нашли ее решение... Я то по наивности размышлял что в демо программе к программатору все верно... только сегодня заметил - что и демо программа то тоже не работает на этом компьютере....

 

перепробовал 3 различные версии lib_AT92SAM7S64.h... - все бестолку... один и тот же код в этом куске... а более новые frameworkи уже не содержат подобной библиотеки, там сделали CDCDriver.c, USBD_UDP.c, CDCLine.c и еще много чего... на это я наткнулся здесь - http://www.at91.com/forum/viewtopic.php/p,13767/#p13767

 

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

 

1)

допустим

     u_int cpsr_t = store_disable_irq();                    
    AT91C_BASE_UDP->UDP_CSR[endpoint] &= ~(flags);        
    while(AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags));    
    restore_irq(cpsr_t);

 

это ничто иное как

 

       volatile unsigned int cpsr_t = AT91C_BASE_UDP->UDP_CSR[endpoint]; 
        cpsr_t |= REG_NO_EFFECT_1_ALL; 
        cpsr_t &= ~(flags); 
        AT91C_BASE_UDP->UDP_CSR[endpoint] = cpsr_t; 
        while ( (AT91C_BASE_UDP->UDP_CSR[endpoint] & (flags)) == (flags));

?

 

поясните, пожалуйста, тогда как эти два макроса относятся к функциям в библиотеке __inline void AT91F_UDP_XXX, где XXX - EnableEp, DisableEp, EpStall, EpEndOfWr, EpClear, EpSet, EpStatus - это вроде полный перечень где вертится UDP_CSR... и каждый раз функция - всего одна строчка (команда) над UDP_CSR...

В конце концов мне то нужно изменить эти функции... а не два макроса, которых собстна и нет в исходном коде вообще... в общем я не понимаю, что с ними (макросами) потом-то делать...

еще более точно - достаточно ли не вводя макросы просто все эти функции где происходит ковыряние UDP_CSR, обернуть в то же?

 

))) когда дополнил вопрос - увидел что вы ответили то же самое ))) можно не отвечать на этот, я все понял!!!

 

 

2)

Кроме того, следует обрамить запретом прерываний связку "установка TXPKTRDY - сброс TXCOMP".

не встретил (

зато встретил частичный ответ на свой первый вопрос в коде USBD_UPD.c (из набора, который у меня не собирается):

// Send next packet
                if (BOARD_USB_ENDPOINTS_BANKS(bEndpoint) == 1) {

                    // No double buffering
                    UDP_WritePayload(bEndpoint);
                    SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY);
                    CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP);
                }
                else {
                    // Double buffering
                    SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY);
                    CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP);
                    UDP_WritePayload(bEndpoint);
                }

SET_CSR/CLEAR_CSR - это макросы удивительно сходные с тем что вы писали - UDP_CSR_CLR/SET... я бы сказал они же... но где здесь обрамление sti/cli ? (хотя я не знаю как это в AT91SAM7 выглядит...

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

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


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

1. См. выше.

2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно.

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


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

1. См. выше.

2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно.

тогда по поводу п.1....

там стоит disable_interrupt() у вас во всех функциях, enable - нет... так должно быть?

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


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

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

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

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

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

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

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

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

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

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