Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-03 08:42 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Помогите плиз в следующей проблеме:

по CAN получаю информацию (вижу содержимое в буфере),
но не хочет контроллер войти в обработку прерывания по CAN.
Это глюк, или я где-то не до конца сконфигурировал CAN?

Имеем следующие строки:

MDR_CAN1->BUF_CON[1] = 0x00000003; // Разрешение работы буфера 02 на прием
MDR_CAN1->INT_RX=2; // Флаг разрешения прерывания по приему (разрешено прерывание от 2-го буфера BUF[1])
MDR_CAN1->CONTROL = 0x1; // разрешение работы CAN
NVIC_EnableIRQ(CAN1_IRQn); // Разрешение прерывания по CAN1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-03 08:59 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1282
Откуда: АО "ПКК Миландр"
borisK писал(а):
Помогите плиз в следующей проблеме:

по CAN получаю информацию (вижу содержимое в буфере),
но не хочет контроллер войти в обработку прерывания по CAN.
Это глюк, или я где-то не до конца сконфигурировал CAN?

Имеем следующие строки:

MDR_CAN1->BUF_CON[1] = 0x00000003; // Разрешение работы буфера 02 на прием
MDR_CAN1->INT_RX=2; // Флаг разрешения прерывания по приему (разрешено прерывание от 2-го буфера BUF[1])


Добавить общее управление прерываниями
MDR_CAN1->INT_EN = 3; //


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-03 09:23 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
Прошу прощения, эта строка тоже имеется:

MDR_CAN1->INT_EN=3; // разрешить прерывания по приему


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-03 11:23 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1282
Откуда: АО "ПКК Миландр"
borisK писал(а):
Прошу прощения, эта строка тоже имеется:

MDR_CAN1->INT_EN=3; // разрешить прерывания по приему


Тогда весь код выкладывайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-03 12:35 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
config.c

/* CAN1 Init */
// Включаем тактирование CAN1
MDR_RST_CLK->CAN_CLOCK = 0x1000101; // CAN1, HCLK/2
MDR_CAN1->BITTMNG = 1 << 27 | (0x0 << 25) | ((0x5) << 22) | ((0x5) << 19) | ((0x2) << 16) | 0xB; // 250

MDR_CAN1->BUF_CON[0] = 0x00000000; // отключить буфер 01 (TX buffer)
MDR_CAN1->CAN_BUF[0].ID = 0x0;
MDR_CAN1->CAN_BUF[0].DLC = 0x0 ;
MDR_CAN1->CAN_BUF_FILTER[0].MASK = 0x00000000;
MDR_CAN1->CAN_BUF_FILTER[0].FILTER = 0x00000000;
MDR_CAN1->BUF_CON[0] = 0x00000001; // Разрешение работы буфера 01 на передачу

MDR_CAN1->BUF_CON[1] = 0x00000000; // отключить буфер 02 (RX buffer)
MDR_CAN1->CAN_BUF[1].ID = 0x00000000;
MDR_CAN1->CAN_BUF[1].DLC = 0x00000000;
MDR_CAN1->CAN_BUF_FILTER[1].MASK = 0x00000000;
MDR_CAN1->CAN_BUF_FILTER[1].FILTER = 0x00000000;

MDR_CAN1->BUF_CON[1] = 0x00000003; // Разрешение работы буфера 02 на прием

MDR_CAN1->INT_TX=0; // Флаг разрешения прерывания по передаче (запрещены прерывания)
MDR_CAN1->INT_RX=2; // Флаг разрешения прерывания по приему (разрешено прерывание от 2-го буфера BUF[1])
MDR_CAN1->INT_EN=3; // разрешить прерывания по приему
MDR_CAN1->CONTROL = 0x1; // разрешение работы CAN

Program:

void CAN1_IRQHandler(void)
{
dist_t = MDR_CAN1->CAN_BUF[1].DATAL;
MDR_CAN1->BUF_CON[1] = 0x00000000; // отключение буфера 02 (RX buffer)
NVIC_DisableIRQ(CAN1_IRQn); // Запрет прерывания по CAN1
MDR_CAN1->CONTROL = 0x0; // Запрет работы CAN1
}

