Как проверить, шина CAN свободна или нет

8

Я прочитал много материала об арбитраже по шине CAN, но он не ответил на мои вопросы.

Если один узел уже передает данные по шине и между другими узлами хочет инициировать передачу данных, как этот «другой узел» узнает, что шина занята?

Все документы (которые я читаю) принимают условие, что оба узла начинают передачу одновременно, и тогда один с первым доминирующим битом получит шину, но никто не объяснил условие, которое я хочу знать.

Swanand
источник
1
Суонанд, ты можешь получить лучшие ответы на свои вопросы, если подождешь немного дольше, чтобы принять ответ. Это международное сообщество, и некоторые эксперты могут не ответить сразу.
W5VO
@ W5VO Я запомню это в следующий раз! Спасибо за предложение! :)
Swanand

Ответы:

10

Короткий ответ заключается в том, что узел должен контролировать линии CAN в течение определенного времени, пока он не попытается передать. Таким образом, если другой узел передает, он должен хранить молчание, пока другой узел не завершит работу.

Шина CAN основана на дифференциальной сигнализации. Две линии, CAN-High (CAN +) и CAN-Low (CAN-), имеют одинаковый потенциал, когда шина свободна. Чтобы отправить биты, передатчик CAN помещает дифференциальное напряжение на линии около 2 вольт.

Передатчик CAN сначала видит, свободна ли шина, и начинает ли она передавать. Арбитраж работает так, что передатчик контролирует шину во время передачи. Передача осуществляется, как указано выше, либо поддерживая две линии с одинаковым потенциалом или с дифференциальным потенциалом. Таким образом, если передатчик передает немного, сохраняя линии с одинаковым потенциалом (sic), но он видит, что две передающие линии имеют дифференциальный потенциал, это означает, что какой-то другой узел передает, и первый передатчик проиграл арбитраж. Затем он должен прекратить передачу.

Когда узел впервые начинает передачу, передаваемые биты остаются одинаковыми до тех пор, пока адрес передающего узла, очевидно, не будет разным. Если два узла начинают передачу вместе, они будут передавать синхронно, пока не будет достигнута часть адреса. Когда адрес отличается, узел заметит потенциальную разницу в строках, даже если он не помещает его в линии. Тогда он знает, что потерял и должен попытаться снова. Победивший узел продолжает передачу, не зная, что какой-то другой узел тоже пытался. Конечно, эта логика распространяется и на более чем два узла.

Надеюсь, это поможет.

доктор
источник
1
Хороший ответ! Если я правильно помню, отправка «0» доминирует над «1», что приводит к арбитражу с наименьшим адресом. Отличительной особенностью этого является то, что если проигрывающий узел останавливается, когда он должен остановиться, на шине не будет никакого повреждения данных.
W5VO
Отличный ответ !! Буду очень признателен, если вы можете просто прояснить это: допустим, идентификаторы равны «1011001» и «1000110», когда третий бит достигнут, первый передатчик отправляет «1», а второй отправляет «0»; так, согласно протоколу CAN, доминирующий бит равен 0, и он перезаписывает рецессивный бит. Так что теперь автобус держит «0»; первый модуль обнаружит это и остановит передачу, а второй продолжит передачу. Мое понимание правильно ??
Февин Санни
@ FebinSunny Да ... То, что вы сказали, правильно!
Swanand
1
Этот ответ не является ни «хорошим», ни «отличным». На самом деле, это совершенно неправильно . Во-первых, передатчик не «держит две линии с одинаковым потенциалом» для отправки рецессивного бита. Он просто прекращает разрыв линий, а нагрузочные резисторы уравнивают потенциал. Во-вторых, адрес передающего узла не является частью поля арбитража в спецификации CAN, хотя некоторые протоколы более высокого уровня на основе CAN действительно используют его как часть идентификатора сообщения. В-третьих, ни одно из этого не имеет ничего общего с обнаружением простаивающего автобуса
Maple
7

Я знаю два способа решить эту проблему:

Во-первых, контроллер CAN всегда будет контролировать шину; когда он обнаруживает сообщение на шине, он начинает процесс приема. Теперь, когда он находится в состоянии приема, он знает, что шина используется, когда запрашивается передача.

Во-вторых, путем вставки битов приемопередатчик CAN не будет иметь один и тот же бит в течение более чем пяти циклов (если только не обнаружена ошибка шины, в этом случае вы увидите до 12 доминирующих битов подряд). Исключением является случай, когда по шине ничего не передается, когда пассивный бит всегда читается. Контроллер, который только запускается, может прослушивать шину в течение пяти циклов, прежде чем объявить «вероятно свободным».

Я не гарантирую, что это реальные процессы, но, исходя из моих (ограниченных) знаний о CAN, они будут работать.

CoderTao
источник
Мне понравился второй трюк! Это чисто логично и круто!
Суонанд
2
Вы упускаете главную суть шинного арбитража - что самое первое в CAN-пакете - это адрес.
W5VO
1
Это был не его вопрос; вопрос был в том, как контроллер определяет, есть ли активность в шине
CoderTao
@ W5VO Кадры CAN не имеют адреса, если какой-либо протокол более высокого уровня не делает его частью идентификатора сообщения.
Клен
@CoderTao, хотя битовая вставка - это не то, как контроллер обнаруживает незанятую шину, вы правы в том, что она играет важную роль в этом процессе, убедившись, что передаваемые данные не могут быть ошибочно приняты за конец кадра
Maple
3

