jenya7 0 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба Решил использовать CAN в проекте. Так то все понятно но фильтрация приходящих сообщений вызывает затруднения. Если я хочу получать RxMessage.StdId = 0x100 - 0x1FF - какой фильтр мне нужно применить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 19 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба Решил использовать CAN в проекте. Так то все понятно но фильтрация приходящих сообщений вызывает затруднения. Если я хочу получать RxMessage.StdId = 0x100 - 0x1FF - какой фильтр мне нужно применить? фильтр 0x100, маска 0x700. Маска указывает, какие биты проверять, фильтр - чему они должны быть равны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2017 Опубликовано 27 декабря, 2017 (изменено) · Жалоба фильтр 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; Изменено 27 декабря, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 19 27 декабря, 2017 Опубликовано 27 декабря, 2017 · Жалоба то есть все что в фильтре нули то пропускается и то что в маске единицы то тоже пропускается? а для стандартного ИД мне достаточно лоу? хай не трогать? ... нет. вот так. //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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 декабря, 2017 Опубликовано 27 декабря, 2017 (изменено) · Жалоба Что в маске единицы - в фильтре и сообщении должно совпасть. Что в маске нули - в сообщении может быть любым. Вышеприведенный фильтр, если и будет работать (некоторые контроллеры требуют 0 в фильтре там, где в маске 0), то будет брать только сообщения 0x000 и 0x100, потому как маска требует совпадения всех битов кроме 0x100. нашел такой пример Example 2. we wish to accept only frames with IDs of 00001560 to 0000156F set filter to 00001560 set mask to 1FFFFFF0 то есть по анологии получается так? CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0100; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x1FFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFF00; Изменено 28 декабря, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба Что в маске единицы - в фильтре и сообщении должно совпасть. Что в маске нули - в сообщении может быть любым. Вышеприведенный фильтр, если и будет работать (некоторые контроллеры требуют 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; однако слейв не принимает. без маски и фильтра принимает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба запрограммировано на фильтрацию 28-битных ID (то есть extended ID) попробуйте попередавать для начала extID с таким ID с мастера затем смотреть в сторону CAN_FILTERSCALE_16BIT там по-моему сразу два фильтра надо программировать - уже не помню Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба запрограммировано на фильтрацию 28-битных ID (то есть extended ID) попробуйте попередавать для начала extID с таким ID с мастера затем смотреть в сторону CAN_FILTERSCALE_16BIT там по-моему сразу два фильтра надо программировать - уже не помню так у меня и есть extended ID. я передаю 0х64 и это ID у меня определено на слейве а 0хFF - только его сравнивать, остальные биты don't care. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба > Если я хочу получать RxMessage.StdId = 0x100 - 0x1FF > и есть extended ID ? с фильтрами никаких проблем не было - должно работать для порядка, можно пройтись циклом по всем и запретить - так во всех экзамплах делают, по-моему upd: в некоторых камнях есть два контроллера CAN - мастер и слейв, чтобы фильтры в слейве работали, мастер тоже нужно включить (я с этим не сталкивался, но где-то видел) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2018 Опубликовано 21 октября, 2018 · Жалоба по моему я понял где проблема. STID находиться в HIGH половине региста, сдвинутый на 5 влево. то есть если я хочу получать данные для ID = 0xXX64 (XX - don't care) - нужно настраивать HIGH. CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0064 << 5; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x00FF << 5; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться