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