Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: lpc1754, настройка фильтра сообщений CAN
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Controller Area Network (CAN)
mempfis_
Всем добрый день.
Пытаюсь настроить фильтр сообщений CAN-контроллера в LPC1754.
Деляю это после настройки CAN-контроллера.

CODE
//-------------------------------------
#define CAN1_ID (1<<29) //CAN-контроллер 1
#define CAN2_ID (2<<29) //CAN-контроллер 2

__root __no_init unsigned int AF_TABLE[AF_SIZE] @0xE0038000;

#define EFF_SA_NUM 16 //кол-во расширенных индивидуальных идентификаторов

//процедура настройки AF
void canInitAF(void)
{

AFMR = AFMR_ACCOFF; //переводим фильтр в off для конфигурирования

//таблица настроек фильтра
unsigned int id_table[3] = {CAN1_ID|1, CAN1_ID|2, CAN1_ID|78};
unsigned int id_nums = sizeof(id_table)/sizeof(unsigned int);

//заносим данные в таблицу идентификаторов, стандартные идентификаторы не используем поэтому с 0
for(unsigned int i=0; i<id_nums; i++)
{
AF_TABLE[i] = id_table[i];
}

//расставляем индексы
SFF_SA = (0)<<2; //start addres of the table of the individual Standart Identifiers
SFF_GRP_SA = (0)<<2; //start addres of the table of the grouped Standart Identifiers
EFF_SA = (0)<<2; //start addres of the table of the individual Extended Identifiers
EFF_GRP_SA = (EFF_SA_NUM)<<2; //start addres of the table of the grouped Extended Identifiers
ENDOFTABLE = (EFF_SA_NUM)<<2; //end of table

AFMR = 0; //разрешаем режим фильтрации
}
//-------------------------------------


Прогнал процедуру через симулятор. Все регистры настраиваются как положено. AF_TABLE расположена в памяти по верному адресу и нормально инициализируется. Ограничений на индексы для регистров настройки границ идентификаторов я не увидел в документации. Поэтому первые три границы == 0, EFF_GRP_SA и ENDOFTABLE соответственно == 16 (кол-во расширенных идентификаторов).
После включения фильтрации AFMR = 0; вижу что сообщения отправляются, но не не вижу прерываний по приёму.
Если включить режим байпасс AFMR = AFMR_ACCOBP; то вижу и отправленные сообщения, и принятые (выводится информация об ID).
Тестирую контроллер в режиме self-test за неимением второй платы для тестов.
Может кто подскажет в чём я ошибаюсь при настройке фильтрации сообщений?
Спасибо.
mempfis_
Проблема всё ещё не решена. Посмотрел примеры инициализации в IAR и LPC2000_CAN_Driver_Dem, немного переделал код - всёравно не работает.
Пробовал манипулировать ID CAN-приёмников (в документации на стр. 374 над fig 58 написано "Since each CAN bus has its own
address map, each entry also contains the number of the CAN Controller (001-010) to which it applies" из чего я понял ID для CAN1 - 1, CAN2 - 2), в примерах нумерация с 0. Пробовал выставлять идентификаторы в порядке в порядке возрастания и просто одинаковые. Пока прогресса нет.

P.S. Просьба к модераторам переместить тему в раздел Интерфейсы/CAN

CODE
//-------------------------------------
//процедура сброса настройки AF
void canInitAF(void)
{

AFMR = AFMR_ACCOFF; //переводим фильтр в off для конфигурирования

unsigned int id_table_st[4] = {((0<<13)|(1<<0)) | ((0<<29)|(2<<16)), ((0<<13)|(3<<0)) | ((0<<29)|(4<<16))};
unsigned int id_table_ext[4] = {CAN1_ID|1, CAN1_ID|2, CAN1_ID|3, CAN1_ID|4};
unsigned int ext_id_nums = sizeof(id_table_ext)/sizeof(unsigned int);
unsigned int addr=0;

//заносим данные в таблицу идентификаторов
volatile unsigned long * pAF_TABLE = (volatile unsigned long*) AF_BASE_ADDR;

//формируем индивидуальные стандартные идентификаторы
SFF_SA = addr;
for(unsigned int i=0; i<SFF_SA_NUM; i+=2)
{
//тут заносим таблицу стандартных индивидуальных идентификаторов группируя их парами
*pAF_TABLE = id_table_st[i];
addr +=4;
pAF_TABLE++;
}

//формируем индивидуальные групповые идентификаторы
SFF_GRP_SA = addr;
for(unsigned int i=0; i<SFF_GRP_NUM; i+=2)
{
//тут заносим таблицу стандартных групповых идентификаторов группируя их парами
//!!!
addr +=4;
pAF_TABLE++;
}

//формируем расширенные идентификаторы
EFF_SA = addr;
for(unsigned int i=0; i</*EFF_SA_NUM*/ ext_id_nums; i++)
{
//тут заносим таблицу расширенных идентификаторов
*pAF_TABLE = id_table_ext[i];
addr +=4;
pAF_TABLE++;
}

//формируем расширенные групповые идентификаторы
EFF_GRP_SA = addr;
for(unsigned int i=0; i<EFF_GRP_NUM; i++)
{
//тут заносим таблицу расширенных групповых идентификаторов
//!!!
addr +=4;
pAF_TABLE++;
}

//сохраняем адрес конца таблицы
ENDOFTABLE = addr; //end of table

AFMR = 0;//AFMR_ACCOBP разрешаем режим фильтрации
}
//-------------------------------------


mempfis_
Вобщем проблема была в базовом адресе ram фильтра. Во многих примерах для lpc23xx и в книге Тревора используется адрес 0xE0038000 (базовый адрес фильтра для семейства lpc2xxx) в то время как в lpc17xx этот кусок памяти расположен по адресу 0x4003 8000.
Не понимаю почему в файле iolpc1754 нельзя было описать эту область памяти и обозвать её каким нибудь подходящим именем.

Вобщем для lpc1754 код работает с таким определением памяти и через указатель.
Код
__root __no_init unsigned int AF_TABLE[AF_SIZE] @0x40038000;

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.