Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.
Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.
(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT)
19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс
автосброс по этой схеме используется для того чтобы он происходил автомаически один раз при подаче питания (требование даташита MCP2515 делать сброс после подачи питания), но нам это не нужно, т.к. мы с ардуины делаем сброс при помощи SPI.
Вообще сброс по SPI эквивалентен, я так понял, сбросу по пину Reset. Вот выдержка из текста описания MCP2515
1. Hardware Reset (аппаратный сброс) - низким уровнем на выводе /RESET.
4
2. SPI Reset - подачей команды Reset через SPI.
5
Функционал обоих видов сброса эквивалентен. Важно осуществить один из этих способов сброса после включения питания, чтобы гарантировать переход логики и регистров в свое состояние по умолчанию.
Я научился делать фильтры правильно. Маске 0 соответсвуют фильтры 0 и 1. Маске 1 соответствуют фильтры 2,3,4,5. Так вот нужно задавать все маски и фильтры, иначе MCP воспринимает маску и фильтр как 0, что не правильно.
Но, т.к. у нас один из фильтров на второй разряд ID равен 00 (шириоковещательные), то в целом будут пролетать ID вообще со всеми нулями, что нам не нужно. Тут два выхода:
- Сделать широковещательные 0xFF (будет проблем с enum, т.к. выходит за пределы)
- устанавливать брошенный нами бит direction в 1 на ВСЕХ используемыми нами сообщениях, таким образом, наши сообщения никогда не будут с ID равном полностью 0 - считаю наилучший вариант.
если мы так сделаем, то аппаратно не будут проходить большие ID 0х00000000 и маленькие 0х000. Думаю это даст шанс на исправление косяков.
(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT)
19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс
(Нужно схему смотреть с платы, вешером посмотрю)
бывают два корпуса MCP2515 - 20 ногий TSSOP и 18 ногий PDIP/SOIC.
У нас 18 ногий PDIP/SOIC. Поэтому пин reset у нас 17 нога. У 20 ногого TSSOP reset, всё правильно, 19 нога. Надеюсь до этого гемора с хард ресетом не дойдет.
ЗЫ есть ещё корпус 20 ногий 4x4 QFN* у него reset тоже 17 нога.
пока вот 11 версия. Теперь аппаратно не просачиваются 0х00000000 и 0х000. Поставил в нашем скетче в отправляемом фрейме в заголовке бит direction везде "1" (надеюсь везде исправил).
И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?
дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно, щас проверил 10кОм. (маркирвка резистора 103)
Протокол CAN предоставляет изощренные механизмы определения наличия ошибок. Можно детектировать следующие ошибки.
04
05
CRC Error. Проверка контрольной суммы (Cyclic Redundancy Check, CRC): передатчик вычисляет специальные проверочные биты для данных начиная от SOF и заканчивая полем данных. Последовательность бит CRC передается в поле CRC фрейма. Принимающий узел также вычисляет последовательность бит CRC по той же самой формуле, что и передатчик, и сравнивает вычисленную CRC с принятой. Если обнаружено несовпадение, то произошла ошибка CRC, и тогда генерируется фрейм ошибки. Передача сообщения повторяется.
06
07
Acknowledge Error. В поле подтверждения сообщения передатчик проверяет, находится ли там доминантный бит (доминантный бит должен быть установлен приемником сообщения, тогда как передатчик посылает этот бит как рецессивный). Если в поле подтверждения отсутствует доминантный бит, то значит противоположный узел не принял корректно фрейм. Как следствие возникает ошибка подтверждения (acknowledge error), генерируется фрейм ошибки и передача сообщения повторяется.
08
09
Form Error. Если узел детектирует доминантный бит в одном из 4 сегментов, где его не должно быть - включая конец фрейма end-of-frame (EOF), промежуток между фреймами interframe space (IFS), разделитель подтверждения (acknowledge delimiter) или разделитель CRC, то тогда возникает ошибка формы, и генерируется ошибка фрейма. Передача сообщения повторяется.
10
11
Bit Error. Ошибка бита возникает, если передатчик детектирует противоположный уровень бита, не соответствующий тому, который был послан (например, передавался доминантный бит, но был детектирован рецессивный, или был передан рецессивный бит, но на шине вместо него был обнаружен доминантный бит).
12
13
Исключение имеется только для поля арбитража и слота подтверждения: если передатчик посылает рецессивный бит, и детектирует доминантный, то не генерируется ошибка бита, потому что это нормальные ситуации арбитража и получения подтверждения в протоколе CAN.
14
15
Stuff Error. Если в промежутке между началом фрейма (start-of-frame, SOF) и разделителем CRC, обнаружено 6 следующих друг за другом бит одинаковой полярности, то нарушено правило бит-стаффинга. Тогда происходит ошибка бит-стаффинга и генерируется ошибка фрейма. Передача сообщения повторяется.
16
17
Состояния ошибки. Про обнаруженные ошибки все другие узлы сети CAN узнают через генерацию и получение фреймов ошибки (error frame, см. рис. 2-4). Передача фрейма ошибочного сообщения прерывается, и этот фрейм повторяется, как только это становится возможным. Кроме того, каждый узел CAN находится в одном из 3 состояний ошибки, каждое из которых соответствует значению внутренних счетчиков ошибок:
18
19
1. Error-active (состояние активной ошибки).
20
2. Error-passive (состояние пассивной ошибки).
21
3. Bus-off (шина выключена, это относится только к передатчику).
22
23
Состояние error-active это обычное состояние, когда узел может передавать сообщения и фреймы активной ошибки (построенного из доминантных бит, см. рис. 2-4) без каких-либо ограничений.
24
25
В состоянии error-passive могут передаваться сообщения и фреймы пассивной ошибки (состоящие из рецессивных бит).
26
27
Состояние bus-off временно делает невозможным для узла участвовать в обмене по шине. Во время этого состояния сообщения не могут ни приниматься, ни передаваться. Только передатчики могут перейти в состояние bus-off.
28
29
Режимы ошибки и счетчики ошибок. Контроллер MCP2515 содержит 2 счетчика ошибок: счетчик ошибок приема Receive Error Counter, REC (см. регистр 6-2) и счетчик ошибок передачи Transmit Error Counter, TEC (см. регистр 6-1). Значения этих обоих счетчиков может прочитать управляющий микроконтроллер. Эти счетчики инкрементируются / декрементируются в соответствии со спецификацией шины CAN.
30
31
MCP2515 находится в состоянии error-active, если значение обоих счетчиков меньше 128, предела error-passive. В состояние error-passive MCP2515 переходит, если как минимум один из счетчиков ошибок равен или больше 128.
32
33
В состояние bus-off контроллер переходит, если TEC превышает 255, предел bus-off. Контроллер остается в этом состоянии, пока не будет принята последовательность восстановления шины (bus-off recovery sequence). Bus-off recovery sequence состоит из 128 передач следующих друг за другом 11 последовательных рецессивных бит (см. рис. 6-1).
34
35
Примечание: после того, как MCP2515, перейдет в bus-off, он восстановится обратно в состояние error-active без какого-либо вмешательства со стороны управляющего микроконтроллера, если шина остается в состоянии ожидания (idle) на время 128 * 11 бит. Если это нежелательно, то такая ситуация должна быть адресована обработчику прерывания.
36
Текущий режим работы MCP2515 может быть прочитан управляющим микроконтроллером через регистр EFLG (см. регистр 6-3).
37
38
Дополнительно есть бит флага предупреждения о состоянии ошибки (error state warning flag, EFLG:EWARN), который установится, если как минимум один из счетчиков ошибок превысит лимит 96. Бит EWARN сбрасывается, если оба счетчика ошибок станут меньше 96.
По идее в момент глюка можно вывести инфу в каком режиме по ошибкам находится MCP2515. Переполнены ли буферы.
И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?
дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно, щас проверил 10кОм. (маркирвка резистора 103)
Я тут посоветовался со своими разработчиками, они насоветовали от GPIO DUE через диод и резистор 500 ом + стабилитрон на ногу 17 подать 0. Ну это на бегу.
Воткнул твою функцию readErrorFlags_MCP2515 (); в 5 мест
1. в RX() в начале где return по 0 ID
2. в RX() в конце где default case
3. в test() под 9
4. В printStatus() в начале.
5 В конце MCP2515_Init
В итоге при кадом выводе статуса имеем список ошибок, при сбое имеем список ошибок, после инит имеем список ошибок, ну и ручками всегда можем посмотреть.
Поставил ждем.
Кстати к размышлению. У меня громе DUE которые включены в комп, все осталные платы (узлы 6-21) на автономном питании от единого БП, я из как включил 2 дня назад так и не выключал. Так вот там ошибок нет.
Но они интенсивно в отличии от мастера с передачей 1 раз в секунду не обмениваются.
Т.е получается валимся при интенсивном обмене и не в терминаторах дело. В общем буду смотреть накопление ошибок.
вот немного подкорректированная функция чтения ошибок. Показывает кроме флагов также количество ошибок. Я в два места запихал. CTRL+F ом найдешь. 12 версия.
поставь 12 версию, посмотрим как количество ошибок меняется. В описании написано что счётчики увеличиваются и уменьшаются в соответствии со спецификацией CAN - уж не знаю по какому алгоритму.
ага неизвестный тип сообщения , да ещё фрейм ремоут докучи О_О. Эта шина над нами издевается, ноль убрали - дак это стало просачиваться. При том что MCP2515 виснет к тому же при получении такого сообщения. И видимо на пине INT висит сигнал что сообщение принято, и он одно и тоже глюкавое б/у шное сообщение показывает.
отключи узел 13, может он козлит. По одному отключай и смотри. Судя по логу, вообще беда. еще и ардуина докучи перезагружалась , смотри время сбрасывалось вначале лога на 4 мин.
отключи узел 13, может он козлит. По одному отключай и смотри. Судя по логу, вообще беда. еще и ардуина докучи перезагружалась , смотри время сбрасывалось вначале лога на 4 мин.
Ну а сейчас от 9 было
041
-------CAN MESSAGE RX ADRRESSED TO ME-------
042
ID 8E090400
043
type_msg - Неизвестное сообщение
044
node_addr - node_9_Kitchen_net_center
045
Rem_addr - node_4_Net_center_Due1
046
Dev_type - NULL DEVICE
047
DATA FRAME 00 00 00 00 00 00 00 00
048
--------------------------------------------
Важно же не только из-за чего но и что делать если. Мало того CAN сам должкн отрабатывать
ООП более структурировано, привыкнете писать красиво и правильно. По своему опыту знаю проекты, начавшиеся на чистом С, обычно переписываются на С++, обратно никогда.
riv пишет:
вопрос про легкость согласования длинноволновых линий связи. Утверждение основано на опыте или теории?
Опыт в соответствии с теорией. Произвольную топологию в принципе нельзя согласовать. Задержка распространения сигнала в медном кабеле 4.8 мкс/км, 19200 это предел для несогласованной линии 1 км.
ООП более структурировано, привыкнете писать красиво и правильно. По своему опыту знаю проекты, начавшиеся на чистом С, обычно переписываются на С++, обратно никогда.
riv пишет:
вопрос про легкость согласования длинноволновых линий связи. Утверждение основано на опыте или теории?
Опыт в соответствии с теорией. Произвольную топологию в принципе нельзя согласовать. Задержка распространения сигнала в медном кабеле 4.8 мкс/км, 19200 это предел для несогласованной линии 1 км.
Я то насчет КСВ с КБВ и четверть волонового трансформатора имел в виду. Ну и чем длиннее волна тем сложнее согласовывать линии. Снижение скорости снижаетчастоту но и увеличивает длинну волны.
Я конечно понимаю что тут манипуляция а не модуляция, так как физ линия, но все же.
Ну и проблемы то у нас другого характера, ошибки на CAN есть но они очень эпизодические. Явно если бы линиям было недостаточно согласования она бы часами не стояла нормально.
А вообще регистры неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил. Домовёнок у тебя к кану подключился. 21 век как никак.
И самое главное как оно просочилось через фильтр? О_О
Фильтр стоит что direction только с 1 должен проходить. можешь проверить на простом скетче. Это не поддается объяснению.
А вообще регистры неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил. Домовёнок у тебя к кану подключился. 21 век как никак.
dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу
короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз.
dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу
Заливаю твои, но подкручиваю дебаг, сам видишь как выводит, меня это отправлено в CAN достает в логе.
Вроде залита 11 с измененной ф-й вывода ошибок из 12. Я специально спросил, ты только ее изменил.
Я кстати про это и говорил что
1. Вставляй в основной файл что то вроде //ver 12
2. По времени подготовить код и залить его во все контроллеры это 2-3 часа. Поэтому без серьезных изменения я только в DUE меняю код. И кстати МК не вснут
короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз.
Ок завтра поставлю. Пусть 12 простоит ночь. Уже 4 часа без малого стоит.
Вроде залита 11 с измененной ф-й вывода ошибок из 12. Я специально спросил, ты только ее изменил.
нужно наверное убрать в 5 местах обращения к регистрам - коряво всё это работает почему то
riv пишет:
1. Вставляй в основной файл что то вроде //ver 12
ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять.
riv пишет:
По времени подготовить код и залить его во все контроллеры это 2-3 часа. Поэтому без серьезных изменения я только в DUE меняю код.
но вот это конечно не гуд, из-за этого и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.
ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять.
но вот это конечно не гуд, из-за этого и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.
Посмотри файл лога, как на DUE добиться такого вывода настройками?
Я беру твой пакет, создаю под каждый папку с именем узла, переименовываю основной файл, открываю, настраиваю. На выходе если нет указателя что за версия то хрен поймешь что стоит. Так что лучше даже в лог пусть выводит вместе с именем узла.
Ну я условно сказал. Везде стоит 11 версия, так как лог я снимаю только с DUE то протсо вставил ф-ю снятия ошибок из регистров.
DUE завтра поменяю. Но я думаю не в DUE дело. Каждая плата свои либы имеет и может конфликтовать.
какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже.
У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже.
какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже.
У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже.
я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца. Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось.
я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца. Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось.
Представь определения в студию, и к ним интерфейсы добавь. Посмотрим, что ты нафантазировал, посмеемся когда у тебя SPI "асинхронным" окажется.
Напомни мне где я врал и на чем был ловлен с поличными
В #781 врал, в #797 был пойман на вранье.
Ты послан. Можешь не отвечать.
А, так ты слился, соплячок. Накозлил глупостей с три короба - и теперь в кусты.
Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.
Коллеги, предлагаю дискутировать , не переходя на личности. Уважайте друг друга. Читать такие вещи противно если честно. Взрослые ведь уже. Мы тут письками не мереемся, мы пытаемся сеть построить.
Согласен полностью.
Т.к. согласно схемы http://electronicsworld.ru/wp-content/uploads/2017/11/niren_mcp2515-CAN-Bus-Module-Schematics.png
(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT)
19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс
http://microsin.net/images/stories/hard/MCP2515-RESET-pin-example-fig9-1.png
Думаю диод с конденсатором и R не нужны т.к автосброс мы не реализуем.
(Нужно схему смотреть с платы, вешером посмотрю)
автосброс по этой схеме используется для того чтобы он происходил автомаически один раз при подаче питания (требование даташита MCP2515 делать сброс после подачи питания), но нам это не нужно, т.к. мы с ардуины делаем сброс при помощи SPI.
Вообще сброс по SPI эквивалентен, я так понял, сбросу по пину Reset. Вот выдержка из текста описания MCP2515
1
MCP2515 различает два способа сброса:
2
3
1. Hardware Reset (аппаратный сброс) - низким уровнем на выводе /RESET.
4
2. SPI Reset - подачей команды Reset через SPI.
5
Функционал обоих видов сброса эквивалентен. Важно осуществить один из этих способов сброса после включения питания, чтобы гарантировать переход логики и регистров в свое состояние по умолчанию.
Я научился делать фильтры правильно. Маске 0 соответсвуют фильтры 0 и 1. Маске 1 соответствуют фильтры 2,3,4,5. Так вот нужно задавать все маски и фильтры, иначе MCP воспринимает маску и фильтр как 0, что не правильно.
Но, т.к. у нас один из фильтров на второй разряд ID равен 00 (шириоковещательные), то в целом будут пролетать ID вообще со всеми нулями, что нам не нужно. Тут два выхода:
- Сделать широковещательные 0xFF (будет проблем с enum, т.к. выходит за пределы)
- устанавливать брошенный нами бит direction в 1 на ВСЕХ используемыми нами сообщениях, таким образом, наши сообщения никогда не будут с ID равном полностью 0 - считаю наилучший вариант.
если мы так сделаем, то аппаратно не будут проходить большие ID 0х00000000 и маленькие 0х000. Думаю это даст шанс на исправление косяков.
(Так тут я сбредил, здесь пишут про ресет на 17 ноге и выводе на INT)
19 нога не задействована я уже почти пришел к тому чтобы через 10кОм на 19 ногу GPIO от ардуино подпаять и держать там HIGH для ресета дать LOW на 10-20 мс
(Нужно схему смотреть с платы, вешером посмотрю)
бывают два корпуса MCP2515 - 20 ногий TSSOP и 18 ногий PDIP/SOIC.
У нас 18 ногий PDIP/SOIC. Поэтому пин reset у нас 17 нога. У 20 ногого TSSOP reset, всё правильно, 19 нога. Надеюсь до этого гемора с хард ресетом не дойдет.
ЗЫ есть ещё корпус 20 ногий 4x4 QFN* у него reset тоже 17 нога.
Нв выходе пока бъемся с софтом?
И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?
пока вот 11 версия. Теперь аппаратно не просачиваются 0х00000000 и 0х000. Поставил в нашем скетче в отправляемом фрейме в заголовке бит direction везде "1" (надеюсь везде исправил).
Исправил фильтры
И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?
дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно, щас проверил 10кОм. (маркирвка резистора 103)
вот инфа из описания MCP2515 как детектируются ошибки в MCP2515
01
[Детектирование ошибок]
02
03
Протокол CAN предоставляет изощренные механизмы определения наличия ошибок. Можно детектировать следующие ошибки.
04
05
CRC Error. Проверка контрольной суммы (Cyclic Redundancy Check, CRC): передатчик вычисляет специальные проверочные биты для данных начиная от SOF и заканчивая полем данных. Последовательность бит CRC передается в поле CRC фрейма. Принимающий узел также вычисляет последовательность бит CRC по той же самой формуле, что и передатчик, и сравнивает вычисленную CRC с принятой. Если обнаружено несовпадение, то произошла ошибка CRC, и тогда генерируется фрейм ошибки. Передача сообщения повторяется.
06
07
Acknowledge Error. В поле подтверждения сообщения передатчик проверяет, находится ли там доминантный бит (доминантный бит должен быть установлен приемником сообщения, тогда как передатчик посылает этот бит как рецессивный). Если в поле подтверждения отсутствует доминантный бит, то значит противоположный узел не принял корректно фрейм. Как следствие возникает ошибка подтверждения (acknowledge error), генерируется фрейм ошибки и передача сообщения повторяется.
08
09
Form Error. Если узел детектирует доминантный бит в одном из 4 сегментов, где его не должно быть - включая конец фрейма end-of-frame (EOF), промежуток между фреймами interframe space (IFS), разделитель подтверждения (acknowledge delimiter) или разделитель CRC, то тогда возникает ошибка формы, и генерируется ошибка фрейма. Передача сообщения повторяется.
10
11
Bit Error. Ошибка бита возникает, если передатчик детектирует противоположный уровень бита, не соответствующий тому, который был послан (например, передавался доминантный бит, но был детектирован рецессивный, или был передан рецессивный бит, но на шине вместо него был обнаружен доминантный бит).
12
13
Исключение имеется только для поля арбитража и слота подтверждения: если передатчик посылает рецессивный бит, и детектирует доминантный, то не генерируется ошибка бита, потому что это нормальные ситуации арбитража и получения подтверждения в протоколе CAN.
14
15
Stuff Error. Если в промежутке между началом фрейма (start-of-frame, SOF) и разделителем CRC, обнаружено 6 следующих друг за другом бит одинаковой полярности, то нарушено правило бит-стаффинга. Тогда происходит ошибка бит-стаффинга и генерируется ошибка фрейма. Передача сообщения повторяется.
16
17
Состояния ошибки. Про обнаруженные ошибки все другие узлы сети CAN узнают через генерацию и получение фреймов ошибки (error frame, см. рис. 2-4). Передача фрейма ошибочного сообщения прерывается, и этот фрейм повторяется, как только это становится возможным. Кроме того, каждый узел CAN находится в одном из 3 состояний ошибки, каждое из которых соответствует значению внутренних счетчиков ошибок:
18
19
1. Error-active (состояние активной ошибки).
20
2. Error-passive (состояние пассивной ошибки).
21
3. Bus-off (шина выключена, это относится только к передатчику).
22
23
Состояние error-active это обычное состояние, когда узел может передавать сообщения и фреймы активной ошибки (построенного из доминантных бит, см. рис. 2-4) без каких-либо ограничений.
24
25
В состоянии error-passive могут передаваться сообщения и фреймы пассивной ошибки (состоящие из рецессивных бит).
26
27
Состояние bus-off временно делает невозможным для узла участвовать в обмене по шине. Во время этого состояния сообщения не могут ни приниматься, ни передаваться. Только передатчики могут перейти в состояние bus-off.
28
29
Режимы ошибки и счетчики ошибок. Контроллер MCP2515 содержит 2 счетчика ошибок: счетчик ошибок приема Receive Error Counter, REC (см. регистр 6-2) и счетчик ошибок передачи Transmit Error Counter, TEC (см. регистр 6-1). Значения этих обоих счетчиков может прочитать управляющий микроконтроллер. Эти счетчики инкрементируются / декрементируются в соответствии со спецификацией шины CAN.
30
31
MCP2515 находится в состоянии error-active, если значение обоих счетчиков меньше 128, предела error-passive. В состояние error-passive MCP2515 переходит, если как минимум один из счетчиков ошибок равен или больше 128.
32
33
В состояние bus-off контроллер переходит, если TEC превышает 255, предел bus-off. Контроллер остается в этом состоянии, пока не будет принята последовательность восстановления шины (bus-off recovery sequence). Bus-off recovery sequence состоит из 128 передач следующих друг за другом 11 последовательных рецессивных бит (см. рис. 6-1).
34
35
Примечание: после того, как MCP2515, перейдет в bus-off, он восстановится обратно в состояние error-active без какого-либо вмешательства со стороны управляющего микроконтроллера, если шина остается в состоянии ожидания (idle) на время 128 * 11 бит. Если это нежелательно, то такая ситуация должна быть адресована обработчику прерывания.
36
Текущий режим работы MCP2515 может быть прочитан управляющим микроконтроллером через регистр EFLG (см. регистр 6-3).
37
38
Дополнительно есть бит флага предупреждения о состоянии ошибки (error state warning flag, EFLG:EWARN), который установится, если как минимум один из счетчиков ошибок превысит лимит 96. Бит EWARN сбрасывается, если оба счетчика ошибок станут меньше 96.
По идее в момент глюка можно вывести инфу в каком режиме по ошибкам находится MCP2515. Переполнены ли буферы.
И судя по схеме через R3 на 17 ногу всегда подается +5. Знаешь номинал R3?
дак конечно, это потяжка к питанию, чтобы помехи не влияли, а то бы так постоянно спонтанно перезагружался MCP2515. Я думаю кОм 10 он. Да, всё верно, щас проверил 10кОм. (маркирвка резистора 103)
Я тут посоветовался со своими разработчиками, они насоветовали от GPIO DUE через диод и резистор 500 ом + стабилитрон на ногу 17 подать 0. Ну это на бегу.
По идее в момент глюка можно вывести инфу в каком режиме по ошибкам находится MCP2515. Переполнены ли буферы.
Сможешь это сделать? Я с регистрами вообще на Вы.
вот фукция, а вот когда её вызывать вопрос. Если мастер , то можно при каждом получении статуса от узла
Если узел, то при каждом получении статуса мастера.
01
void
readErrorFlags_MCP2515 () {
02
03
SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
// начало связи по SPI ( скорость , очередность, режим SPI)
04
digitalWrite(csPIN, LOW);
// выбираем устройство на шине SPI (пин CS нужного устройства в лоу)
05
SPI.transfer(0x03);
// команда прочитать регистры MCP2515 в BIN это 00000011
06
SPI.transfer(0x2D);
// адрес регистра 6-3 EFGL - Error Flag
07
byte
inByteSPI = SPI.transfer(0x00);
// получение данных из шины SPI
08
digitalWrite(csPIN, HIGH);
// отпускаем пин CS
09
SPI.endTransaction();
// конец связи по SPI
10
11
// ниже разборка полученного байта на биты
12
if
(inByteSPI != 0) {
for
(
int
i=0; i<8; i++) {
13
if
(i==0) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" RX or TX errors >= 96 "
));}
14
else
if
(i==1) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" RX errors >= 96 "
));}
15
else
if
(i==2) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" TX errors >= 96 "
));}
16
else
if
(i==3) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" RX errors >= 128. Mode ErrorPassive "
));}
17
else
if
(i==4) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" TX errors >= 128. Mode ErrorPassive "
)); }
18
else
if
(i==5) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" TX errors == 255. Mode BusOff "
)); }
19
else
if
(i==6) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" Переполнен буфер приёма RX0 "
)); }
20
else
if
(i==7) {
if
(bitRead (inByteSPI, i))
Serial
.print (F(
" Переполнен буфер приёма RX1 "
));
Serial
.println(); }
21
}
22
23
}
24
else
Serial
.println (F(
"NO Errors"
));
25
26
}
Воткнул твою функцию readErrorFlags_MCP2515 (); в 5 мест
1. в RX() в начале где return по 0 ID
2. в RX() в конце где default case
3. в test() под 9
4. В printStatus() в начале.
5 В конце MCP2515_Init
В итоге при кадом выводе статуса имеем список ошибок, при сбое имеем список ошибок, после инит имеем список ошибок, ну и ручками всегда можем посмотреть.
Поставил ждем.
Кстати к размышлению. У меня громе DUE которые включены в комп, все осталные платы (узлы 6-21) на автономном питании от единого БП, я из как включил 2 дня назад так и не выключал. Так вот там ошибок нет.
Но они интенсивно в отличии от мастера с передачей 1 раз в секунду не обмениваются.
Т.е получается валимся при интенсивном обмене и не в терминаторах дело. В общем буду смотреть накопление ошибок.
вот немного подкорректированная функция чтения ошибок. Показывает кроме флагов также количество ошибок. Я в два места запихал. CTRL+F ом найдешь. 12 версия.
Вот вылезло
поставь 12 версию, посмотрим как количество ошибок меняется. В описании написано что счётчики увеличиваются и уменьшаются в соответствии со спецификацией CAN - уж не знаю по какому алгоритму.
Ты в ней только
да
Вот смотри что происходит
001
NODES CAN COMMUNICATION:
002
node_5_Net_center_Due2 OK
003
node_6_Hallway_net_center OK
004
node_7_Hallway_main OK
005
node_8_Hallway_light OK
006
node_9_Kitchen_net_center OK
007
node_10_Kitchen_main OK
008
node_11_Kitchen_light OK
009
node_12_WC_main OK
010
node_13_WC_waterleak OK
011
node_14_Bathroom_main OK
012
node_15_Boxroom_main OK
013
node_18_Loggia_recuperator OK
014
node_19_Livingroom_main OK
015
node_20_Bedroom_main OK
016
node_21_Cabinet_main OK
017
018
-------CAN MESSAGE RX ADRRESSED TO ME-------
019
ID CE0D0401
020
type_msg - Неизвестное сообщение
021
node_addr - node_13_WC_waterleak
022
Rem_addr - node_4_Net_center_Due1
023
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
024
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
025
026
--------------------------------------------
027
028
NO ErrorFlags
029
030
TX Errors = 0
031
RX Errors = 12
032
Error Initializing MCP2515...
033
034
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
035
036
NO ErrorFlags
037
038
TX Errors = 7
039
RX Errors = 0
040
Init1
041
NO ErrorFlags
042
043
TX Errors = 0
044
RX Errors = 0
045
046
-------CAN MESSAGE RX ADRRESSED TO ME-------
047
ID CE0D0401
048
type_msg - Неизвестное сообщение
049
node_addr - node_13_WC_waterleak
050
Rem_addr - node_4_Net_center_Due1
051
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
052
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
053
054
--------------------------------------------
055
056
NO ErrorFlags
057
058
TX Errors = 0
059
RX Errors = 0
060
Error Initializing MCP2515...
061
062
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
063
064
NO ErrorFlags
065
066
TX Errors = 0
067
RX Errors = 0
068
Init1
069
NO ErrorFlags
070
071
TX Errors = 0
072
RX Errors = 0
073
074
-------CAN MESSAGE RX ADRRESSED TO ME-------
075
ID CE0D0401
076
type_msg - Неизвестное сообщение
077
node_addr - node_13_WC_waterleak
078
Rem_addr - node_4_Net_center_Due1
079
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
080
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
081
082
--------------------------------------------
083
084
NO ErrorFlags
085
086
TX Errors = 0
087
RX Errors = 12
088
Error Initializing MCP2515...
089
090
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
091
092
NO ErrorFlags
093
094
TX Errors = 7
095
RX Errors = 0
096
Init1
097
NO ErrorFlags
098
099
TX Errors = 0
100
RX Errors = 0
101
102
-------CAN MESSAGE RX ADRRESSED TO ME-------
103
ID CE0D0401
104
type_msg - Неизвестное сообщение
105
node_addr - node_13_WC_waterleak
106
Rem_addr - node_4_Net_center_Due1
107
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
108
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
109
110
--------------------------------------------
111
112
NO ErrorFlags
113
114
TX Errors = 0
115
RX Errors = 0
116
Error Initializing MCP2515...
117
118
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
119
120
NO ErrorFlags
121
122
TX Errors = 0
123
RX Errors = 0
124
Init1
125
NO ErrorFlags
126
127
TX Errors = 0
128
RX Errors = 0
129
130
-------CAN MESSAGE RX ADRRESSED TO ME-------
131
ID CE0D0401
132
type_msg - Неизвестное сообщение
133
node_addr - node_13_WC_waterleak
134
Rem_addr - node_4_Net_center_Due1
135
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
136
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
137
138
--------------------------------------------
139
140
NO ErrorFlags
141
142
TX Errors = 0
143
RX Errors = 12
144
Error Initializing MCP2515...
145
146
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
147
148
NO ErrorFlags
149
150
TX Errors = 7
151
RX Errors = 0
152
Init1
153
NO ErrorFlags
154
155
TX Errors = 0
156
RX Errors = 0
157
158
-------CAN MESSAGE RX ADRRESSED TO ME-------
159
ID CE0D0401
160
type_msg - Неизвестное сообщение
161
node_addr - node_13_WC_waterleak
162
Rem_addr - node_4_Net_center_Due1
163
Dev_type - ЛАМПА НА ПОТОЛКЕ БУЛЕВАЯ
164
DATA FRAME NOT DATA, BECAUSE REMOTE FRAME
165
166
--------------------------------------------
Вот глянь весь лог
https://yadi.sk/d/ozOcbX7B3V5hYy
log_18.05.18.txt
лог не скачивается. почему опять всё время инит происходит? Сделай отладку для мастера таким образом
1
#define debug //отладка в сериал_монитор. Закоментировать строку после отладки
2
3
#ifdef debug
4
#define debugStatus //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
5
bool
ID_Print = 0 ;
//флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES
6
bool
statusprint = 0 ;
//флаг распечатки статусов в монитор.
7
#include "debug.h"
8
#endif
Смотри полный лог, файл просто долго синхронизировался.
Инит происходит т.к постоянно получаем то что попадает в default
А вот сейчас ресетнулось
001
NODES CAN COMMUNICATION:
002
node_5_Net_center_Due2 OK
003
node_6_Hallway_net_center OK
004
node_7_Hallway_main OK
005
node_8_Hallway_light OK
006
node_9_Kitchen_net_center OK
007
node_10_Kitchen_main OK
008
node_11_Kitchen_light OK
009
node_12_WC_main OK
010
node_13_WC_waterleak OK
011
node_14_Bathroom_main OK
012
node_15_Boxroom_main OK
013
node_18_Loggia_recuperator OK
014
node_19_Livingroom_main OK
015
node_20_Bedroom_main OK
016
node_21_Cabinet_main OK
017
018
00:00:38:30
019
NO ErrorFlags
020
021
TX Errors = 0
022
RX Errors = 0
023
024
NODES CAN COMMUNICATION:
025
node_5_Net_center_Due2 OK
026
node_6_Hallway_net_center OK
027
node_7_Hallway_main OK
028
node_8_Hallway_light OK
029
node_9_Kitchen_net_center OK
030
node_10_Kitchen_main OK
031
node_11_Kitchen_light OK
032
node_12_WC_main OK
033
node_13_WC_waterleak OK
034
node_14_Bathroom_main OK
035
node_15_Boxroom_main OK
036
node_18_Loggia_recuperator OK
037
node_19_Livingroom_main OK
038
node_20_Bedroom_main OK
039
node_21_Cabinet_main OK
040
Default msg_id !=0 && >12
041
-------CAN MESSAGE RX ADRRESSED TO ME-------
042
ID 8E090400
043
type_msg - Неизвестное сообщение
044
node_addr - node_9_Kitchen_net_center
045
Rem_addr - node_4_Net_center_Due1
046
Dev_type - NULL DEVICE
047
DATA FRAME 00 00 00 00 00 00 00 00
048
--------------------------------------------
049
050
RX or TX errors >= 96
051
RX errors >= 96
052
TX errors >= 96
053
RX errors >= 128. Mode ErrorPassive
is
ON
054
TX errors >= 128. Mode ErrorPassive
is
ON
055
TX errors == 255. Mode BusOff
is
ON
056
Переполнен буфер приёма RX0
057
Переполнен буфер приёма RX1
058
059
060
TX Errors = 255
061
RX Errors = 255
062
063
064
MCP2515 Initialized Successfully! after REINIT
065
066
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
067
068
NO ErrorFlags
069
070
TX Errors = 0
071
RX Errors = 255
072
073
Init!
074
075
RX or TX errors >= 96
076
RX errors >= 96
077
TX errors >= 96
078
RX errors >= 128. Mode ErrorPassive
is
ON
079
TX errors >= 128. Mode ErrorPassive
is
ON
080
TX errors == 255. Mode BusOff
is
ON
081
Переполнен буфер приёма RX0
082
Переполнен буфер приёма RX1
083
084
085
TX Errors = 255
086
RX Errors = 255
087
088
089
00:00:39:00
090
NO ErrorFlags
091
092
TX Errors = 0
093
RX Errors = 0
094
095
NODES CAN COMMUNICATION:
096
node_5_Net_center_Due2 OK
097
node_6_Hallway_net_center OK
098
node_7_Hallway_main OK
099
node_8_Hallway_light OK
100
node_9_Kitchen_net_center OK
101
node_10_Kitchen_main OK
102
node_11_Kitchen_light OK
103
node_12_WC_main OK
104
node_13_WC_waterleak OK
105
node_14_Bathroom_main OK
106
node_15_Boxroom_main OK
107
node_18_Loggia_recuperator OK
108
node_19_Livingroom_main OK
109
node_20_Bedroom_main OK
110
node_21_Cabinet_main OK
111
112
00:00:39:30
113
NO ErrorFlags
114
115
TX Errors = 0
116
RX Errors = 0
117
118
NODES CAN COMMUNICATION:
119
node_5_Net_center_Due2 OK
120
node_6_Hallway_net_center OK
121
node_7_Hallway_main OK
122
node_8_Hallway_light OK
123
node_9_Kitchen_net_center OK
124
node_10_Kitchen_main OK
125
node_11_Kitchen_light OK
126
node_12_WC_main OK
127
node_13_WC_waterleak OK
128
node_14_Bathroom_main OK
129
node_15_Boxroom_main OK
130
node_18_Loggia_recuperator OK
131
node_19_Livingroom_main OK
132
node_20_Bedroom_main OK
133
node_21_Cabinet_main OK
Ну вот откуда эти левые ID 8E090400
ага неизвестный тип сообщения , да ещё фрейм ремоут докучи О_О. Эта шина над нами издевается, ноль убрали - дак это стало просачиваться. При том что MCP2515 виснет к тому же при получении такого сообщения. И видимо на пине INT висит сигнал что сообщение принято, и он одно и тоже глюкавое б/у шное сообщение показывает.
отключи узел 13, может он козлит. По одному отключай и смотри. Судя по логу, вообще беда. еще и ардуина докучи перезагружалась , смотри время сбрасывалось вначале лога на 4 мин.
отключи узел 13, может он козлит. По одному отключай и смотри. Судя по логу, вообще беда. еще и ардуина докучи перезагружалась , смотри время сбрасывалось вначале лога на 4 мин.
Ну а сейчас от 9 было
041
-------CAN MESSAGE RX ADRRESSED TO ME-------
042
ID 8E090400
043
type_msg - Неизвестное сообщение
044
node_addr - node_9_Kitchen_net_center
045
Rem_addr - node_4_Net_center_Due1
046
Dev_type - NULL DEVICE
047
DATA FRAME 00 00 00 00 00 00 00 00
048
--------------------------------------------
Важно же не только из-за чего но и что делать если. Мало того CAN сам должкн отрабатывать
Я то насчет КСВ с КБВ и четверть волонового трансформатора имел в виду. Ну и чем длиннее волна тем сложнее согласовывать линии. Снижение скорости снижаетчастоту но и увеличивает длинну волны.
Я конечно понимаю что тут манипуляция а не модуляция, так как физ линия, но все же.
Ну и проблемы то у нас другого характера, ошибки на CAN есть но они очень эпизодические. Явно если бы линиям было недостаточно согласования она бы часами не стояла нормально.
Вот новый сбой но ресетнулось нормально
01
00:01:31:30
02
NO ErrorFlags
03
04
TX Errors = 0
05
RX Errors = 0
06
07
NODES CAN COMMUNICATION:
08
node_5_Net_center_Due2 OK
09
node_6_Hallway_net_center OK
10
node_7_Hallway_main OK
11
node_8_Hallway_light OK
12
node_9_Kitchen_net_center OK
13
node_10_Kitchen_main OK
14
node_11_Kitchen_light OK
15
node_12_WC_main OK
16
node_13_WC_waterleak OK
17
node_14_Bathroom_main OK
18
node_15_Boxroom_main OK
19
node_18_Loggia_recuperator OK
20
node_19_Livingroom_main OK
21
node_20_Bedroom_main OK
22
node_21_Cabinet_main OK
23
Default msg_id !=0 && >12
24
-------CAN MESSAGE RX ADRRESSED TO ME-------
25
ID 8E0D0400
26
type_msg - Неизвестное сообщение
27
node_addr - node_13_WC_waterleak
28
Rem_addr - node_4_Net_center_Due1
29
Dev_type - NULL DEVICE
30
DATA FRAME 61 80 00 00 00 00 00 00
31
--------------------------------------------
32
33
RX or TX errors >= 96
34
RX errors >= 96
35
TX errors >= 96
36
RX errors >= 128. Mode ErrorPassive
is
ON
37
TX errors >= 128. Mode ErrorPassive
is
ON
38
TX errors == 255. Mode BusOff
is
ON
39
Переполнен буфер приёма RX0
40
Переполнен буфер приёма RX1
41
42
43
TX Errors = 255
44
RX Errors = 255
45
46
47
MCP2515 Initialized Successfully! after REINIT
48
49
Мой адрес в сети CAN: node_4_Net_center_Due1 MASTER!
50
51
NO ErrorFlags
52
53
TX Errors = 0
54
RX Errors = 255
55
56
Init!
57
58
RX or TX errors >= 96
59
RX errors >= 96
60
TX errors >= 96
61
RX errors >= 128. Mode ErrorPassive
is
ON
62
TX errors >= 128. Mode ErrorPassive
is
ON
63
TX errors == 255. Mode BusOff
is
ON
64
Переполнен буфер приёма RX0
65
Переполнен буфер приёма RX1
66
67
68
TX Errors = 255
69
RX Errors = 255
70
71
72
00:01:32:00
73
NO ErrorFlags
74
75
TX Errors = 0
76
RX Errors = 0
77
78
NODES CAN COMMUNICATION:
79
node_5_Net_center_Due2 OK
80
node_6_Hallway_net_center OK
81
node_7_Hallway_main OK
82
node_8_Hallway_light OK
83
node_9_Kitchen_net_center OK
84
node_10_Kitchen_main OK
85
node_11_Kitchen_light OK
86
node_12_WC_main OK
87
node_13_WC_waterleak OK
88
node_14_Bathroom_main OK
89
node_15_Boxroom_main OK
90
node_18_Loggia_recuperator OK
91
node_19_Livingroom_main OK
92
node_20_Bedroom_main OK
93
node_21_Cabinet_main OK
Причем заметь опять ID 8E0D0400
Это не глюк это системная ошибка, причем приглядись к датафрейму 61 80 00 00 00 00 00 00.
говорю отключай этот 13 узел, он несчастливый)
А вообще регистры неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил. Домовёнок у тебя к кану подключился. 21 век как никак.
И самое главное как оно просочилось через фильтр? О_О
Фильтр стоит что direction только с 1 должен проходить. можешь проверить на простом скетче. Это не поддается объяснению.
Вот уже 3 часа работает с 2мя сбоями и самовосстановлением.
Просбочка есть встрой код часов, стобы выдавалось не только милс время но и от часов. Или я свой набросаю, встрой потом в скетч.
У меня трое часов загашнике нашлось
DS1302
DS1307
DS3231
Если у тебя нет каких то из них я тогда свой код под DS3231 напишу.
А вообще регистры неадекватно показывает. То все биты сразу 1. То все 0. Ошибки то 255, то 0 - бред. Хотя проверял на регистре режима работы (нормал, лупбэк, листен онли, слип) - нормально показывает, значит правильно запрашиваю. и раз ID начинается с 8 значит direction равно 0. А я везде сделал его 1. То бишь бабайка этот фрейм отправил. Домовёнок у тебя к кану подключился. 21 век как никак.
Это из твоего кода ф-я RX case REQUEST_SEND
1
TX(0,REQUEST_ANSWER, dev_addr, dev_TYPE, EXTENDED, DATA_CANFRAME, DlC, DataP);
Первый 0 это dir 0
Ну и вообще может уйти от 11bit ID и произвольных DLC
Везде 29 и 8?
dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу
короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз.
001
#include <mcp_can.h>
002
#include <SPI.h>
003
004
// Выбираем аппаратную часть узла
005
006
#define ARD_UNO
007
//#define ARD_MEGA
008
//#define ARD_DUE
009
010
011
#ifdef ARD_UNO
012
#define can CAN0
013
MCP_CAN can(10);
014
#endif
015
#ifdef ARD_MEGA
016
#define can CAN0
017
MCP_CAN can(53);
018
#endif
019
#ifdef ARD_DUE
020
#define can CAN3
021
MCP_CAN can(52);
022
#endif
023
024
typedef
enum
Node_addr_enum
025
{
026
broadcast,
//0
027
node_1_Net_center_PC,
//1
028
node_2_Net_center_oraPi1,
//2
029
node_3_Net_center_oraPi2,
//3
030
node_4_Net_center_Due1,
//4
031
node_5_Net_center_Due2,
//5
032
node_6_Hallway_net_center,
//6
033
node_7_Hallway_main,
//7
034
node_8_Hallway_light,
//8
035
node_9_Kitchen_net_center,
//9
036
node_10_Kitchen_main,
//10
037
node_11_Kitchen_light,
//11
038
node_12_WC_main,
//12
039
node_13_WC_waterleak,
//13
040
node_14_Bathroom_main,
//14
041
node_15_Boxroom_main,
//15
042
node_16_Balcony_meteo,
//16
043
node_17_Loggia_main,
//17
044
node_18_Loggia_recuperator,
//18
045
node_19_Livingroom_main,
//19
046
node_20_Bedroom_main,
//20
047
node_21_Cabinet_main,
//21
048
SIZE_Node_addr_ENUM
//22 size
049
}Node_addr_enum;
050
051
const
byte
NODS_NUMBER = SIZE_Node_addr_ENUM;
052
053
054
055
// Назначаем адрес данного узла
056
057
//const byte node_address = node_1_Net_center_PC; //1
058
//const byte node_address = node_2_Net_center_oraPi1; //2
059
//const byte node_address = node_3_Net_center_oraPi2; //3
060
//const byte node_address = node_4_Net_center_Due1; //4
061
//const byte node_address = node_5_Net_center_Due2; //5
062
//const byte node_address = node_6_Hallway_net_center; //6
063
const
byte
node_address = node_7_Hallway_main;
//7
064
//const byte node_address = node_8_Hallway_light; //8
065
//const byte node_address = node_9_Kitchen_net_center //9
066
//const byte node_address = node_10_Kitchen_main; //10
067
//const byte node_address = node_11_Kitchen_light; //11
068
//const byte node_address = node_12_WC_main; //12
069
//const byte node_address = node_13_WC_waterleak; //13
070
//const byte node_address = node_14_Bathroom_main; //14
071
//const byte node_address = node_15_Boxroom_main; //15
072
//const byte node_address = node_16_Balcony_meteo; //16
073
//const byte node_address = node_17_Loggia_main; //17
074
//const byte node_address = node_18_Loggia_recuperator; //18
075
//const byte node_address = node_19_Livingroom_main; //19
076
//const byte node_address = node_20_Bedroom_main; //20
077
//const byte node_address = node_21_Cabinet_main; //21
078
079
080
081
// Выбираем узлы подключенные к CAN шине
082
083
const
bool
NodeCANpresence[22] =
084
{
085
0,
// broadcast, //0
086
0,
// node_1_Net_center_PC, //1
087
0,
// node_2_Net_center_oraPi1, //2
088
0,
// node_3_Net_center_oraPi2, //3
089
1,
// node_4_Net_center_Due1, //4
090
0,
// node_5_Net_center_Due2, //5
091
0,
// node_6_Hallway_net_center, //6
092
1,
// node_7_Hallway_main, //7
093
1,
// node_8_Hallway_light, //8
094
0,
// node_9_Kitchen_net_center, //9
095
1,
// node_10_Kitchen_main, //10
096
0,
// node_11_Kitchen_light, //11
097
0,
// node_12_WC_main, //12
098
0,
// node_13_WC_waterleak, //13
099
0,
// node_14_Bathroom_main, //14
100
0,
// node_15_Boxroom_main, //15
101
0,
// node_16_Balcony_meteo, //16
102
0,
// node_17_Loggia_main, //17
103
0,
// node_18_Loggia_recuperator, //18
104
0,
// node_19_Livingroom_main, //19
105
0,
// node_20_Bedroom_main, //20
106
0,
// node_21_Cabinet_main, //21
107
};
108
109
110
// Выбираем смысловую нагрузку узла
111
112
113
//#define type_node_master
114
//#define type_node_slave
115
#define type_node_mk
116
117
118
119
long
unsigned
int
rxId;
120
unsigned
char
len = 0;
121
unsigned
char
rxBuf[8];
122
123
124
#define CAN0_INT 2 // Set INT to pin 2
125
126
byte
StatusMK[22] = {0};
127
128
129
unsigned
long
prevtimeStatus = 0;
130
bool
TimerStatus = 0;
131
unsigned
long
prevPrintStatus = 0;
132
133
void
setup
()
134
{
135
Serial
.begin(115200);
136
137
138
if
(can.begin(MCP_STDEXT, CAN_125KBPS, MCP_8MHZ) == CAN_OK)
139
Serial
.println(
"MCP2515 Initialized Successfully!"
);
140
else
141
Serial
.println(
"Error Initializing MCP2515..."
);
142
#ifdef type_node_master
143
can.init_Mask(0,0,0x07000000);
//маска на самый левый разряд ID - для мастера
144
can.init_Filt(0,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
145
#else
146
can.init_Mask(0,0,0x07FF0000);
// маска на весь ID - для узла
147
can.init_Filt(0,0,0x06660000);
// только ID 666 проходят - для узла
148
#endif
149
can.setMode(MCP_NORMAL);
150
151
pinMode(CAN0_INT, INPUT);
152
153
Serial
.println(
"MCP2515 Library Receive Example..."
);
154
}
155
156
void
loop
()
157
{
158
if
(!digitalRead(CAN0_INT))
159
{
160
can.readMsgBuf(&rxId, &len, rxBuf);
161
#if defined (type_node_slave) or defined (type_node_mk)
162
if
(rxId == 0x666) {prevtimeStatus = millis(); TimerStatus = 1;
Serial
.println(F(
"Receive StatusMaster"
));}
163
#endif
164
165
#ifdef type_node_master
166
if
(rxId >0 && rxId<22) StatusMK[rxId] = 0;
167
168
#endif
169
}
170
171
#if defined (type_node_slave) or defined (type_node_mk)
172
if
(TimerStatus && millis() - prevtimeStatus > node_address*50) {
173
byte
data[8]= {255,255,255,255,255,255,255,255};
174
byte
sndStat = can.sendMsgBuf(node_address, 0, 8, data);
175
if
(sndStat == CAN_OK){
Serial
.println(F(
"Send my Status successfully!"
));}
176
else
{
Serial
.println(F(
"Error Send my Status!!! "
));}
177
TimerStatus = 0;}
178
#endif
179
180
181
182
183
184
185
#ifdef type_node_master
186
if
(millis() -prevtimeStatus > 2000) {
187
for
(
int
i = 0; i<22; i++) StatusMK[i]++;
188
189
byte
data[8]= {0,0,0,0,0,0,0,0};
190
can.sendMsgBuf(0x666, 0, 8, data);
191
prevtimeStatus = millis();}
192
193
194
195
if
(millis() - prevPrintStatus > 15000) {
196
197
Serial
.println();
Serial
.println(F(
"NODE STATUS"
));
198
for
(
int
i = 1; i<22; i++) {
if
(i!=4 && NodeCANpresence[i]) {
Serial
.print (i);
if
(StatusMK[i]<=4)
Serial
.println (F(
" OK"
));
else
Serial
.println (F(
" FAIL"
)); }}
199
Serial
.println();
200
prevPrintStatus = millis();
201
}
202
203
#endif
204
}
dlc 8 не везде. В REQUEST_SEND я вообщето direction исправил в 11 версии ещё вроде как . Ты хоть мои скетчи то заливаешь или гибриды опять делаешь? А то наворотим щас тут. Я буду думать что исправил, а у тебя в итоге не исправлено. А потом думай, почему не работает. Часы 3231 есть. код выложу
Заливаю твои, но подкручиваю дебаг, сам видишь как выводит, меня это отправлено в CAN достает в логе.
Вроде залита 11 с измененной ф-й вывода ошибок из 12. Я специально спросил, ты только ее изменил.
Я кстати про это и говорил что
1. Вставляй в основной файл что то вроде //ver 12
2. По времени подготовить код и залить его во все контроллеры это 2-3 часа. Поэтому без серьезных изменения я только в DUE меняю код. И кстати МК не вснут
короче если опять шина закозлит заливай опять упрощённый скетч - я его немного поправил. Он на коротких ID. мастер шлёт статус ID 666. Узлы отвечают 0XX, где ХХ - адрес узла. Посмотрим как себя поведёт. Заметь скорость поставил 125 кбит. 500 больше не ставь нигде, нафиг такая большая не нужна. Тем более расстояния довольно большие. 125 в самый раз.
Ок завтра поставлю. Пусть 12 простоит ночь. Уже 4 часа без малого стоит.
код часов. Не проверял, нету под рукой DS3231. библиотека
01
#include <RTC.h>
02
#include <Wire.h>
03
04
RTC time;
05
byte
ss;
//секунда
06
byte
mm;
//минута
07
byte
hh;
//час
08
byte
dd;
//день месяца
09
byte
wd;
//день недели
10
byte
mn;
//месяц
11
12
void
setup
() {
13
time.begin(RTC_DS3231);
// RST, CLK, DAT инициализация модуля часов
14
}
15
16
void
loop
() {
17
DS_3231 ();
18
19
}
20
21
void
DS_3231 () {
22
time.gettime();
23
ss = time.seconds;
24
mm = time.minutes;
25
hh = time.Hours;
26
dd = time.day;
27
wd = time.weekday;
28
mn = time.month;
29
}
в либе смотри пример, как часы настроить и вообще почитай коменты
Опять сбойнуло https://yadi.sk/d/ozOcbX7B3V5hYy
log_18.05.18-2.txt
Опять сбойнуло https://yadi.sk/d/ozOcbX7B3V5hYy
log_18.05.18-2.txt
Да и смотри какое кино реконект по com порту ресетит MCP нормально.
Заливаю твои, но подкручиваю дебаг, сам видишь как выводит, меня это отправлено в CAN достает в логе.
Я же тебе говорил как дебаг настроить
нужно наверное убрать в 5 местах обращения к регистрам - коряво всё это работает почему то
ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять.
но вот это конечно не гуд, из-за этого и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.
Я же тебе говорил как дебаг настроить
ладно, просто в шапке показывается же название файла. Но ок, мне не сложно это добавлять.
но вот это конечно не гуд, из-за этого и могут быть проблемы. Где то скетч старый остался, а мы тут гадаем, че за шляпа творится. И убери пока DUE - глючная она. Потом вернёшь когда всё наладится.
Посмотри файл лога, как на DUE добиться такого вывода настройками?
Я беру твой пакет, создаю под каждый папку с именем узла, переименовываю основной файл, открываю, настраиваю. На выходе если нет указателя что за версия то хрен поймешь что стоит. Так что лучше даже в лог пусть выводит вместе с именем узла.
Ну я условно сказал. Везде стоит 11 версия, так как лог я снимаю только с DUE то протсо вставил ф-ю снятия ошибок из регистров.
DUE завтра поменяю. Но я думаю не в DUE дело. Каждая плата свои либы имеет и может конфликтовать.
ну вот что это в отладке ?
1
Default msg_id !=0 && >12
2
----------CAN BROADCAST MESSAGE RX----------
3
ID 20
4
type_msg - NULL_C
5
node_addr - ШИРОКОВЕЩАТЕЛЬНО
6
Rem_addr - ШИРОКОВЕЩАТЕЛЬНО
7
Dev_type - Неизвестное устройство
8
DATA FRAME
9
--------------------------------------------
какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже.
У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже.
ну вот что это в отладке ?
1
Default msg_id !=0 && >12
2
----------CAN BROADCAST MESSAGE RX----------
3
ID 20
4
type_msg - NULL_C
5
node_addr - ШИРОКОВЕЩАТЕЛЬНО
6
Rem_addr - ШИРОКОВЕЩАТЕЛЬНО
7
Dev_type - Неизвестное устройство
8
DATA FRAME
9
--------------------------------------------
какое то Default msg_id !=0 && >12 вспыло. зачем ты ID_Print в труе ставишь. Нафиг эти рамки - по ID уже и так на глаз всё определяем, примелькаклось уже.
У меня кстати при удачной перинициализации вообще не так в отадке всё было . см видос. Че то у тебя не так как у меня в скетче, похоже.
1
#define debug //отладка в сериал_монитор. Закоментировать строку после отладки
2
3
#ifdef debug
4
#define debugStatus //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
5
bool
ID_Print = 0 ;
//флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES
6
bool
statusprint = 0 ;
//флаг распечатки статусов в монитор.
Эээ я как бы твой код из другого места (чуть выше) взял и ткнул в нужное мне место ( RX default)
У меня отладка Ночью идет и места на твой развернутый как в видео дебаг в консоле нет, она начнет затираться.
Я вывожу раз в 60 сек сост узлов и при аварии состояние авариии. Смотреть чем обмениваются в другое время узлы нет смысла.
я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца. Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось.
я не знаю в чём у тебя там проблема, но на узле аж на 4 часа хватает такой записи в мониторе порта. Этого хватит, чтобы косяки засечь. Не говоря уже про мастер, где данные два раза в минуту пишутся. Там весь лог записался от начала до конца. Вот 5-часовой тест мастера и одного узла №10. Глюки отсутсвуют полностью. В конце, для прикола, сделал с монитора порта переинициализацию MCP2515. Если бы были косяки, по такой отладке у узла можно определить что и когда он отсылал и получил. Время у него посмотреть, не простаивало ли. Сравнить что в это время на мастере творилось.
Поставил 12 версию на мастер без
1
// SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
2
// digitalWrite(csPIN, LOW);
3
// SPI.transfer(0xC0);
4
// digitalWrite(csPIN, HIGH);
5
// SPI.endTransaction();
6
// delay (100);
+
1
#define debug //отладка в сериал_монитор. Закоментировать строку после отладки
2
3
#ifdef debug
4
#define debugStatus //отладка в сериал_монитор - таблица статусов узлов CAN сети (для МАСТЕРА) Закоментировать строку после отладки
5
bool
ID_Print = 0 ;
//флаг распечатки CAN FRAMES в монитор. 0 - будут, только адресованные на данный узел. 1 - все CANFRAMES
6
bool
statusprint = 0 ;
//флаг распечатки статусов в монитор.
Так нужно?
Инициализация у меня тоже работает.
Но вот когда глюк серьезный то сеть летит. Лог сам видел.
Так 12 версия не работает.
Постиавил 11 с теми же настройками и скопировал тольуо ф-ю с ошибками MCP
что в 12 не работает?