Я прочитал много материала об арбитраже по шине CAN, но он не ответил на мои вопросы.
Если один узел уже передает данные по шине и между другими узлами хочет инициировать передачу данных, как этот «другой узел» узнает, что шина занята?
Все документы (которые я читаю) принимают условие, что оба узла начинают передачу одновременно, и тогда один с первым доминирующим битом получит шину, но никто не объяснил условие, которое я хочу знать.
Ответы:
Короткий ответ заключается в том, что узел должен контролировать линии CAN в течение определенного времени, пока он не попытается передать. Таким образом, если другой узел передает, он должен хранить молчание, пока другой узел не завершит работу.
Шина CAN основана на дифференциальной сигнализации. Две линии, CAN-High (CAN +) и CAN-Low (CAN-), имеют одинаковый потенциал, когда шина свободна. Чтобы отправить биты, передатчик CAN помещает дифференциальное напряжение на линии около 2 вольт.
Передатчик CAN сначала видит, свободна ли шина, и начинает ли она передавать. Арбитраж работает так, что передатчик контролирует шину во время передачи. Передача осуществляется, как указано выше, либо поддерживая две линии с одинаковым потенциалом или с дифференциальным потенциалом. Таким образом, если передатчик передает немного, сохраняя линии с одинаковым потенциалом (sic), но он видит, что две передающие линии имеют дифференциальный потенциал, это означает, что какой-то другой узел передает, и первый передатчик проиграл арбитраж. Затем он должен прекратить передачу.
Когда узел впервые начинает передачу, передаваемые биты остаются одинаковыми до тех пор, пока адрес передающего узла, очевидно, не будет разным. Если два узла начинают передачу вместе, они будут передавать синхронно, пока не будет достигнута часть адреса. Когда адрес отличается, узел заметит потенциальную разницу в строках, даже если он не помещает его в линии. Тогда он знает, что потерял и должен попытаться снова. Победивший узел продолжает передачу, не зная, что какой-то другой узел тоже пытался. Конечно, эта логика распространяется и на более чем два узла.
Надеюсь, это поможет.
источник
Я знаю два способа решить эту проблему:
Во-первых, контроллер CAN всегда будет контролировать шину; когда он обнаруживает сообщение на шине, он начинает процесс приема. Теперь, когда он находится в состоянии приема, он знает, что шина используется, когда запрашивается передача.
Во-вторых, путем вставки битов приемопередатчик CAN не будет иметь один и тот же бит в течение более чем пяти циклов (если только не обнаружена ошибка шины, в этом случае вы увидите до 12 доминирующих битов подряд). Исключением является случай, когда по шине ничего не передается, когда пассивный бит всегда читается. Контроллер, который только запускается, может прослушивать шину в течение пяти циклов, прежде чем объявить «вероятно свободным».
Я не гарантирую, что это реальные процессы, но, исходя из моих (ограниченных) знаний о CAN, они будут работать.
источник
Как говорит CoderTao - контроллер CAN постоянно контролирует шину, поэтому он знает, когда передача уже выполняется. Таким образом, единственное время, когда может произойти коллизия, - это когда оба узла начинают передавать «одновременно» - в течение битового времени друг друга (+ небольшое количество дополнительного времени для распространения шины). Следовательно, это единственные случаи, которые вы нашли в документах :)
источник
Адрес узла определяет приоритет, более низкие адреса - высокий приоритет. Передача начинается с узла, передающего свой адрес. В то же время он передает, он слушает. Допустим, узел три и два передают одновременно. В качестве последнего бита адреса узел три транслирует 1, а узел два транслирует 0. Из-за 0 линия данных сбрасывается в состояние 0. Узел три видит, что вместо 1, который он передает, линия равна 0 и прекращает передачу.
CAN был впервые использован в легковых и грузовых автомобилях. Некоторые датчики должны иметь гораздо более высокий приоритет, чем другие. Например, торможение противоскольжения должно иметь более высокий приоритет, чем жидкость для омывания с низким ветровым стеклом.
источник
В спецификации CAN есть четыре ключевых элемента, которые позволяют контроллерам CAN определять состояние незанятой шины:
Сигнализация проводного И делает возможным обнаружение доминирующего бита, передаваемого одним из узлов, всеми другими узлами, передающими рецессивный бит одновременно. Таким образом, если какой-либо узел, передающий рецессивный бит, видит доминирующее состояние шины, он знает, что шина занята .
Битовая вставка гарантирует, что не более 5 одинаковых последовательных битов. Сама по себе битовая начинка используется для поддержания синхронизации. Однако побочным эффектом этого является то, что не более 5 последовательных рецессивных битов может происходить в пределах битов кадра вплоть до ограничителя CRC.
Конец кадра - это серия из 7 рецессивных битов в конце кадра. Они не переполнены битами, поэтому контроллеры могут легко их обнаружить. Обратите внимание, что в течение этого времени шина еще не простаивает , так как EOF считается частью кадра.
Межкадровое пространство - это серия из 3 рецессивных битов прерывания между кадрами, за которыми следует состояние ожидания шины. Ни одному узлу не разрешается инициировать передачу во время перерыва, если они не хотят отправлять кадры с ошибками или перегрузкой . Кроме того, узел, который передал последний кадр, также должен отправить 8 рецессивных битов приостановленной передачи после перерыва перед началом другой передачи. Это последнее требование позволяет другим узлам начинать отправку ожидающих сообщений, поэтому ни один узел не может "перегружать шину" бесконечно.
Из всего вышесказанного, вот как узлы обнаруживают состояние незанятой шины:
Принимающие узлы просто ждут 10 последовательных рецессивных битов , которые включают EOF и перерыв. По истечении этого времени они считают, что автобус простаивает, и могут попытаться начать передачу самостоятельно.
Передающий узел отправляет 11 последовательных рецессивных битов после EOF последнего кадра, который он передал. Если ни один другой узел не инициирует передачу в течение этого времени, он считает, что шина свободна, и может попытаться начать другую передачу. Если доминирующий бит обнаружен в течение этого времени, узел становится получателем.
Вышеуказанная информация плюс дополнительная информация о синхронизации битов может быть найдена в спецификации CAN, разработанной BOSCH.
источник
Определенный узел инициирует свою передачу только после периода INTERMISSION (эта длительность также называется длительностью SUSPENDED, в этот период 3 рецессивных бита передаются на шину после передачи кадра DATA / REMOTE на шину. Это указывает на то, что BUS является в состоянии IDLE), потому что в течение этого периода ни один из узлов не инициирует Передачу. После того, как шина находится в состоянии ожидания, узел, который хочет шину для передачи, переходит в ARBITRATION.
После передачи межкадрового пространства на шину узлы, присутствующие в сети CAN, попытаются инициировать передачу. Следовательно, конкретный узел знает, занята шина или нет.
источник