CAN и ETHERNET(К1921ВК01Т)

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Виктор »

Добрый день!

Использую демопроект motorcontrol (оттуда взята инициализация тактирования и пинов, остальное всё убрано). При инициализации CAN срабатывает какое-то прерывание и контроллер переходит на defaultISRhandler:

Код: Выделить всё

void main ()
{
 	InitCLK();
	CanDrv_init();  // инициализация CAN
...

	//sm_sys.init(&sm_sys);
	//EINT;//разрешение прерываний
}

// Инициализация CAN
void CanDrv_init()
{
	// D11 - CAN0_TX, E2 - CAN0_RX
	NT_GPIOG->ALTFUNCSET |= 1<<11; // вкл альт. ф.
	NT_COMMON_REG->GPIODENG |= 1<<11;	// вход активен

	NT_GPIOE->ALTFUNCSET |= 1<<2; // вкл альт. ф.
	NT_COMMON_REG->GPIODENE |= 1<<2;	// вход активен

	NT_CAN->CLC_bit.DISR = 1;			// запустить механизм выключения
	while(NT_CAN->CLC_bit.DISS == 0);	// ожидание выключения
	while(NT_CAN->PANCTR_bit.BUSY | NT_CAN->PANCTR_bit.RBUSY);


	NT_CAN->CAN_Node[NCAN].NCR_bit.INIT = 1; 	// начало инициализации
	NT_CAN->CAN_Node[NCAN].NCR_bit.CCE = 1; 	// бит разрешения изменения конфигурации узла. Разрешает доступ в NBTRx, NPCRx и NECNTx

	NT_CAN->CAN_Node[NCAN].NPCR_bit.LBM = 0;// loop-back=0
	NT_CAN->CAN_Node[NCAN].NIPR = 0;// Регистр указателя прерываний узла
....
}
На строчке (NT_CAN->PANCTR_bit.BUSY | NT_CAN->PANCTR_bit.RBUSY); программа переходит на дефолтный обработчик defaultISRhandler, определенный в shartup.h. При этом регистры флагов прерываний IABR0-4 пустые, а поля BUSY и RBUSY нулевые. Подскажите, пожалуйста, почему срабатывает какое-то прерывание и как узнать какое именно?
prostoRoman
Сообщения: 57
Зарегистрирован: 11 июл 2014, 15:06

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение prostoRoman »

Виктор писал(а): 11 апр 2019, 14:43как узнать какое именно?
В регистре xPSR младшие 8-9-10 бит(?) это поле ISR_NUMBER - номер активного прерывания.
prostoRoman
Сообщения: 57
Зарегистрирован: 11 июл 2014, 15:06

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение prostoRoman »

9 бит.

Код: Выделить всё

IPSR<8:0> = ExceptionNumber<8:0>;         // ExceptionNumber set in IPSR
Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Виктор »

А как получить доступ к регистрам xPSR?
В регистрах флагов прерываний ни одно прерывание не выставлено...
| Показать
NVIC.png
NVIC.png (76.91 КБ) 6253 просмотра
prostoRoman
Сообщения: 57
Зарегистрирован: 11 июл 2014, 15:06

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение prostoRoman »

Виктор писал(а): 11 апр 2019, 16:45А как получить доступ к регистрам xPSR?

Код: Выделить всё

#include <core_cm4.h>

xPSR_Type xPSR;

xPSR.w = __get_xPSR();

// поле xPSR.b.ISR  - содержит номер прерывания
Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Виктор »

Локализовал ошибку - попадаю в HardFault_Handler при чтении флага NT_CAN->PANCTR_bit.BUSY. Даже если просто считать этот флаг в переменную:

Код: Выделить всё

uint32_t busy =  NT_CAN->PANCTR_bit.BUSY;
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Лашкевич »

А модуль CAN включен? Наш драйвер начинается так:

Код: Выделить всё

//ставим запрос на включение модуля CAN (без этого даже к регистрам обратиться нельзя)
  NT_CAN->CLC_bit.DISR = 0;
  //ожидаем выполения запроса
  while (NT_CAN->CLC_bit.DISS == 1)
    ; //   DELAY
  //на всякий случай ожидаем освобождения панели команд для управления списками
  while (NT_CAN->PANCTR_bit.BUSY != 0 || NT_CAN->PANCTR_bit.RBUSY != 0)
    ; // DELAY
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Виктор »

Да, спасибо, дошли до этого сами методом проб и ошибок!
Виктор
Сообщения: 10
Зарегистрирован: 04 апр 2019, 12:10
Предприятие: МНИТИ

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Виктор »

Следуя инструкциям в этой viewtopic.php?f=37&t=491&start=90 теме обновил плагины и указал путь к svd-файлу.
Но массивы регистров отображаются некорректно (адреса всех регистров одинаковые и равны адресу нулевого элемента массива):
| Показать
1.png
1.png (26.85 КБ) 6219 просмотров
С чем это может быть связано?
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

Re: CAN и ETHERNET(К1921ВК01Т)

Сообщение Лашкевич »

А попробуйте добавить в expressions NT_CAN и посмотреть по указателю эту структуру. Там будет нормально или тоже глючить? Проверьте содержимое svd файла и работу с другими регистрами. Я помню смутно похожий глюк в одной из старых версий VectorIDE со старым плагином, но, кажется, это давно было пофикшено обновлением плагина.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Ответить

Вернуться в «32-разрядные микроконтроллеры»