L'arbitrage CAN se fait avec des ID, et n'importe quel nœud sur le bus peut transmettre avec n'importe quel ID (idéalement, il ne devrait pas, mais un nœud désagréable peut).
Que faire si deux nœuds différents connectés sur le même bus CAN transmettent des messages avec les mêmes ID mais des octets de données différents?
Ma pensée: cela va générer des ordures dans le bus. Celui qui a les bits dominants, ceux-là seuls seront transmis.
Réponses:
Section 6.1 de la spécification CAN :
Ainsi, le nœud qui transmet d'abord un «1» lorsque l'autre transmet un «0» notera une erreur de bit puis signalera une erreur comme d'habitude - en transmettant un drapeau d'erreur (voir la section 3.1.3), comme décrit formellement dans la section 6.2.
De façon informelle, si ce nœud est actif sur les erreurs (ce qui devrait être le cas habituel), il transmettra un drapeau d'erreur de 6 bits dominants, que tous les autres nœuds détecteront également (comme une erreur de substance). Cela a pour effet de détruire complètement ce message:
Chaque émetteur tentera alors de retransmettre - en fonction du timing précis des retransmissions, l'un pourra démarrer suffisamment avant l'autre le contrôle de gain du bus. Sinon, la même séquence peut se reproduire. (Ou un autre message de priorité plus élevée peut les désactiver tous les deux pendant un certain temps!)
Réponse étendue inspirée de la réponse de @ clabbacchio ci-dessous.
Vous parlez de «nœuds désagréables» et clabbacchio fait valoir que si deux nœuds émettent à des moments différents, chaque récepteur doit décider quoi faire de ses multiples réceptions.
Cela a été démontré par un hack l'année dernière . Le papier discute, dans la section "Spécificités PSCM", comment un attaquant peut se synchroniser avec les messages réguliers sur le bus et lire leur mauvais message juste avant celui que le "bon" ECU est sur le point d'envoyer. L'ECU de réception accepte le message précédent, met à jour son compteur de messages, puis rejette les "bons" messages comme étant erronés, car son compteur de messages n'a pas été incrémenté.
la source
Dans votre question, vous faites cette hypothèse:
Ce qui suppose que les deux messages sont transmis exactement en même temps, ce qui est un cas spécifique d'un problème plus général. La réponse valide de Martin couvre ce problème spécifique, mais ignore le cas (plus général) dans lequel les deux nœuds transmettent à des moments différents.
Dans ce cas, il y aura deux messages avec le même ID mais une charge utile différente circulant sur le bus, et il appartient à la logique des récepteurs de discriminer entre les deux messages et de décider si c'est le contenu qu'ils doivent recevoir. S'ils ne parviennent pas à distinguer les deux messages, ils peuvent mal interpréter les données et provoquer des problèmes plus graves que les trames d'erreur.
Par exemple, disons qu'un message contient la lecture d'un capteur de température, l'autre contient la position cible d'un actionneur sur le même octet (NE DEVRAIT JAMAIS SE PRODUIRE DANS LA RÉALITÉ), vous pouvez demander à l'actionneur de l'obtenir comme cible sans même le savoir.
la source
Si le champ de données des messages est différent, vous obtiendrez (espérons-le!) Une trame d'erreur sur le bus en raison d'un CRC incorrect.
la source