Comment vérifier que le bus CAN est gratuit ou non


8

J'ai lu beaucoup de choses concernant l'arbitrage de bus CAN, mais cela n'a pas répondu à mes questions.

Si un nœud transmet déjà les données sur le bus et entre un autre nœud veut initier le transfert de données, comment cet "autre nœud" apprendra-t-il que le bus est occupé?

Tous les documents (que j'ai lus) prennent la condition que les deux nœuds démarrent la transmission simultanément et ensuite un avec le premier bit dominant obtiendra le bus mais personne n'a expliqué la condition que je veux connaître.


1
Swanand, vous obtiendrez peut-être de meilleures réponses à vos questions si vous attendez un peu plus longtemps pour accepter la réponse. Il s'agit d'une communauté internationale et certains experts pourraient ne pas être en mesure de répondre instantanément.
W5VO

@ W5VO Je m'en souviendrai la prochaine fois! Merci pour la suggestion! :)
Swanand

Réponses:


10

La réponse courte est que le nœud doit surveiller les lignes CAN pour être inactives pendant un certain temps avant de tenter de transmettre. Donc, si un autre nœud transmet, il doit rester silencieux jusqu'à ce que l'autre nœud soit terminé.

Un bus CAN est basé sur la signalisation différentielle. Les deux lignes CAN-High (CAN +) et CAN-Low (CAN-) sont toutes les deux au même potentiel lorsque le bus est inactif. Pour envoyer des bits, un émetteur CAN met une tension différentielle sur les lignes d'environ 2 volts.

Un émetteur CAN voit d'abord si le bus est inactif et si c'est le cas, commence à émettre. Le fonctionnement de l'arbitrage est qu'un émetteur surveille le bus pendant sa transmission. La transmission se fait comme ci-dessus en gardant les deux lignes au même potentiel ou à un potentiel différentiel. Donc, si l'émetteur transmet un peu en gardant les lignes au même potentiel (sic), mais qu'il voit que les deux lignes de transmission ont un potentiel différentiel, cela signifie qu'un autre nœud transmet et que le premier émetteur a perdu l'arbitrage. Il doit alors arrêter de transmettre.

Lorsqu'un nœud commence à émettre, les bits transmis sont les mêmes jusqu'à l'adresse du nœud émetteur qui est évidemment différente. Si deux nœuds commencent à transmettre ensemble, ils transmettront ensemble en synchronisation jusqu'à ce que la partie adresse soit atteinte. Lorsque l'adresse diffère, un nœud remarquera une différence de potentiel sur les lignes même s'il n'en met pas sur les lignes. Il sait alors qu'il a perdu et doit réessayer. Le nœud gagnant continue de transmettre sans savoir qu'un autre nœud essayait également. Bien entendu, cette logique s'étend également à plus de deux nœuds.

J'espère que ça aide.


1
Bonne réponse! Si je me souviens bien, l'envoi d'un «0» est dominant sur un «1», ce qui se traduit par l'arbitrage gagnant de l'adresse la plus basse. Une caractéristique intéressante de ceci est que si le nœud perdant s'arrête alors qu'il est censé s'arrêter, il n'y aura pas de corruption de données sur le bus.
W5VO

Très bonne réponse !! Sera très reconnaissant si vous pouviez simplement clarifier ceci: Disons que les identificateurs sont "1011001" et "1000110" lorsque le troisième bit est atteint, le premier émetteur envoie "1" et le second envoie "0"; donc selon le protocole CAN, le bit dominant est 0, et il écrase le bit récessif. Alors maintenant, le bus contient "0"; le premier module le détecte et arrête la transmission tandis que le second continue de transmettre. Ma compréhension est-elle correcte ??
Febin Sunny

@FebinSunny Oui ... Ce que vous avez dit est correct!
Swanand

1
Cette réponse n'est ni "bonne" ni "excellente". En fait, c'est totalement faux . Tout d' abord, l' émetteur ne pas « garder les deux lignes au même potentiel » pour envoyer bit récessif. Il arrête simplement de séparer les lignes et les résistances de terminaison égalisent le potentiel. Deuxièmement, l'adresse du nœud émetteur ne fait pas partie du champ d'arbitrage dans la spécification CAN, bien que certains protocoles CAN de niveau supérieur l'utilisent comme partie de l'ID de message. Troisièmement, rien de tout cela n'a quoi que ce soit à voir avec la détection du bus inactif
Maple

7

Je connais deux façons de le résoudre:

Premièrement, le contrôleur CAN surveillerait toujours le bus; lorsqu'il détecte un message sur le bus, il commence le processus de réception. Maintenant qu'il est dans l'état de réception, il sait que le bus est utilisé lorsqu'une transmission est demandée.

Deuxièmement, par bourrage de bits, l'émetteur-récepteur CAN n'aura pas le même bit pendant plus de cinq cycles (sauf si une erreur de bus est détectée, auquel cas vous verrez jusqu'à 12 bits dominants d'affilée). L'exception à cela est quand rien n'est transmis sur le bus, quand un bit passif est toujours lu. Un contrôleur qui vient de démarrer peut écouter le bus pendant cinq cycles avant de déclarer «probablement libre».

Je ne garantis pas que ce sont les processus réels, mais sur la base de ma connaissance (limitée) de CAN, cela fonctionnerait.


J'ai aimé le 2e tour! C'est purement logique et génial!
Swanand

2
Vous manquez le point majeur de l'arbitrage de bus - que la toute première chose dans un paquet CAN est l'adresse.
W5VO

1
Ce n'était pas vraiment sa question; la question était de savoir comment un contrôleur détermine s'il y a une activité sur le bus
CoderTao

@ Les trames CAN W5VO n'ont pas d'adresse, sauf si un protocole de niveau supérieur en fait une partie de l'ID de message.
Maple

@CoderTao alors que le bourrage de bits n'est pas la façon dont le contrôleur détecte le bus inactif, vous avez raison en ce qu'il joue un rôle important dans ce processus, en vous assurant que les données transmises ne peuvent pas être confondues avec la fin de la trame
Maple

3

Comme le dit CoderTao - le contrôleur CAN surveille en permanence le bus, il sait donc quand une transmission est déjà en cours. Ainsi, le seul moment où une collision peut se produire est lorsque les deux nœuds commencent à transmettre "simultanément" - à un peu de temps l'un de l'autre (+ un peu de temps supplémentaire pour la propagation du bus). Ce sont donc les seuls cas que vous ayez trouvés dans des documents :)