void MeasureFunc(void)
{
dist_t = 0;
DataL = 0x77;
DataH = 0x00;

MDR_CAN1->CONTROL = 0x1; // Разрешение работы CAN1 в нормальном режиме
MDR_CAN1->CAN_BUF[0].DATAL = DataL; // загрузка слова (командного) в буфер 01 для отправки
MDR_CAN1->CAN_BUF[0].DATAH = DataH; // загрузка слова (командного) в буфер 01 для отправки
MDR_CAN1->BUF_CON[0] = 0x1 | (1<<5); // запрос на отправку из буфера 01

MDR_CAN1->BUF_CON[0] = 0x00000000; // отключение буфера 01 (TX buffer)
MDR_CAN1->BUF_CON[1] = 0x00000003; // Разрешение работы буфера 02 на прием
NVIC_EnableIRQ(CAN1_IRQn); // Разрешение прерывания по CAN1
SysTickDelay(8000); // задержка для измерения
NVIC_DisableIRQ(CAN1_IRQn); // Запрет прерывания по CAN1
}

Вот собственно и все...

При входе в программу MeasureFunc(void) из буфера 01 посылается число 0х77 и ожидается прерывание по входу в буфере 02.
Для отладки просто делал посылку по CAN (инициировал извне), при этом прерывание разрешал.
В обработчик прерывания в Keil-е не входит программа, хотя в буфере 02 наблюдаю полученное значение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-04 09:20 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-авг-07 09:58
Сообщения: 132
SysTick на какой интервал измерений настроен?
Попробуйте не выключать прерывания NVIC_DisableIRQ(CAN1_IRQn) по завершению функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-04 10:37 
Не в сети

Зарегистрирован: 2012-июн-13 14:13
Сообщения: 51
SysTick настроен на 2 сек где-то...
Убрал запреты прерывания
Вроде иногда посылка принимается корректно, но часто нет.
В итоге не могу совместить 2 устройства:
Одно на контроллере 1986ВЕ91Т (ведущее), второе на STM32F (ведомое)
Ведущее делает запрос к ведомому.
Тот в ответ передает число.
Так вот запрос проходит корректно (смотрю на шине осциллографом), а ответ иногда корректный (одна посылка), а иногда непрерывное повторение посылки...
Я так понимаю, что ведущий не подтвердил ведомому, что инфу получил, тот и шлет непрерывно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-апр-04 10:55 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1282
Откуда: АО "ПКК Миландр"
borisK писал(а):
SysTick настроен на 2 сек где-то...
Убрал запреты прерывания
Вроде иногда посылка принимается корректно, но часто нет.
В итоге не могу совместить 2 устройства:
Одно на контроллере 1986ВЕ91Т (ведущее), второе на STM32F (ведомое)
Ведущее делает запрос к ведомому.
Тот в ответ передает число.
Так вот запрос проходит корректно (смотрю на шине осциллографом), а ответ иногда корректный (одна посылка), а иногда непрерывное повторение посылки...
Я так понимаю, что ведущий не подтвердил ведомому, что инфу получил, тот и шлет непрерывно...


Согласовывайте устройства по скорости. Либо включите в контроллере CAN, что бы он свои пакеты сам подтверждал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-окт-08 09:11 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-окт-01 08:16
Сообщения: 7
Здравствуйте.
Помогите пожалуйста и мне разобраться с CAN1_IRQ:
1986ВЕ91Т 4-ревизии.

Не входит в обработчики, и зависает при разрешении прерываний:
NVIC_EnableIRQ(Timer2_IRQn);
NVIC_EnableIRQ(CAN1_IRQn);

Проект на IAR EWB 6.0 прилагаю. Суть в следующем: Настраиваю прерывание по таймеру 2 - каждую 1 сек - должен входить в обработчик и отправлять пакет по CAN1. Так же могу сам с компа через конвертер RS232-CAN передать пакет - процессор должен по приему войти в прерывание и отправить обратную посылку.

