Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Абсолютно одинаковое CAN сообщение
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Controller Area Network (CAN)
segment
Вопрос заключается в следующем: будут ли ошибки, если на шину будет передаваться одинаковое сообщение с разных узлов одновременно? То есть если с N устройств передается одинаковое сообщение, то оно пройдет как одно?
galjoen
Если точно одновременно, то, конечно, никаких ошибок не будет. Но если будут передавать все, то ACK никто не пошлёт.

А от чего у вас такие странные вопросы возникают?
Andrew2000
Как раз все наоборот.
Под "одинаковым" понимается одинаковый ID и, возможно, разные данные?

Тогда при одновременной передаче арбитраж никто не выигрывает, а ошибка будет, т.к. данные разные (даже если и одинаковые, биты могут "разъехаться" по времени к концу телеграммы).

А вот если верхним протоколом выдача телеграмм с одинаковым ID но с разных узлов четко разнесена по времени - проблем никаких.
segment
Одинаковый ID и данные. Спасибо. Скоро проверю в железе, просто интересно.
galjoen
Цитата(Andrew2000 @ Jan 4 2011, 21:34) *
даже если и одинаковые, биты могут "разъехаться" по времени к концу телеграммы

Если кварцы одинаковые, то не разъёдутся - всего около 100 бит то, всё сообщение.
Ruslan1
Цитата(Сега @ Jan 2 2011, 21:46) *
Вопрос заключается в следующем: будут ли ошибки, если на шину будет передаваться одинаковое сообщение с разных узлов одновременно? То есть если с N устройств передается одинаковое сообщение, то оно пройдет как одно?


Неа, не будет ошибок. На случай если они полностью одинаковое передают- то откуда ж ошибке вообще взятся, а если разъедутся - то в силу принципа неразрушающего контроля шины никаких ошибок не будет.
Данная ситуация (много слейвов одновременно одинаковое передают) заложена например в CANopen LSS протокол- там такие одинаковые ответы обязательно будут. И ничего, работает sm.gif
Juray
Так ведь неразрушающий арбитраж не распространяется на поле данных.
Ruslan1
Цитата(Juray @ Feb 2 2011, 11:28) *
Так ведь неразрушающий арбитраж не распространяется на поле данных.


Ух ты, а я действительно не заметил. Надо будет еще раз более вдумчиво спецификацию почитать, я пробежав по диагонали понял что этот арбитраж работает в течении передачи всего CAN пакета sad.gif
Ну тогда конечно могут коллизии быть, если это действительно так. Я только один проект с кэном делал. в сети было 10 устройств плюс LSS мастерб пользовал LSS fastscan (тож самописный). могу сказать что пакеты принимались четко. битых пакетов в линии не видел (я мониторил CAN шину третьим устройством и скидывал данные в лог). Но тут коллизия факт совпадения факторов, я мог прросто ее не дождаться или не заметить.
Juray
Вот как это сформулировано в спецификациях Боша и CiA : "The ARBITRATION FIELD consists of the IDENTIFIER and the RTR-BIT"
"the bus access conflict is resolved by bitwise arbitration using the IDENTIFIER. ... If a DATA FRAME and a REMOTE FRAME with the same IDENTIFIER are initiated at the same time, the DATA FRAME prevails over the REMOTE FRAME. "

Andrew2000
Цитата(Juray @ Feb 5 2011, 19:20) *
If a DATA FRAME and a REMOTE FRAME with the same IDENTIFIER are initiated at the same time, the DATA FRAME prevails over the REMOTE FRAME. "

Так оно и понятно, чего данные просить если они вот уже полезли...
zksystem
На неделе буду проводить эксперимент, выводить сообщения на дисплей Opel Astra теми же ID что и штатная магнитола, только чаще, заодно и проверим, будут ли коллизии с магнитолой. Только в моем случае поля данных будут отличными от даннх магнитолы.
Ruslan1
Цитата(zksystem @ Feb 7 2011, 19:12) *
На неделе буду проводить эксперимент, выводить сообщения на дисплей Opel Astra теми же ID что и штатная магнитола, только чаще, заодно и проверим, будут ли коллизии с магнитолой.

А как узнаете что коллизия произошла? я так понимаю некорректное сообщение (плохая CRC) будет похоронено аппаратным кэн-контроллером без участия программиста.
zksystem
Цитата(Ruslan1 @ Feb 9 2011, 00:29) *
А как узнаете что коллизия произошла? я так понимаю некорректное сообщение (плохая CRC) будет похоронено аппаратным кэн-контроллером без участия программиста.

Подключаюсь фирменным адаптером от IXXAT
Linker
Цитата(Сега @ Jan 3 2011, 01:46) *
Вопрос заключается в следующем: будут ли ошибки, если на шину будет передаваться одинаковое сообщение с разных узлов одновременно? То есть если с N устройств передается одинаковое сообщение, то оно пройдет как одно?

Если несколько узлов попытаются отправить совершенно одинаковые пакеты, то произойдет следующее: в фазе арбитража (биты идентификатора+RTR) никто не выиграет арбитраж, передача пакета прекратится всеми узлами и они отпустят шину. До передачи байтов данных и CRC дело не дойдет. Эти попытки могут повторяться бесконечно. Потому нельзя допускать наличие узлов с одинаковыми идентификаторами на шине.
Andrew2000
Цитата(Linker @ Mar 17 2011, 12:05) *
... в фазе арбитража (биты идентификатора+RTR) никто не выиграет арбитраж, передача пакета прекратится всеми узлами и они отпустят шину ...

Это на каком основании?
Linker
Цитата(Andrew2000 @ Mar 18 2011, 04:36) *
Это на каком основании?

В выделенной Вами моей фразе присутствует не менее 4-х утверждений. Какое из них вызвало сомнение?
А лучше выдайте сразу свое правильное утверждение sm.gif
Andrew2000
Цитата(Linker @ Mar 18 2011, 09:46) *

Если никто не выиграет арбитраж, почему должна прекратиться передача пакета всеми узлами?
Linker
Цитата(Andrew2000 @ Mar 19 2011, 19:05) *
Если никто не выиграет арбитраж, почему должна прекратиться передача пакета всеми узлами?

Если ответить прямо на поставленный вопрос, то это заложено в логику работы CAN: узел, который не выиграл арбитраж - отваливается от шины.
syoma
Цитата
Если несколько узлов попытаются отправить совершенно одинаковые пакеты, то произойдет следующее: в фазе арбитража (биты идентификатора+RTR) никто не выиграет арбитраж, передача пакета прекратится всеми узлами и они отпустят шину.

ИМХО неверно - так как каким образом передающий контроллер определит, что проиграл арбитраж? Если пакеты одинаковые,то передаваемый бит будет равен принимаемому и потеря арбитража не распознается. Таким образом все узлы будут думать, что выиграли арбитраж.
Так что единственный вариант - если во время передачи данных рассинхронизация достигнет такого значения, что произойдет смещение как минимум на пол-бита - тогда они поймают коллизию. Иначе все должно пройти прозрачно.
Linker
Цитата(syoma @ Mar 21 2011, 13:54) *
Если пакеты одинаковые,то передаваемый бит будет равен принимаемому и потеря арбитража не распознается. Таким образом все узлы будут думать, что выиграли арбитраж.

Согласен. Признаю ошибку в своем утверждении. Абсолютно одинаковые пакеты переданные, несколькими узлами, не приведут к появлению ошибки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.