Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-окт-17 09:00

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Проблема с ARINC
СообщениеДобавлено: 2016-дек-01 13:32 
Не в сети

Зарегистрирован: 2016-ноя-19 17:59
Сообщения: 3
Имеется тестовый набор:
1) LDM-HELPER-K1986BE1QI-FULL
2) LDM-HELPER-SI-FULL
3) LDM-HELPER-MB501-FULL

Использую библиотеку emdr1986x-std-per-lib из git и компилятор arm-none-eabi-gcc.

Возникла проблема с ARINC, а именно обработчик прерываний вызывается с ошибкой, даже если вообще ничего не подключено к плате. Вначале пытался реализовать loopback и использованием провода, но в итоге код сократил до минимума: просто приём.
Запускаю с отладчиком, ставлю breakpoint на ARINC429R_IRQHandler. Значение err_status = 1;

В чём может быть проблема? Что я делаю не так?

Полный код:
Код:
#include <MDR1986VE1T.h>

#define RST_CLK MDR_RST_CLK
#define PORTB MDR_PORTB
#define PORTD MDR_PORTD
#define ARINC429T MDR_ARINC429T
#define ARINC429R MDR_ARINC429R
#define EEPROM MDR_EEPROM
#define BKP MDR_BKP

#define PLL_MULL 5
#define DIV_ARINC   ((PLL_MULL+1)*8)

static void ClkConfig(void)
{
    uint32_t temp;
    /* BKP Clock enable */
    MDR_RST_CLK->PER_CLOCK |= (1 << 27);
    temp = MDR_BKP->REG_0E;
    temp &= 0xFFFFFFC0;
    /* SelectRI = 0x7, LOW = 0x7; (for core frequency more then 80 MHz); */
    MDR_BKP->REG_0E = temp | (7 << 3) | 7;
    /* HSE - On; Oscillator mode */
    MDR_RST_CLK->HS_CONTROL = 0x00000005;
    /* Wait until HSE not ready */
    while ((MDR_RST_CLK->CLOCK_STATUS & 0x0C) != 0x0C);
    /* CPU_C1 = 16MHz */
    MDR_RST_CLK->CPU_CLOCK = 0x00000002;
    /* CPU PLL On, PLL_MULL=2 */
    MDR_RST_CLK->PLL_CONTROL = (1 << 2) | (PLL_MULL << 8);
    while ((MDR_RST_CLK->CLOCK_STATUS & 0x02) != 0x02);
    /* EEPROM_CTRL Clock enable */
    MDR_RST_CLK->PER_CLOCK |= 0x08;
    MDR_EEPROM->CMD = 4<<3;
    /* EEPROM_CTRL Clock disable */
    MDR_RST_CLK->PER_CLOCK &= ~0x08;
    /* CPU Clock = (5+1)*16MHz = 96 */
    MDR_RST_CLK->CPU_CLOCK = 0x00000106;

    /* PORTB */
    MDR_RST_CLK->PER_CLOCK|=(1<<22);
    /* ARINC429R */
    MDR_RST_CLK->PER_CLOCK|=(1<<26);
}


void PortConfig()
{
    PORTB->FUNC=0x0000000A; //PB0-PB1=INT1+-
    PORTB->ANALOG=0xFFFF;
    PORTB->PWR=0xFFFFFFFF;
}

void Arinc429RxConfig(void)//Rx in
{
    /* DIV_ARINC = (5+1) * 8 = 110000b, so 4 low bits = 0000 */
    ARINC429R->CONTROL1=(0<<28)/*|(1<<14)*/|1;// chan1
    ARINC429R->CONTROL2=0;
    ARINC429R->CONTROL3=(1<<28)|(1<<29);// interrupts on read and err
    ARINC429R->CONTROL4=0x00000060; // 96/96 = 1 for chan 1
    ARINC429R->CONTROL5=0;

    ARINC429R->INTMASK=0xFFFFFFFF;
}


volatile uint32_t err_status = 0;
volatile uint32_t fifo_status = 0;

void ARINC429R_IRQHandler()
{
    err_status = (ARINC429R->STATUS1>>14)&0xF;
    fifo_status = ARINC429R->STATUS1&0xF;

    if (err_status == 1)
    {
        /* Reset channel */
        ARINC429R->CONTROL1&=~(0x01);
        ARINC429R->CONTROL1|=0x01;
    }
}
int main()
{
    ClkConfig();
    PortConfig();
    Arinc429RxConfig();

    NVIC_EnableIRQ(ARINC429R_IRQn);

    while(1)
    {
       
    }
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB