Перейти к содержанию
    

BF537 - немогу заставить работать прерывание от SPORT1

Пытаюсь считать данные с AD7265, который подсоединён к SPORT1 BF537.

Программа всё время заходит в обработчик прерывания. Ощущение, что надо где-то сбросить флаг прерывания, но я не понимаю где...

Вот код обработчика прерывания и инициализации (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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё ещё более странно, программа не заходит внутрь while'а в обработчике прерывания (в while(SPORT1_STAT & RXNE)), т.е. как будто источник прерывания другой и соответстенно сбрасываю не тот флаг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 *pSIC_IAR0 = 0x0FFFFFFF; //SPORT1 RX IRQ 0=IVG7    
*pSIC_IAR1 = 0xFFFFFFFF;    
*pSIC_IAR2 = 0xFFFFFFFF;    
*pSIC_IAR3 = 0xFFFFFFFF;

Вы уверены что поставили ноль куда надо, не знаю точно как в 537 но у 533 этот ноль соответствует прерыванию RTC. Думаю регистры этих процессоров одинаковые. Значения этих регистров никогда не менял всегда оставлял по-умолчанию. Тем более вы не меняете приоритет, а оставляетет его как он был. Вы хотите работать с DMA? Если да то не вижу настройку DMA. И тут опять возможно расхождения с 533 но DMA5 соответствует SPI а не SPORT.

Вот это

while(SPORT1_STAT & RXNE)    
{        
   u16 adc_data = *pSPORT1_RX;       
   //пишу данные куда надо    
}

надо заменить на

while(!(*pSPORT1_STAT & RXNE));
    tmp = *pSPORT1_RX16;

 

Что у вас *pSPORT1_RX это указатель на short или int? Судя по всему у вас 16 разрядные слова, по-этому это должен быть указатель на short. Для 533 он определен как *pSPORT1_RX16. Чтение этого регистра уже сбрасывает флаг прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ.

0 стоит там где надо.

А вот ошибка оказалось совершенно дурацкой.

надо не

while(SPORT1_STAT & RXNE)

а

while(*pSPORT1_STAT & RXNE)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...