Миландр

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

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




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 2018-окт-12 11:37 
Не в сети

Зарегистрирован: 2016-янв-29 17:53
Сообщения: 55
Не могу понять в чем проблема с Arinc. МК: 1986ВЕ1Т 1616. Прерывания по ARINC429R_FLAG_DR срабатывает, но не читается. В режиме дебаг стоит брекпойнт на строчке while() внутри ARINC429R_IRQHandler(). В нем вижу что поле DATA_R приняло сообщение правильно. Вот только не читается. В чем может быть дело?
Открыть код
Код:
#include "MDR1986VE1T.h"                // Device header
#include "MDR32F9Qx_config.h"           // Keil::Device:Startup
#include "MDR32F9Qx_arinc429r.h"        // Keil::Drivers:ARINC429R
#include "MDR32F9Qx_arinc429t.h"        // Keil::Drivers:ARINC429T
#include "MDR32F9Qx_port.h"             // Keil::Drivers:PORT
#include "MDR32F9Qx_rst_clk.h"          // Keil::Drivers:RST_CLK

uint32_t msg1 = 0, msg2 = 0;

void PortsConfig(void) {       // настройки портов
  PORT_InitTypeDef PORT_InitStructure;
  RST_CLK_PCLKcmd(
                  RST_CLK_PCLK_PORTB    |     // PORTB
                  RST_CLK_PCLK_PORTD, ENABLE);
  PORT_StructInit(&PORT_InitStructure);
  PORT_Init(MDR_PORTB, &PORT_InitStructure);
  PORT_Init(MDR_PORTD, &PORT_InitStructure);
 
  // PORTB
  // ARINC429R
  PORT_InitStructure.PORT_Pin      = (PORT_Pin_0  |           // IN1+
                                    PORT_Pin_1    |           // IN1-
                                    PORT_Pin_2    |           // IN2+
                                    PORT_Pin_3);              // IN2-
  PORT_InitStructure.PORT_FUNC    = PORT_FUNC_ALTER;
  PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
  PORT_InitStructure.PORT_SPEED = PORT_SPEED_MAXFAST;
  PORT_InitStructure.PORT_PD = PORT_PD_DRIVER;
  PORT_Init(MDR_PORTB, &PORT_InitStructure);
 
  // PORTD
  PORT_InitStructure.PORT_Pin      = (
                                    PORT_Pin_0    |           // TA
                                    PORT_Pin_1                // TB
                                    );
                                   
  PORT_InitStructure.PORT_MODE    = PORT_MODE_DIGITAL;
  PORT_InitStructure.PORT_SPEED   = PORT_SPEED_MAXFAST;
  PORT_InitStructure.PORT_OE      = PORT_OE_OUT;
  PORT_InitStructure.PORT_FUNC    = PORT_FUNC_PORT;
  PORT_Init(MDR_PORTD, &PORT_InitStructure);
 
  PORT_ResetBits(MDR_PORTD, PORT_Pin_0);
  PORT_ResetBits(MDR_PORTD, PORT_Pin_1);
}

void ArincSpeed(uint8_t speed) { // 0bit - OUT1, 1bit - OUT2, 2bit - IN1, 3bit - IN2
  ARINC429R_InitChannelTypeDef ARINC429R_InitChannelStruct = {0};
  RST_CLK_PCLKcmd(RST_CLK_PCLK_ARINC429R, ENABLE);

 
/* НАСТРОЙКА ВХОДНЫХ КАНАЛОВ */
  ARINC429R_DeInit();
  ARINC429R_BRG_Init(8);
 
  if ((speed >> 2) & 1) {
    ARINC429R_InitChannelStruct.ARINC429R_CLK = ARINC429R_CLK_12_5_KHz;
  } else {
    ARINC429R_InitChannelStruct.ARINC429R_CLK = ARINC429R_CLK_100_KHz;
  }
  ARINC429R_ChannelInit(ARINC429R_CHANNEL1, &ARINC429R_InitChannelStruct);  //Config for Arinc_R_1
//  if ((speed >> 3) & 1) { // IN2
//    ARINC429R_InitChannelStruct.ARINC429R_CLK = ARINC429R_CLK_100_KHz;
//  } else {
//    ARINC429R_InitChannelStruct.ARINC429R_CLK = ARINC429R_CLK_12_5_KHz;
//  }
//  ARINC429R_ChannelInit(ARINC429R_CHANNEL2, &ARINC429R_InitChannelStruct);  //Config for Arinc_R_2

  ARINC429R_ChannelCmd(ARINC429R_CHANNEL1, ENABLE);
//  ARINC429R_ChannelCmd(ARINC429R_CHANNEL2, ENABLE);



//  ARINC429R_ITMaskConfig(ARINC429R_CHANNEL1, ARINC429R_ITMask_DR, ENABLE);  // разрешение прерывания
//  ARINC429R_ITMaskConfig(ARINC429R_CHANNEL2, ARINC429R_ITMask_DR, ENABLE);  // разрешение прерывания
 
  ARINC429R_ITConfig(ARINC429R_IT_INT_DR, ENABLE);  // разрешено прерывание для непустого FIFO
  NVIC_EnableIRQ(ARINC429R_IRQn);
}


void ARINC429R_IRQHandler(void) {
  // первый канал
//   volatile uint32_t msg1, msg2;
  ARINC429R_SetChannel(ARINC429R_CHANNEL1);
  while (ARINC429R_GetFlagStatus(ARINC429R_CHANNEL1, ARINC429R_FLAG_DR) == SET)
  {
    msg1 = ARINC429R_ReceiveData();
  }
//  // второй канал
//  ARINC429R_SetChannel(ARINC429R_CHANNEL2);
//  while (ARINC429R_GetFlagStatus(ARINC429R_CHANNEL2, ARINC429R_FLAG_DR) == SET) {
//    msg2 = ARINC429R_ReceiveData();
//  }
}

int main() {
    PortsConfig();
    ArincSpeed(0);
    while(1) {
      msg2 += msg1;
    }
}
Закрыть

И что бы 2 раза не вставать: в другом проекте не могу настроить индивидуальные прерывания. Код идентичен этому, только строчка:
ARINC429R_ITConfig(ARINC429R_IT_INT_DR, ENABLE); // закомменчена
ARINC429R_ITMaskConfig(ARINC429R_CHANNEL1, ARINC429R_ITMask_DR, ENABLE); // раскомменчены
ARINC429R_ITMaskConfig(ARINC429R_CHANNEL2, ARINC429R_ITMask_DR, ENABLE); // раскомменчены


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

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


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

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


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

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