segment
Jan 2 2011, 19:46
Вопрос заключается в следующем: будут ли ошибки, если на шину будет передаваться одинаковое сообщение с разных узлов одновременно? То есть если с N устройств передается одинаковое сообщение, то оно пройдет как одно?
galjoen
Jan 3 2011, 12:07
Если точно одновременно, то, конечно, никаких ошибок не будет. Но если будут передавать все, то ACK никто не пошлёт.
А от чего у вас такие странные вопросы возникают?
Andrew2000
Jan 4 2011, 15:34
Как раз все наоборот.
Под "одинаковым" понимается одинаковый ID и, возможно, разные данные?
Тогда при одновременной передаче арбитраж никто не выигрывает, а ошибка будет, т.к. данные разные (даже если и одинаковые, биты могут "разъехаться" по времени к концу телеграммы).
А вот если верхним протоколом выдача телеграмм с одинаковым ID но с разных узлов четко разнесена по времени - проблем никаких.
segment
Jan 7 2011, 19:43
Одинаковый ID и данные. Спасибо. Скоро проверю в железе, просто интересно.
galjoen
Jan 9 2011, 20:34
Цитата(Andrew2000 @ Jan 4 2011, 21:34)

даже если и одинаковые, биты могут "разъехаться" по времени к концу телеграммы
Если кварцы одинаковые, то не разъёдутся - всего около 100 бит то, всё сообщение.
Ruslan1
Jan 25 2011, 18:54
Цитата(Сега @ Jan 2 2011, 21:46)

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

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

Ну тогда конечно могут коллизии быть, если это действительно так. Я только один проект с кэном делал. в сети было 10 устройств плюс LSS мастерб пользовал LSS fastscan (тож самописный). могу сказать что пакеты принимались четко. битых пакетов в линии не видел (я мониторил CAN шину третьим устройством и скидывал данные в лог). Но тут коллизия факт совпадения факторов, я мог прросто ее не дождаться или не заметить.
Вот как это сформулировано в спецификациях Боша и 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
Feb 6 2011, 19:59
Цитата(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
Feb 7 2011, 17:12
На неделе буду проводить эксперимент, выводить сообщения на дисплей Opel Astra теми же ID что и штатная магнитола, только чаще, заодно и проверим, будут ли коллизии с магнитолой. Только в моем случае поля данных будут отличными от даннх магнитолы.
Ruslan1
Feb 8 2011, 21:29
Цитата(zksystem @ Feb 7 2011, 19:12)

На неделе буду проводить эксперимент, выводить сообщения на дисплей Opel Astra теми же ID что и штатная магнитола, только чаще, заодно и проверим, будут ли коллизии с магнитолой.
А как узнаете что коллизия произошла? я так понимаю некорректное сообщение (плохая CRC) будет похоронено аппаратным кэн-контроллером без участия программиста.
zksystem
Feb 9 2011, 05:24
Цитата(Ruslan1 @ Feb 9 2011, 00:29)

А как узнаете что коллизия произошла? я так понимаю некорректное сообщение (плохая CRC) будет похоронено аппаратным кэн-контроллером без участия программиста.
Подключаюсь фирменным адаптером от IXXAT
Linker
Mar 17 2011, 09:05
Цитата(Сега @ Jan 3 2011, 01:46)

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

... в фазе арбитража (биты идентификатора+RTR) никто не выиграет арбитраж, передача пакета прекратится всеми узлами и они отпустят шину ...
Это на каком основании?
Linker
Mar 18 2011, 06:46
Цитата(Andrew2000 @ Mar 18 2011, 04:36)

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

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

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

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