Пока разбирался: отключил прерывание по таймеру вообще. Запускаю - код выполняется. Отправляю пакет с ПК - приходит пакет на МК, виден в MDR_CAN1->RXDATAL , но в буфере его нет: MDR_CAN1->CAN_BUF[1].DATAL, хотя по идее это одно и то же (по документации на МК) - и после приема - видимо, пытаясь выйти в обработчик - МК вылетает в неведомые области памяти и виснет, точнее не виснет а выполняет что-то по адресам 0x6839xxxx и дальше. Я подумал - может я неправильно зашиваю программу? Может надо конкретно указать определенную область памяти куда шить? И в какую память шить? В комплекте есть FLASH MEMORY MODULE c 4-мя 1636РР1У микросхемами, но я его снял с платы. Или же нельзя использовать прерывания в режиме отладки? Может кто-нибудь помочь разобраться мне непутевому))


Вложения:
IRQ.rar [33.65 КБ]
Скачиваний: 173

_________________
Использую:
  • Отладочная плата 1986ВЕ91Т rev.4 (Миландр)
  • Конвертер RS232-CAN (Миландр)
  • Программатор Segger J-Link Ultra
  • IAR EWB 6.0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2014-окт-08 15:51 
Не в сети
Аватара пользователя

Зарегистрирован: 2014-окт-01 08:16
Сообщения: 7
Проблему разрешил: 1. скопировал таблицу векторов по адресу где она должна была и быть по идее...0x08000000. Ну и по мелочам косяки поправил. Вот проект для IAR6.0 кому нужно.


Вложения:
IRQ.rar [33.34 КБ]
Скачиваний: 217

_________________
Использую:
  • Отладочная плата 1986ВЕ91Т rev.4 (Миландр)
  • Конвертер RS232-CAN (Миландр)
  • Программатор Segger J-Link Ultra
  • IAR EWB 6.0
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2015-ноя-26 00:13 
Не в сети

Зарегистрирован: 2014-сен-17 13:33
Сообщения: 1
hendehoh писал(а):
Проблему разрешил: 1. скопировал таблицу векторов по адресу где она должна была и быть по идее...0x08000000. Ну и по мелочам косяки поправил. Вот проект для IAR6.0 кому нужно.


Вы прямо помогли мне, долго не мог понять что же с прерываниями не так. Спасибо!)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2018-апр-25 12:36 
Не в сети

