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.
Réponses:
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.
la source
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.
la source
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 :)
la source
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.
la source
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.
la source
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.
la source