2

L'adresse de nœud détermine la priorité, les adresses inférieures étant de haute priorité. La transmission commence avec le nœud diffusant son adresse. En même temps, il transmet, il écoute. Disons que les nœuds trois et deux transmettent en même temps. En tant que dernier bit de l'adresse, le nœud trois diffuse un 1 et le nœud deux diffuse un 0. En raison du 0, la ligne de données est ramenée à l'état 0. Le noeud trois voit qu'au lieu du 1 qu'il diffuse, la ligne est un 0 et cesse de transmettre.

Le CAN a été utilisé pour la première fois dans les voitures et les camions. Certains capteurs devaient avoir une priorité beaucoup plus élevée que d'autres. Par exemple, le freinage antidérapant devait avoir une priorité plus élevée que le liquide de lave-glace à bas niveau de pare-brise.


Je le sais déjà .... Ma question ne concernait pas l'arbitrage au début .... C'était environ entre les transmissions ....
Swanand

1

Il existe quatre éléments clés dans la spécification CAN qui permettent aux contrôleurs CAN de détecter l'état du bus inactif:

  • La signalisation ET câblée permet à un bit dominant transmis par l'un des nœuds d'être détecté par tous les autres nœuds transmettant un bit récessif en même temps. Ainsi, si un nœud transmettant un bit récessif voit l'état dominant du bus, il sait que le bus est occupé .

  • Le bourrage de bits garantit qu'il n'y a pas plus de 5 bits consécutifs identiques. En soi, le bourrage de bits est utilisé pour maintenir la synchronisation. Cependant, un effet secondaire est que pas plus de 5 bits récessifs consécutifs peuvent se produire dans les bits de trame jusqu'au délimiteur CRC.

  • La fin de trame est une série de 7 bits récessifs à la fin d'une trame. Ils ne sont pas bourrés de bits, ils peuvent donc être facilement détectés par les contrôleurs. Notez que le bus n'est pas encore inactif pendant ce temps, car EOF est considéré comme faisant partie de la trame.

  • L'espace intertrame est une série de 3 bits d' interruption récessifs entre les trames, suivis d'un état inactif du bus. Aucun nœud n'est autorisé à initier une transmission pendant l'entracte, sauf s'il souhaite envoyer une erreur trames d' ou de surcharge . De plus, le nœud qui a transmis la dernière trame doit également envoyer 8 bits de transmission suspendus récessifs après l'entracte avant de lancer une autre transmission. Cette dernière exigence permet aux autres nœuds de commencer à envoyer des messages en attente, donc aucun nœud ne peut "monopoliser le bus" indéfiniment.

