A arbitragem CAN é feita com IDs, e qualquer nó no barramento pode transmitir com qualquer ID (idealmente não, mas um nó desagradável pode).
E se dois nós diferentes conectados no mesmo barramento CAN transmitirem mensagens com os mesmos IDs, mas com bytes de dados diferentes?
Meu pensamento: isso irá gerar lixo no ônibus. Quem tem os bits dominantes, esses somente serão transmitidos.
Respostas:
Seção 6.1 da especificação CAN :
Portanto, o nó que primeiro transmite um '1' quando o outro está transmitindo um '0' notará um Erro de Bit e sinalizará um erro normalmente - transmitindo um sinalizador de erro (consulte a Seção 3.1.3), como descrito formalmente na seção 6.2.
Informalmente, se esse nó estiver com erro ativo (que deve ser o caso usual), ele transmitirá um sinalizador de erro de 6 bits dominantes, que todos os outros nós também detectarão (como um erro de material). Isso tem o efeito de destruir completamente essa mensagem:
Cada transmissor tentará retransmitir - dependendo do tempo preciso das retransmissões, um pode iniciar suficientemente antes do outro o controle de ganho do barramento. Caso contrário, a mesma sequência pode acontecer novamente. (Ou outra mensagem de prioridade mais alta pode adiar os dois por um tempo!)
Resposta estendida inspirada na resposta de @ clabbacchio abaixo.
Você menciona "nós desagradáveis" e o clabbacchio afirma que, se dois nós transmitem em momentos diferentes, cada receptor precisa decidir o que fazer com suas múltiplas recepções.
Isso foi demonstrado por um hack no ano passado . O artigo discute, na seção "Especificações do PSCM", como um invasor pode sincronizar com as mensagens regulares no barramento e reproduzir sua mensagem maligna imediatamente antes daquela que a ECU "boa" está prestes a enviar. A ECU receptora aceita a mensagem anterior, atualiza seu contador de mensagens e descarta as mensagens "boas" como incorretas, porque seu contador de mensagens não foi incrementado.
fonte
Na sua pergunta, você faz esta hipótese:
O que pressupõe que as duas mensagens sejam transmitidas exatamente ao mesmo tempo, que é um caso específico de um problema mais geral. A resposta válida de Martin cobre esse problema específico, mas ignora o caso (mais geral) em que os dois nós transmitem em momentos diferentes.
Nesse caso, haverá duas mensagens com o mesmo ID, mas com carga útil diferente circulando no barramento, e depende da lógica dos receptores discriminar entre as duas mensagens e decidir se é o conteúdo que eles precisam receber. Se eles não conseguirem distinguir as duas mensagens, eles podem interpretar mal os dados e causar problemas mais sérios do que apenas quadros de erro.
Por exemplo, digamos que uma mensagem contenha a leitura de um sensor de temperatura, a outra contenha a posição alvo de um atuador no mesmo byte (NUNCA DEVE ACONTECER NA VIDA REAL), você pode fazer com que o atuador consiga isso como alvo sem nem mesmo saber.
fonte
Se o campo de dados das mensagens for diferente, você (espero!) Obterá um quadro de erro no barramento devido a um CRC errado.
fonte