abit 0 16 сентября, 2011 Опубликовано 16 сентября, 2011 (изменено) · Жалоба Здравствуйте... Существует следующая проблема - сделал устройство на основе отладочного 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 - все работает... атлонов у нас вообще нет((( но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет... Что это может быть? Может кто-нибудь сталкивался с подобным? Огромное спасибо за ответ, ибо мне на душе тоскливо... я попытался уже из под линукса даже на их компьютере это запускать... Изменено 16 сентября, 2011 пользователем abit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 17 сентября, 2011 Опубликовано 17 сентября, 2011 · Жалоба Покажите дескриптор устройства Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 17 сентября, 2011 Опубликовано 17 сентября, 2011 · Жалоба Огромное спасибо за ответ, ибо мне на душе тоскливо... я попытался уже из под линукса даже на их компьютере это запускать... Очень трудно что-то советовать. Какой у вас макс. размер пакета для данной конечной точки ? И сколько байтов вы пытаетесь отправить в машину за один раз ? Как вариант - взять пример CDC от того же Keil, откомпилировать и посмотреть, что будет. Еще вариант - с помощью Bushound или аппаратного USB-сниффера (конечно, аппаратный сниффер гораздо лучше) посмотреть, как именно сбивается обмен ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 17 сентября, 2011 Опубликовано 17 сентября, 2011 · Жалоба Было такое, решилось. Посмотрите как в вашем проекте идет обращение к регистрам UDP->CSR и как рекомендует документация (там есть примеры макросов). В старых версиях Атмеловского фреймвока эти самые макросы не использовались, это и приводило к такому глюку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vap 0 17 сентября, 2011 Опубликовано 17 сентября, 2011 · Жалоба но они мне принесли этот комп - реально не пашет... и как бы юридически получается что работу я не выполнил - хотя на всех компьютерах у нас это работает (включая мой домашний), на том что они принесли - нет... Может быть, у них действительно глючный компьютер? Если работает на всех остальных, и они не могут найти еще один компьютер, на котором тоже не работает, то я бы настаивал на том, что работа все-таки выполнена. Заодно бредовая мысль для проверки: не просматривается ли закономерность: на компьютерах с контроллером UHCI все работает, а с OHCI - не работает, или наоборот? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
abit 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 (изменено) · Жалоба 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 Изменено 19 сентября, 2011 пользователем abit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rlab 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 (изменено) · Жалоба http://www.atmel.com/dyn/resources/prod_do...nts/doc6175.pdf пункт 35.6.10 стр 527 Посмотрите как необходимо устанавливать/сбрасывать флаги регистра CSRx, скорее всего у Вас действительно старый код. Возьмите свежую версию USB framework, родную от Atmel, и проблема должна исчезнуть Изменено 19 сентября, 2011 пользователем Sergey Reva Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба Речь идет об обращениях в 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 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба prottoss взят из старого проекта Usart-USB 1.0/BasicUSB1.1, файл cdc_enumerate.c там дескриптор длиный, поэтому прикладываю оригинальный весь проект с диска из папочки Демо-программ... см путь... AT91SAM7S-BasicUSB/src/cdc_enumerate.c Я вот почему спросил про дескриптор. Аналогичная проблема возникает при работе с штатным загрузчиком ВСЕХ МК серии AT91 через SAM-BA. На INTEL-чипсетах работает, на других НЕТ. Так что все что Вам тут выше наговорили, конечно, верно, но непосредственно к проблеме не относится. Проблема возникает как раз если работать с загрузчиком через драйвер usbser.sys. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
abit 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба 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)); \ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба Замените пока работу с флагами на корректный вариант: __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 не забудьте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
abit 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 (изменено) · Жалоба 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 выглядит... Изменено 19 сентября, 2011 пользователем abit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба 1. См. выше. 2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба ОК. Подождем, когда код заточится, но на AMD работать не будет :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
abit 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба 1. См. выше. 2. В примере профукано. Запрещение/разрешение прерываний в IAR - __disable_interrupt()/__enable_interrupt() соответственно. тогда по поводу п.1.... там стоит disable_interrupt() у вас во всех функциях, enable - нет... так должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться