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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> USB CDC (AT91SAM7S64) не работает
abit
сообщение Sep 16 2011, 19:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426



Здравствуйте...
Существует следующая проблема - сделал устройство на основе отладочного 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 - Sep 16 2011, 19:44
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 17 2011, 04:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Покажите дескриптор устройства


--------------------
Go to the top of the page
 
+Quote Post
kovigor
сообщение Sep 17 2011, 10:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(abit @ Sep 16 2011, 22:36) *
Огромное спасибо за ответ, ибо мне на душе тоскливо... я попытался уже из под линукса даже на их компьютере это запускать...


Очень трудно что-то советовать. Какой у вас макс. размер пакета для данной конечной точки ? И сколько байтов вы пытаетесь отправить в машину за один раз ?
Как вариант - взять пример CDC от того же Keil, откомпилировать и посмотреть, что будет. Еще вариант - с помощью Bushound или аппаратного USB-сниффера (конечно, аппаратный сниффер гораздо лучше) посмотреть, как именно сбивается обмен ...
Go to the top of the page
 
+Quote Post
Sergey Reva
сообщение Sep 17 2011, 14:46
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 22-04-07
Из: Poltava/Kharkov
Пользователь №: 27 243



Было такое, решилось. Посмотрите как в вашем проекте идет обращение к регистрам UDP->CSR и как рекомендует документация (там есть примеры макросов). В старых версиях Атмеловского фреймвока эти самые макросы не использовались, это и приводило к такому глюку.
Go to the top of the page
 
+Quote Post
Andrey Vasilyev
сообщение Sep 17 2011, 14:48
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-12-08
Из: Санкт-Петербург
Пользователь №: 42 220



Цитата(abit @ Sep 16 2011, 23:36) *
но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет...

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

Заодно бредовая мысль для проверки: не просматривается ли закономерность: на компьютерах с контроллером UHCI все работает, а с OHCI - не работает, или наоборот?
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 19 2011, 10:01
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426



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) с официального диска не заработал на том компьютере, включая тот, что я выкладываю... на наших - все чудесно пашет...

Сообщение отредактировал abit - Sep 19 2011, 12:22
Прикрепленные файлы
Прикрепленный файл  AT91SAM7S64_BasicUSB_IAR4_11A_1_1.zip ( 475.17 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
Sergey Reva
сообщение Sep 19 2011, 13:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 22-04-07
Из: Poltava/Kharkov
Пользователь №: 27 243



http://www.atmel.com/dyn/resources/prod_do...nts/doc6175.pdf
пункт 35.6.10 стр 527

Посмотрите как необходимо устанавливать/сбрасывать флаги регистра CSRx, скорее всего у Вас действительно старый код.
Возьмите свежую версию USB framework, родную от Atmel, и проблема должна исчезнуть

Сообщение отредактировал Sergey Reva - Sep 19 2011, 13:52
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 19 2011, 14:11
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(abit @ Sep 19 2011, 14:01) *
Речь идет об обращениях в 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".
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 19 2011, 15:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(abit @ Sep 19 2011, 16:01) *
prottoss
взят из старого проекта Usart-USB 1.0/BasicUSB1.1, файл cdc_enumerate.c
там дескриптор длиный, поэтому прикладываю оригинальный весь проект с диска из папочки Демо-программ...
см путь... AT91SAM7S-BasicUSB/src/cdc_enumerate.c
Я вот почему спросил про дескриптор. Аналогичная проблема возникает при работе с штатным загрузчиком ВСЕХ МК серии AT91 через SAM-BA. На INTEL-чипсетах работает, на других НЕТ. Так что все что Вам тут выше наговорили, конечно, верно, но непосредственно к проблеме не относится. Проблема возникает как раз если работать с загрузчиком через драйвер usbser.sys.


--------------------
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 19 2011, 16:20
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426



Sergey Reva, aaarrr
Спасибо за некоторые пояснения... кажется я начинаю понимать!!!
Но чем дальше, тем труднее понимание sm.gif

Цитата(Sergey Reva @ Sep 19 2011, 17:51) *
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)); \
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 19 2011, 16:34
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Замените пока работу с флагами на корректный вариант:
Код
__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 не забудьте.
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 19 2011, 16:41
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426



Sergey Reva, aaarrr
Спасибо за некоторые пояснения... кажется я начинаю понимать!!!
Но чем дальше, тем труднее понимание sm.gif

Цитата(Sergey Reva @ Sep 19 2011, 17:51) *
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 - Sep 19 2011, 16:51
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 19 2011, 16:47
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



1. См. выше.
2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 19 2011, 16:48
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



ОК. Подождем, когда код заточится, но на AMD работать не будет sad.gif


--------------------
Go to the top of the page
 
+Quote Post
abit
сообщение Sep 19 2011, 16:57
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 26-07-11
Пользователь №: 66 426



Цитата(aaarrr @ Sep 19 2011, 20:47) *
1. См. выше.
2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно.

тогда по поводу п.1....
там стоит disable_interrupt() у вас во всех функциях, enable - нет... так должно быть?
Go to the top of the page
 
+Quote Post

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

 


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


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