De tout ce qui précède, voici comment les nœuds détectent l'état du bus inactif:

  • Nœuds récepteurs attendent simplement 10 bits récessifs consécutifs , ce qui inclut EOF et l'entracte. Après ce temps, ils considèrent que le bus est inactif et peuvent tenter de commencer leur propre transmission.

  • Noeud émetteur envoie 11 bits récessifs consécutifs après EOF de la dernière trame qu'il a transmise. Si aucun autre nœud ne lance la transmission pendant ce temps, il considère que le bus est inactif et peut tenter de commencer une autre transmission. Si un bit dominant est détecté pendant ce temps, le nœud devient un récepteur.

Les informations ci-dessus ainsi que des informations supplémentaires sur la synchronisation des bits peuvent être trouvées dans la spécification CAN développée par BOSCH.


Il y a un bus avec plusieurs nœuds actifs. Un nouveau nœud est branché lorsqu'il n'y avait aucune communication en cours. Comment ce nouveau nœud saura-t-il que le bus est inactif? 10 bits récessifs consécutifs sont transmis lorsque ce nouveau nœud n'était pas dans l'image.
Swanand

"Signalisation ET câblée" signifie que les bits récessifs ne sont pas "transmis" en tant que tels, cela signifie que le nœud de transmission ne génère pas activement de potentiel dominant. Mais ils sont reçus , c'est-à-dire que les nœuds récepteurs échantillonnent le bus à des intervalles de bits et ils voient des bits récessifs sur la ligne. Donc, si ce nouveau nœud échantillonne le bus 10 fois et voit un bit récessif à chaque fois qu'il considère que le bus est inactif.
Maple

Il n'y a pas de différence entre "10 bits récessifs consécutifs transmis lorsque ce nouveau nœud n'était pas dans l'image" et l'état inactif du bus après cela. En l'absence de communication, toute lecture du bus renvoie un bit récessif ("1"). Donc, peu importe quand vous commencez à échantillonner, pendant ou après le dernier bit dominant. Tant que le récepteur voit 10 bits, il peut commencer à transmettre. BTW, personne n'envoie 10 bits. Le dernier émetteur "envoie" 11 bits récessifs, 3 entracte + 8 suspendus. Si le nœud en attente commence à émettre après le 10, le dernier émetteur perd l'arbitrage et cède le bus au nouveau nœud
Maple

0

Un nœud particulier initie sa transmission uniquement après la période INTERMISSION (cette durée est également appelée durée SUSPENDUE, pendant cette période 3 bits récessifs sont transmis au bus après la transmission de la trame DATA / REMOTE au bus. Cela indique que le BUS est à l'état IDLE), car, pendant cette période, aucun des nœuds n'initie la transmission. Une fois que le BUS est dans l'état inactif, le nœud qui souhaite que le bus soit transmis passe en ARBITRAGE.

Après la transmission de l'espace inter-trame au bus, les nœuds présents dans le réseau CAN tenteront d'initier la transmission. Par conséquent, un nœud particulier sait si le bus est occupé ou non.


Et si c'était la première transmission sur le bus? Dans ce cas, il n'y aura pas de "période d'intermission". Consultez la réponse de @ Doc pour plus de détails.
Swanand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.