Проблема такая , нужно отсылать\принимать данные по SSC через определенный интервал, для осчета интервалов использую интервальный таймер, инициализация следующая: для SSC -
void SSC_Init (void) {
AT91PS_SSC pSSC = AT91C_BASE_SSC;
//* Configure PIO controllers to periph mode AT91F_SSC_CfgPIO ();
// Enable the clock AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_SSC);
// SSC Configure AT91F_SSC_Configure(pSSC, MCK,SSC_BaudRate,SSC_clock_rx,SSC_mode_rx,SSC_clock_tx,SSC_mode_tx);
// Enable SSC
AT91F_SSC_EnableIt (pSSC,AT91C_SSC_RXRDY|AT91C_SSC_ENDTX); //Set Usart IRQ Handler AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SSC,AT91C_AIC_PRIOR_HIGHEST, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSC_IRQ_Handler); //Interrupt Sources //pSSC->SSC_PTCR = (AT91C_SSC_RXEN|AT91C_SSC_TXEN); AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SSC); //pSSC->SSC_CR =AT91C_SSC_TXDIS; }
для PIT-
void InitSysTimer(void) { AT91PS_PITC pPITC = AT91C_BASE_PITC; unsigned int mask;
AT91F_PITC_CfgPMC (); AT91F_PITInit (pPITC,2000,MCK/16); AT91C_BASE_AIC->AIC_EOICR = 0x0; AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, //base adr AT91C_ID_SYS, //int number AT91C_AIC_PRIOR_HIGHEST, //priority AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, //int source type ih_fromPIT //handler ); AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_SYS); AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS); AT91F_PITEnableInt (pPITC); mask = AT91F_PITGetPIVR (pPITC); mask=mask;
}
по отдельности прерывания обрабатываются нормально, вместе либо от одного либо от другого смотря что первым настраивается.
Кучу времени уже убил, не могу разобраться. Помогите плззз.
Да забыл использую AT91SAM7S64 компилятор IAR
|