Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sam7 и UDP проблема
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
3TTT3TTT
Здравствуйте. Вот возникла проблема с модулем USB, вроде и частоты те, и USB разрешен, но кроме 4-х ENDBUSRES ни чего не поймал.
Пробовал разные варианты решений которые советовали в аналогичных темах, но наверное что-то упустил, кому не трудно взгляните код, на наличие подозрительных мест.
Плата от OLIMEX, проц sam7s256, отладчик ARM-USB-TYNY, среда IAR 5.42.

CODE
#include "ioat91sam7x256.h"
//--определение прерываний
#pragma vector=0x18
__irq void IRQ_Handler(void)
{
void (*VF)();
unsigned int vector;
vector=AT91C_BASE_AIC->AIC_IVR;
VF = (void(*)())vector;
(*VF)();
}



unsigned int kd[20],kp[20],i,res,p,k[20],c;

void false_irq (void)
{
AT91C_BASE_AIC->AIC_EOICR=0;

}

void usb_irq(void) //обработчик usb прерываний
{
unsigned int status;
status = AT91C_BASE_UDP->UDP_ISR;
// status &= AT91C_BASE_UDP->UDP_IMR;
kd[i]= AT91C_BASE_UDP->UDP_IMR;
AT91C_BASE_UDP->UDP_IER = 0xFFFF;
kp[i]=status;

if (status & AT91C_UDP_ENDBUSRES)
{
AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
// reset all endpoints
AT91C_BASE_UDP->UDP_RSTEP = (unsigned int)-1;
AT91C_BASE_UDP->UDP_RSTEP = 0;
// Enable the function
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
// Configure endpoint 0
AT91C_BASE_UDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
res++;
}

else if (status & AT91C_UDP_EPINT0)
{
AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_EPINT0;
p++;
}


k[i]= AT91C_BASE_UDP -> UDP_IMR;
i++;
c++;
AT91C_BASE_AIC->AIC_IECR=(1<<11);
AT91C_BASE_AIC->AIC_EOICR=0;

}



void main(void)
{


AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;//отключение сторожа

//--настройка частот

AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT&(0x40 <<8)|AT91C_CKGR_MOSCEN ));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 | (16 << 8) | (AT91C_CKGR_MUL & (124 << 16)) | (AT91C_CKGR_DIV & 24);
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) );
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

//--разрешение тактирования
AT91C_BASE_PMC->PMC_SCER=0x781;



AT91C_BASE_PMC->PMC_PCER |=(1 <<AT91C_ID_UDP);
AT91C_BASE_PMC->PMC_PCER |=(1 << AT91C_ID_PIOA);

//--вывод управления подтягивающим резистором


AT91C_BASE_PIOA->PIO_PER|=(1<<8);//разрешение вывода
AT91C_BASE_PIOA->PIO_OER|=(1<<8);//назначение на выход

AT91C_BASE_PIOA->PIO_SODR|=(1<<8); //отключить


//--выводы с подкл. светодиодами

AT91C_BASE_PIOA->PIO_PER|=(1<<18);
AT91C_BASE_PIOA->PIO_OER|=(1<<18);
AT91C_BASE_PIOA->PIO_PER|=(1<<17);
AT91C_BASE_PIOA->PIO_OER|=(1<<17);



//--настройка AIC

AT91C_BASE_AIC->AIC_IDCR=(1<<11);

AT91C_BASE_AIC->AIC_SPU=(unsigned int) *false_irq;

AT91C_BASE_AIC->AIC_SVR[11] = (unsigned int) *usb_irq;
AT91C_BASE_AIC->AIC_SMR[11] = ((1<<6) | 7) ;

AT91C_BASE_AIC->AIC_ICCR =(1<< 11);
AT91C_BASE_AIC->AIC_IECR=(1<<11);

AT91C_BASE_AIC->AIC_EOICR=AT91C_BASE_AIC->AIC_IVR;





unsigned int flag;
flag=0;


for(;;)

{

if ((!(AT91C_BASE_PIOA->PIO_PDSR & (1<<19)))&(flag)) //если нажата кнопка 1
{
flag=!flag;
AT91C_BASE_PIOA->PIO_CODR|=(1<<8); //подключить резистор
AT91C_BASE_PIOA->PIO_CODR|=(1<<17); //зажечь
AT91C_BASE_PIOA->PIO_SODR|=(1<<18); //потушить

}
if ((!(AT91C_BASE_PIOA->PIO_PDSR & (1<<20)))&(!flag)) //если нажата кнопка 2
{
flag=!flag;
AT91C_BASE_PIOA->PIO_SODR|=(1<<8); //отлючить резистор
AT91C_BASE_PIOA->PIO_CODR|=(1<<18); //зажечь
AT91C_BASE_PIOA->PIO_SODR|=(1<<17); //потушить
}

}

}
Danis
Цитата(3TTT3TTT @ Dec 10 2010, 20:04) *
Здравствуйте. Вот возникла проблема с модулем USB.....



Че то я не понял, а тема была такая: sam7 и UDP проблема.
3TTT3TTT
Было похожее, там проблема решилась, то-ли не те частоты были, или тактирование не вкл. было, что там советовали вроде как пробовал и проверял, пока не пробовал запустить код из флеша.

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

В прерывании надо проверять все возможные источники. Т.е. закоментированное маскирование все же должно быть. Плюс перед вторым условием else не надо, ибо могут возникнуть несколько событий. Ну и возможен не только ресет и событие по первой точке.
3TTT3TTT
То что окна с регистрами алиять могут я в курсе, и стараюсь их не выводить.
Для проверки других возможных источников, вызвавших прерывание, используется переменная kp.
kichnamid
даже если не открывать окна у меня при дебаге сетап запросы не обрабатывались. это на jtag, может на айсе по-другому.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.