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

 
 
> STM32 CAN фильтр.
Jenya7
сообщение Dec 27 2017, 10:35
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Решил использовать CAN в проекте. Так то все понятно но фильтрация приходящих сообщений вызывает затруднения.
Если я хочу получать RxMessage.StdId = 0x100 - 0x1FF - какой фильтр мне нужно применить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
novikovfb
сообщение Dec 27 2017, 10:48
Сообщение #2


Знающий
****

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



Цитата(Jenya7 @ Dec 27 2017, 14:35) *
Решил использовать CAN в проекте. Так то все понятно но фильтрация приходящих сообщений вызывает затруднения.
Если я хочу получать RxMessage.StdId = 0x100 - 0x1FF - какой фильтр мне нужно применить?

фильтр 0x100, маска 0x700. Маска указывает, какие биты проверять, фильтр - чему они должны быть равны.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 27 2017, 11:40
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(novikovfb @ Dec 27 2017, 15:48) *
фильтр 0x100, маска 0x700. Маска указывает, какие биты проверять, фильтр - чему они должны быть равны.

то есть все что в фильтре нули то пропускается и то что в маске единицы то тоже пропускается?
а для стандартного ИД мне достаточно лоу? хай не трогать?
Код
  //CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0100;
  //CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0700;


а. я понял.
MASK = 0 and ID =0 - бит проходит
MASK = 1 and ID =0 - бит блокируется

получается должно быть так
Код
  //CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x01FF;
  //CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFE00;



нет. вот так.
Код
  //CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0100;
  //CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFEFF;


Сообщение отредактировал Jenya7 - Dec 27 2017, 11:40
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Dec 27 2017, 11:50
Сообщение #4


Знающий
****

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



Цитата(Jenya7 @ Dec 27 2017, 15:40) *
то есть все что в фильтре нули то пропускается и то что в маске единицы то тоже пропускается?
а для стандартного ИД мне достаточно лоу? хай не трогать?
...
нет. вот так.
Код
  //CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0100;
  //CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFEFF;

Что в маске единицы - в фильтре и сообщении должно совпасть. Что в маске нули - в сообщении может быть любым.
Вышеприведенный фильтр, если и будет работать (некоторые контроллеры требуют 0 в фильтре там, где в маске 0), то будет брать только сообщения 0x000 и 0x100, потому как маска требует совпадения всех битов кроме 0x100.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 28 2018, 07:36
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(novikovfb @ Dec 27 2017, 17:50) *
Что в маске единицы - в фильтре и сообщении должно совпасть. Что в маске нули - в сообщении может быть любым.
Вышеприведенный фильтр, если и будет работать (некоторые контроллеры требуют 0 в фильтре там, где в маске 0), то будет брать только сообщения 0x000 и 0x100, потому как маска требует совпадения всех битов кроме 0x100.


настроил
Код
CAN_FilterInitStructure.CAN_FilterNumber = 0;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0064;    
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x00FF;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);
мастер посылает
Код
TxMessage.ExtId = (opcode << 8) | 0х64;
однако слейв не принимает. без маски и фильтра принимает.

Go to the top of the page
 
+Quote Post



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

 


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


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