Как говорит CoderTao - контроллер CAN постоянно контролирует шину, поэтому он знает, когда передача уже выполняется. Таким образом, единственное время, когда может произойти коллизия, - это когда оба узла начинают передавать «одновременно» - в течение битового времени друг друга (+ небольшое количество дополнительного времени для распространения шины). Следовательно, это единственные случаи, которые вы нашли в документах :)

Мартин Томпсон
источник
2

Адрес узла определяет приоритет, более низкие адреса - высокий приоритет. Передача начинается с узла, передающего свой адрес. В то же время он передает, он слушает. Допустим, узел три и два передают одновременно. В качестве последнего бита адреса узел три транслирует 1, а узел два транслирует 0. Из-за 0 линия данных сбрасывается в состояние 0. Узел три видит, что вместо 1, который он передает, линия равна 0 и прекращает передачу.

CAN был впервые использован в легковых и грузовых автомобилях. Некоторые датчики должны иметь гораздо более высокий приоритет, чем другие. Например, торможение противоскольжения должно иметь более высокий приоритет, чем жидкость для омывания с низким ветровым стеклом.

Джим С
источник
Я уже знаю это ... Мой вопрос был не об арбитраже при старте ... Он был примерно между передачами ...
Swanand
1

В спецификации CAN есть четыре ключевых элемента, которые позволяют контроллерам CAN определять состояние незанятой шины:

  • Сигнализация проводного И делает возможным обнаружение доминирующего бита, передаваемого одним из узлов, всеми другими узлами, передающими рецессивный бит одновременно. Таким образом, если какой-либо узел, передающий рецессивный бит, видит доминирующее состояние шины, он знает, что шина занята .

  • Битовая вставка гарантирует, что не более 5 одинаковых последовательных битов. Сама по себе битовая начинка используется для поддержания синхронизации. Однако побочным эффектом этого является то, что не более 5 последовательных рецессивных битов может происходить в пределах битов кадра вплоть до ограничителя CRC.

  • Конец кадра - это серия из 7 рецессивных битов в конце кадра. Они не переполнены битами, поэтому контроллеры могут легко их обнаружить. Обратите внимание, что в течение этого времени шина еще не простаивает , так как EOF считается частью кадра.

  • Межкадровое пространство - это серия из 3 рецессивных битов прерывания между кадрами, за которыми следует состояние ожидания шины. Ни одному узлу не разрешается инициировать передачу во время перерыва, если они не хотят отправлять кадры с ошибками или перегрузкой . Кроме того, узел, который передал последний кадр, также должен отправить 8 рецессивных битов приостановленной передачи после перерыва перед началом другой передачи. Это последнее требование позволяет другим узлам начинать отправку ожидающих сообщений, поэтому ни один узел не может "перегружать шину" бесконечно.

Из всего вышесказанного, вот как узлы обнаруживают состояние незанятой шины:

  • Принимающие узлы просто ждут 10 последовательных рецессивных битов , которые включают EOF и перерыв. По истечении этого времени они считают, что автобус простаивает, и могут попытаться начать передачу самостоятельно.

  • Передающий узел отправляет 11 последовательных рецессивных битов после EOF последнего кадра, который он передал. Если ни один другой узел не инициирует передачу в течение этого времени, он считает, что шина свободна, и может попытаться начать другую передачу. Если доминирующий бит обнаружен в течение этого времени, узел становится получателем.

Вышеуказанная информация плюс дополнительная информация о синхронизации битов может быть найдена в спецификации CAN, разработанной BOSCH.

кленовый
источник
Есть шина с несколькими активными узлами. Новый узел подключен, когда не было связи. Как этот новый узел узнает, что шина свободна? 10 последовательных рецессивных битов передаются, когда этого нового узла не было в изображении.
Суонанд
«Сигнализация проводной И» означает, что рецессивные биты не «передаются» как таковые, это означает, что передающий узел не генерирует активно доминирующий потенциал. Но они получены , то есть принимающие узлы дискретизируют шину с битовыми интервалами, и они видят рецессивный бит на линии. Таким образом, если этот новый узел выполняет выборку шины 10 раз и видит рецессивный бит каждый раз, когда он считает, что шина простаивает.
Клен
Нет никакой разницы между «10 последовательными рецессивными битами, передаваемыми, когда этот новый узел не был в изображении», и состоянием простоя шины после этого. Если связь отсутствует, любое чтение шины вернет рецессивный бит («1»). Поэтому не имеет значения, когда вы начинаете семплирование, во время или после последнего доминирующего бита. Пока приемник видит 10 бит, он может начать передачу. Кстати, никто не отправляет 10 бит. Последний передатчик «отправляет» 11 рецессивных битов, 3 перерыва + 8 приостановок. Если ожидающий узел начинает передачу после 10 числа, последний передатчик теряет арбитраж и передает шину новому узлу
Maple
0

Определенный узел инициирует свою передачу только после периода INTERMISSION (эта длительность также называется длительностью SUSPENDED, в этот период 3 рецессивных бита передаются на шину после передачи кадра DATA / REMOTE на шину. Это указывает на то, что BUS является в состоянии IDLE), потому что в течение этого периода ни один из узлов не инициирует Передачу. После того, как шина находится в состоянии ожидания, узел, который хочет шину для передачи, переходит в ARBITRATION.

После передачи межкадрового пространства на шину узлы, присутствующие в сети CAN, попытаются инициировать передачу. Следовательно, конкретный узел знает, занята шина или нет.

Нагендра Пулапарти
источник
Что если это будет первая передача в автобусе? В этом случае не будет никакого «периода антракта». За подробностями обращайтесь к ответу @ Doc.
Swanand