Программа всё время заходит в обработчик прерывания. Ощущение, что надо где-то сбросить флаг прерывания, но я не понимаю где...
Вот код обработчика прерывания и инициализации (VisualDP ++ 4.5):
Код
EX_INTERRUPT_HANDLER(SPORT1_RX_HANDLER)
{
*pDMA5_IRQ_STATUS = 1; // write one to clear
//вроде как строчка выше должна сбросить флаг прерывания...
while(SPORT1_STAT & RXNE)
{
u16 adc_data = *pSPORT1_RX;
//пишу данные куда надо
}
ssync();
}
void init_AD7265()
{
//инициализирую ноги для выбора канала АЦП и т.д.
*pSPORT1_RCR1 = RCKFE | LRFS | RFSR | IRFS | IRCLK;
*pSPORT1_RCR2 = RXSE | 15;
*pSPORT1_RCLKDIV = 59;
*pSPORT1_RFSDIV = 24;
ssync();
*pSPORT1_RCR1 |= RSPEN;
ssync();
}
void init_interrupts()
{
*pSIC_IAR0 = 0x0FFFFFFF; //SPORT1 RX IRQ 0=IVG7
*pSIC_IAR1 = 0xFFFFFFFF;
*pSIC_IAR2 = 0xFFFFFFFF;
*pSIC_IAR3 = 0xFFFFFFFF;
/* Register Interrupt Handlers and Enable Core Interrupts */
register_handler(ik_ivg7, SPORT1_RX_HANDLER);
/* Enable SIC Level Interrupts */
*pSIC_IMASK = IRQ_DMA5; //DMA5 - SPORT1_RX
}
{
*pDMA5_IRQ_STATUS = 1; // write one to clear
//вроде как строчка выше должна сбросить флаг прерывания...
while(SPORT1_STAT & RXNE)
{
u16 adc_data = *pSPORT1_RX;
//пишу данные куда надо
}
ssync();
}
void init_AD7265()
{
//инициализирую ноги для выбора канала АЦП и т.д.
*pSPORT1_RCR1 = RCKFE | LRFS | RFSR | IRFS | IRCLK;
*pSPORT1_RCR2 = RXSE | 15;
*pSPORT1_RCLKDIV = 59;
*pSPORT1_RFSDIV = 24;
ssync();
*pSPORT1_RCR1 |= RSPEN;
ssync();
}
void init_interrupts()
{
*pSIC_IAR0 = 0x0FFFFFFF; //SPORT1 RX IRQ 0=IVG7
*pSIC_IAR1 = 0xFFFFFFFF;
*pSIC_IAR2 = 0xFFFFFFFF;
*pSIC_IAR3 = 0xFFFFFFFF;
/* Register Interrupt Handlers and Enable Core Interrupts */
register_handler(ik_ivg7, SPORT1_RX_HANDLER);
/* Enable SIC Level Interrupts */
*pSIC_IMASK = IRQ_DMA5; //DMA5 - SPORT1_RX
}