Кто плотно работал с CAN модулем MCP2515? Подскажите по маскам/фильтрам
- Войдите на сайт для отправки комментариев
Частенько собираю устройства на кан шине. Было время заказал себе китайских модулей 10 шт. Сейчас расходую потихоньку. Но вот беда, собирая очередное устройство, на столе всё работало, собрал в корпус - перестало. Видимо перетасовал модули и попался в итоговом исполнении не рабочий. Пол дня на этом потерял, пока нашёл косяк, т.к. думал изначально ,что ошибки всё-таки в скетче.
С толку сбило, что кан-модуль сообщения в кан шину отдавал, но не принимал. Такая половинчатая неисправность, поэтому на него не сразу подумал.
Хотел уже выкинуть данный кан модуль, чтобы ещё раз не попасть так. Но чё то крутил вертел, взял скетчи с разными библиотеками попробовал позаливать, и вдруг заработало. Опытным путём выяснил, что перестаёт принимать сообщения из CAN после перевключения питания кан-модуля. Опять же опытным путём выяснил, что оживает если в скетче происходит настройка масок/фильтров кан сообщений.
На модуль то мне пофиг, не жалко 100 рублей, просто охота разобраться косяк ли это с модулем или я чёто не так делаю.
В описаниях нигде не нашёл инфу что маски/фильтры сохраняются в энергонезависимой памяти, хотя еепром , я так понял, у микрухи есть. Правда я ещё плохо умею читать даташиты, может что не так понял.
Собственно в этом и вопрос, неисправен ли модуль? или это каким-то макаром выставились маски/фильтры, которые аппаратно блокируют приём кан сообщений? Я опасаюсь повторения данного косяка с другими модулями.
модуль оживает после этих строк в сетапе
CAN.init_Mask(0, 0, 0x000); // there are 2 mask in mcp2515, you need to set both of them CAN.init_Mask(1, 0, 0x000); /* * set filter, we can receive id from 0x04 ~ 0x09 */ CAN.init_Filt(0, 0, 0x04); // there are 6 filter in mcp2515 CAN.init_Filt(1, 0, 0x05); // there are 6 filter in mcp2515 CAN.init_Filt(2, 0, 0x06); // there are 6 filter in mcp2515 CAN.init_Filt(3, 0, 0x07); // there are 6 filter in mcp2515 CAN.init_Filt(4, 0, 0x08); // there are 6 filter in mcp2515 CAN.init_Filt(5, 0, 0x09); // there are 6 filter in mcp2515
Я не понимаю толком как настраивать эти маски фильтры, поэтому в масках ставлю нули (мне нужно принимать всё сообщения из шины), а фильтры просто любые. Проблема в том, что я пользую другую библиотеку, где вроде как нет настройки масок/фильтров, и модуль уже без этих строк не оживает.
del
Нет рабочих библиотек, которые работают с масками и фильтрами. Только написано, что работают, а на самом деле нет. Испытал почти все имеющиеся библиотеки, но так и не нашёл (или не смог разобраться по кривизне написанного), чтобы фильтр работал аппаратно. Принимаю всегда все пакеты при любых установленных фильтрах! (в обычном стандартном фрейме). Поэтому отсеиваю их тупой проверкой по if(ID==0x21){...}. Усли не хватает скорости на обработку, тогда поднимайте частоту заменой кварца. Optiboot для плат тут: https://github.com/MCUdude
Для обмена информацией нужно иметь две одинаковые платы (АТМегу и МСР2515) и одну библиотеку, тогда при соединении выводов H-H, L-L, никаких проблем не возникает (только на двух (крайних) платах CAN должны быть терминальные резисторы по 120 Ом, на промежуточных платах их быть не должно).
P/S: программа для ATmega328 и ATmega32U4 компилируется по разному, поэтому платы друг друга могут не увидеть. Только при одинаковых контроллерах будет 100% работа.
Best regards.
скетч?
Аппаратная фильтрация работает, но криво.
Сам вот сегодня промучился весь вечер, пока нашел, в чем проблема.
Возьмите пример из библиотеки mcp_can. Называется он Standard_MaskFilter.
Обратите внимание, что инициализация идет с параметром MCP_STDEXT. Из-за того, что у меня был задан параметр MCP_ANY, фильтрация не работала. Там есть какие-то заморочки с работой в режиме "принимать разные типы идентификаторов".
Также следует знать, что для стандартного режима идентификаторов маска и фильтр задаются со сдвигом влево на 16 битов. В теории младшие 16 битов можно использовать, чтобы фильтровать сообщения не только по идентификатору, но и по первым двум байтам данных.
Собственно, всё, что нужно было знать, чтобы не тратить часы. :(
Тоже вожусь с этими фильтрами, но не на арудино. Но с этим же модулем MCP2515.
У меня проблема такая: принимаю пакеты, вроде летят те что нужно, но в какой то момент накладываются друг на другая и в буфере смесь пакетов, например айди тот что я принимаю а данные из второго пакета.