Transmission de différents messages avec le MÊME ID sur un bus CAN

12

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.

Swanand
la source
1
Je ne sais pas pourquoi ils l'ont fait de cette façon. J'aurais pensé qu'il serait plus logique que l'arbitrage s'applique à l'ensemble du message.
Rocketmagnet

Réponses:

12

Section 6.1 de la spécification CAN :

BIT ERROR: Une unité qui envoie un bit sur le bus surveille également le bus. Une erreur de bit doit être détectée à ce moment binaire, lorsque la valeur de bit qui est surveillée est différente de la valeur de bit qui est envoyée. Une exception est l'envoi d'un bit "récessif" pendant le flux binaire bourré du CHAMP D'ARBITRAGE ou pendant le SLOT ACK.

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:

  • personne ne le recevra
  • aucun des émetteurs ne pensera avoir réussi à transmettre quoi que ce soit.

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é.

Martin Thompson
la source
1

Dans votre question, vous faites cette hypothèse:

Celui qui a les bits dominants, ceux-là seuls seront transmis.

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.

clabacchio
la source
Oui, une logique doit être implémentée pour distinguer deux messages. Mais ma question était de savoir si l'arbitrage se fait sur la base de l'ID, alors que se passera-t-il si l'ID du message est le même et les données sont différentes.
Swanand
@Swanand uniquement sur l'hypothèse d'une transmission simultanée alors? Notez juste que c'est un cas d'angle, le contraire est plus probable
clabacchio
0

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.

Axeman
la source