|
USB CDC (AT91SAM7S64) не работает |
|
|
|
Sep 16 2011, 19:36
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 17 2011, 14:46
|
Участник

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

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

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

|
Цитата(abit @ Sep 16 2011, 23:36)  но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет... Может быть, у них действительно глючный компьютер? Если работает на всех остальных, и они не могут найти еще один компьютер, на котором тоже не работает, то я бы настаивал на том, что работа все-таки выполнена. Заодно бредовая мысль для проверки: не просматривается ли закономерность: на компьютерах с контроллером UHCI все работает, а с OHCI - не работает, или наоборот?
|
|
|
|
|
Sep 19 2011, 10:01
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 19 2011, 13:51
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 19 2011, 14:11
|
Гуру
     
Группа: Свой
Сообщений: 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".
|
|
|
|
|
Sep 19 2011, 16:20
|
Участник

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

|
Sergey Reva, aaarrrСпасибо за некоторые пояснения... кажется я начинаю понимать!!! Но чем дальше, тем труднее понимание  Цитата(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)); \
|
|
|
|
|
Sep 19 2011, 16:34
|
Гуру
     
Группа: Свой
Сообщений: 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 не забудьте.
|
|
|
|
|
Sep 19 2011, 16:41
|
Участник

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

|
Sergey Reva, aaarrrСпасибо за некоторые пояснения... кажется я начинаю понимать!!! Но чем дальше, тем труднее понимание  Цитата(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
|
|
|
|
|
Sep 19 2011, 16:57
|
Участник

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

|
Цитата(aaarrr @ Sep 19 2011, 20:47)  1. См. выше. 2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно. тогда по поводу п.1.... там стоит disable_interrupt() у вас во всех функциях, enable - нет... так должно быть?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|