реклама на сайте
подробности

 
 
> STM32F091 CAN filters init, инициализация CAN фильтров на определенный сообщения
max_mart
сообщение Feb 17 2017, 17:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Народ всем привет.

Использую STM32F091. Необходимо фильтровать CAN сообщения на аппаратном уровне, чтобы успешно приходили CAN сообщения определенного ID, например, 0x434, 0x3b3, 0x171, 0x42f, 0x041.

Как это сделать?

Пробовал различные варианты по инициализации CAN_FilterIdHigh, CAN_FilterIdLow, CAN_FilterMaskIdHigh, CAN_FilterMaskIdLow, но все равно пропускается большой поток ненужных сообщений.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
max_mart
сообщение Feb 20 2017, 08:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Всем привет. Вот я так делаю:
CODE
void setup_can_filter(void)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure;
/* CAN filter init 0*/
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x332<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterIdLow = (0x331<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x3B3<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (0x430<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN filter init 1*/
CAN_FilterInitStructure.CAN_FilterNumber = 1;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x171<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterIdLow = (0x0415<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x0434<<5);//|(1<<4);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (0x042F<<5);//|(0<<4);
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}

void setup_can(CAN_InitTypeDef *can, int baud)
{
CAN_StructInit(can);

CAN_DeInit(CAN);

CAN_StructInit(can);
/* CAN cell init */
can->CAN_TTCM = DISABLE;
can->CAN_ABOM = ENABLE;
can->CAN_AWUM = DISABLE;
can->CAN_NART = DISABLE; /* orig: DISABLE Transmit only once */
can->CAN_RFLM = DISABLE;
can->CAN_TXFP = DISABLE;
can->CAN_Mode = CAN_Mode_Normal;
can->CAN_SJW = CAN_SJW_1tq;
can->CAN_BS1 = CAN_BS1_13tq;
can->CAN_BS2 = CAN_BS2_2tq;

switch(baud)
{
case 1000000:
can->CAN_Prescaler = 3;
break;

case 500000:
/* CAN Baudrate = 100KBps (tested OK on real car) */
// на самом деле не 100К, а 500К (копипастеры ...)
can->CAN_Prescaler = 6;
break;

case 250000:
/* CAN Baudrate = 250KBps */
can->CAN_Prescaler = 12;
break;

case 125000:
/* CAN Baudrate = 125KBps */
can->CAN_Prescaler = 24;
break;

case 100000:
/* CAN Baudrate = 100KBps (tested OK on real car) */
can->CAN_Prescaler = 30;
break;

case 50000:
/* CAN Baudrate = 50KBps */
can->CAN_Prescaler = 60;
break;
}
setup_can_filter();
CAN_Init(CAN, can);
CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
}


Все равно не работает. НЕ нужные сообщения проходят. Что может быть не так?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 09:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01624 секунд с 7
ELECTRONIX ©2004-2016