Здравствуйте. Вот возникла проблема с модулем 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); //потушить
}
}
}
Сообщение отредактировал IgorKossak - Dec 10 2010, 19:31
Причина редактирования: Для длинного кода пользуйтесь тэгом codebox