Зарегистрирован: 2018-мар-01 11:21
Сообщения: 14
Здравствуйте! Не могу разобраться с работой подпрограммы прерывания CAN1_IRQHandler, может кто посмотрит программку. Вроде, разрешения прерывания по приему включил, отправка осуществляется корректно, приемник распознает пакеты, но подпрограмма прерывания не отрабатывает. По таймингам понял что в нее даже не входит.
Код:
__IO uint32_t rx_buf = 0;
__IO uint32_t tx_buf = 1;
static UART_InitTypeDef UART_InitStructure;
static PORT_InitTypeDef PortInit;
void Can_Init(void){
  MDR_RST_CLK->PER_CLOCK |= (1UL << 21); //Тактирование порта A

  MDR_PORTA->FUNC   |= ((2 << 6*2) | (2 << 7*2)); //режим работы порта
  MDR_PORTA->ANALOG |= ((1 << 6  ) | (1 << 7  )); //цифровой
  MDR_PORTA->PD    &=~ ((1 << 6  ) | (1 << 7  )); //управляемый драйвер
  MDR_PORTA->PWR    |= ((3 << 6*2) | (3 << 7*2)); //максимально быcтрый

  MDR_RST_CLK->PER_CLOCK |= (1UL << 0); //тактирование CAN1
  MDR_RST_CLK->CAN_CLOCK = (0 /*предделитель CAN1*/
  |(0 << 8) /*предделитель CAN2*/
  |(1 << 24)/*вкл. CAN1*/
  |(0 << 25));/*вкл. CAN2*/
  MDR_CAN1->BITTMNG =(50|(1 << 16)|(6 << 19)|(5 << 22)|(3 << 25)|(0 << 27));//10Кбит/с
//  MDR_CAN1->BITTMNG = (5|(1 << 16)|(4 << 19)|(4 << 22)|(3 << 25)|(0 << 27));

  MDR_CAN1->CONTROL = ((1 << 0)|(1 << 3)|(1 << 4));
  /* Enable CAN1 interrupt */
  NVIC_EnableIRQ(CAN1_IRQn);
  /* Enable CAN1 GLB_INT and RX_INT interrupts */
  CAN_ITConfig( MDR_CAN1, CAN_IT_GLBINTEN | CAN_IT_RXINTEN, ENABLE);
  /* Enable CAN1 interrupt from receive buffer */
  CAN_RxITConfig( MDR_CAN1 ,(1<<rx_buf), ENABLE);
 
  /* receive buffer enable */
  CAN_Receive(MDR_CAN1, rx_buf, DISABLE);
}
void CPU_init (void){
  MDR_RST_CLK->HS_CONTROL = 0x01;
  while (MDR_RST_CLK->CLOCK_STATUS & (1 << 2) == 0x00);

  MDR_RST_CLK->CPU_CLOCK = (2
  | (0 << 2)
  | (0 << 4)
  | (1 << 8));
}
void CAN1_IRQHandler(void)
{
   PORT_SetBits(MDR_PORTC, PORT_Pin_1);
   for(int i=0;i<500000;i++){};
   PORT_ResetBits(MDR_PORTC, PORT_Pin_1);
  CAN_ITClearRxTxPendingBit(MDR_CAN1, rx_buf, CAN_STATUS_RX_READY);
      
}
void LedPinGfg (void)
{
   PORT_DeInit(MDR_PORTC);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
PortInit.PORT_Pin   = PORT_Pin_1;
PortInit.PORT_OE    = PORT_OE_OUT;
PortInit.PORT_FUNC= PORT_FUNC_PORT;
PortInit.PORT_MODE= PORT_MODE_DIGITAL;
PortInit.PORT_SPEED = PORT_SPEED_SLOW;
PORT_Init(MDR_PORTC, &PortInit);
  }


int main(void)
{
  for(int i=0;i<5000000;i++){};
  CPU_init ();
  Can_Init();
  LedPinGfg ();
      
  CAN_TxMsgTypeDef TxMsg;

  /* transmit */
  TxMsg.IDE     = CAN_ID_STD;
  TxMsg.DLC     = 0x04;
  TxMsg.PRIOR_0 = DISABLE;
  TxMsg.ID      = 0x05;
  TxMsg.Data[1] = 0;
  TxMsg.Data[0] = 0x12345678;
  while(1){
    CAN_Transmit(MDR_CAN1, tx_buf, &TxMsg);
    for(int i=0;i<1000000;i++){};
   }
}

Светодиоды точно работают, изначально были в основной функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2018-апр-25 13:01 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 73
Надо разрешить работу CAN1:
Код:
CAN_Cmd (MDR_CAN1, ENABLE);


Еще неплохо бы фильтр на буфер приема настроить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2018-апр-25 13:49 
Не в сети

Зарегистрирован: 2018-мар-01 11:21
Сообщения: 14
К сожалению не помогло, тем более разрешение работы уже было в строчке
Код:
MDR_CAN1->CONTROL = ((1 << 0)|(1 << 3)|(1 << 4));

На сколько я понял из спецификации, фильтры по умолчанию отключены


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с прерыванием по CAN
СообщениеДобавлено: 2018-апр-25 14:47 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 73
Попробуйте еще вот такую вещь:
Код:
  TxMsg.ID      = 0x05UL << 18;

Поскольку используете стандартный формат сообщения, у вас идентификатор оказывался равным нулю, а не пяти. Надо его сдвинуть влево на 18 бит.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

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


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

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


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

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