Améliorer une liaison I2C entre uC

Echangez ici sur vos idées ou vos problèmes concernant vos circuits électroniques et électriques.
Discuss here the problems concerning your electronic and electrical circuits.
Post Reply
User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Améliorer une liaison I2C entre uC

Post by nadar breicq » Mon 16 Apr 2018, 11:43

Salut à tous !

Depuis 2011, nous utilisons plusieurs uC dans nos robots reliés par une liaison I2C. Jusque l'année dernière pas de soucis, mais justement, en 2017, nous sommes passés sur des teensy3.2 et on a commencé à avoir des pertes de paquets. L'électronique étant un peu "sale" l'année dernière ( les câbles I2C était trop longs, pas blindés, et ils passaient à proximité de câbles de puissance ... Bref, un enfer ... ) j'avais mis c'est "echecs" du coté de la CEM ...

Mais cette année, on a réglé ces soucis, et pourtant je continue à avoir, de manière complètement aléatoire ( mais plus sporadiques que l'année dernière ), des soucis de perte de données ou de trames incomplètes ...

Du coup, j'aimerais implémenter un CRC8 afin de détecter ces erreurs. Avant de me lancer dans ce projet, et de vous expliquer mes soucis, j'aurais aimé savoir :
1 -Des gens ont déja implantés ce genre de solutions dans leurs robots
2 -Des gens ont déja expérimentés cela avec de l'I2C( et qu'elles ont été leurs solutions eventuelles ? )
3 -Auriez vous d'autres solutions à me conseiller avant de me lancer dedans ?

Merci d'avance pour votre retour !
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

User avatar
alf@
Posts: 325
Joined: Sat 13 Aug 2011, 12:12
Location: Neuilly sur seine
Contact:

Re: Améliorer une liaison I2C entre uC

Post by alf@ » Mon 16 Apr 2018, 12:47

quand je sais que je vais être dans un environnement bruité, j'utilise souvent des "I2C Bus Repeater". bon, c'est une modification matérielle.
Membre de l'équipe Goldorak, Ancien d'Eceborg: pour la méca, pour l'elec mais surtout pour le meilleur comme pour le pire,amis à vie avec Murphy!
Retrouvez moi sur mon twitter. Vous pouvez aussi me croiser à l'ECE Paris, à l'Electrolab et... dans la rue.

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Mon 16 Apr 2018, 14:11

alf@ wrote:
Mon 16 Apr 2018, 12:47
quand je sais que je vais être dans un environnement bruité, j'utilise souvent des "I2C Bus Repeater". bon, c'est une modification matérielle.
Yes ! Quand j'ai vu ce que ça donnait l'année dernière, je me suis dit que j'allais rajouter un composant aussi. Du coup sur mes cartes, j'ai des P82B715PN ( https://shop.mchobby.be/ci/234-extensio ... 02340.html ). Bon, c'est pas du "repeater" mais du "extender" mais ça ne peut qu'améliorer les choses ... Et pourtant ...
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

Riako
Posts: 71
Joined: Tue 05 May 2015, 18:07

Re: Améliorer une liaison I2C entre uC

Post by Riako » Mon 16 Apr 2018, 15:30

Salut Nadar,
nadar breicq wrote:
Mon 16 Apr 2018, 11:43
Salut à tous !

Depuis 2011, nous utilisons plusieurs uC dans nos robots reliés par une liaison I2C. Jusque l'année dernière pas de soucis, mais justement, en 2017, nous sommes passés sur des teensy3.2 et on a commencé à avoir des pertes de paquets. L'électronique étant un peu "sale" l'année dernière ( les câbles I2C était trop longs, pas blindés, et ils passaient à proximité de câbles de puissance ... Bref, un enfer ... ) j'avais mis c'est "echecs" du coté de la CEM ...

Mais cette année, on a réglé ces soucis, et pourtant je continue à avoir, de manière complètement aléatoire ( mais plus sporadiques que l'année dernière ), des soucis de perte de données ou de trames incomplètes ...
Alors, personnellement chez moi I²C ça veut dire Inter-Integrated Circuit et ça n'est absolument pas fait pour faire du carte à carte... Bon c'est un peu tard pour changer maintenant, mais j'avais envie de râler :) .
Beaucoup de microcontrôleurs aujourd'hui supportent le CAN, où les messages sont automatiquement gérés par le hardware (arbitrage, contrôle CRC, gestion d'erreurs, renvoir automatique si une trame n'est pas passé, pas de chevauchement des messages) et où ton bus peut faire trois fois le tour du robot sans problème à une vitesse supérieur à l'I²C. On l'utilise depuis des années, la gestion est simple, ça fonctionne très bien même sans blindage (paire différentielles), c'est rapide (1 Mb/s) et fiable.
nadar breicq wrote:
Mon 16 Apr 2018, 11:43
Du coup, j'aimerais implémenter un CRC8 afin de détecter ces erreurs. Avant de me lancer dans ce projet, et de vous expliquer mes soucis, j'aurais aimé savoir :
1 -Des gens ont déja implantés ce genre de solutions dans leurs robots
Oui on le fait lorsqu'on a besoin de liaisons séries (UART, notamment pour les ponts séries radio).
Mais là tu as 2 choix possible :
1) Calculer le CRC bit par bit au fur et à mesure, c'est lent...
2) Pré-calculer les valeurs du CRC (un tableau de 256 octets pour CRC 8 ), c'est ce qu'on utilise, plus rapide que la méthode précédente, mais ça prend plus de place en Flash, ou en RAM si tu le recalcule comme nous à l'initialisation (j'ai des codes en .c portable pour cette partie là, je peux les partager contre des bières à la coupe :P ).
L'implémentation va dépendre des ressources de ton système. Si tu as de la Flash en masse, met un tableau dedans, si tu es juste mais que tu as de la RAM tu peux le mettre dedans. Sinon il faut calculer à chaque fois...
nadar breicq wrote:
Mon 16 Apr 2018, 11:43
2 -Des gens ont déja expérimentés cela avec de l'I2C( et qu'elles ont été leurs solutions eventuelles ? )
Non mais comme dit précédemment avec du série oui, le portage ne doit pas être trop compliqué et tu as une bonne distance de hamming même avec un CRC 8.
nadar breicq wrote:
Mon 16 Apr 2018, 11:43
3 -Auriez vous d'autres solutions à me conseiller avant de me lancer dedans ?
Je te conseil fortement d'ajouter le CRC, quelque soit la modification sur ton bus c'est toujours mieux d'avoir une "protection" soft. Ajoute aussi un système d’acquittement par dessus. Pour l'an prochain : changer de bus ? :D
Si je me motive, je posterai le protocole qu'on a construit ces dernières années pour nos robots dans le post de présentation de notre équipe. Il est simple et contient pas mal de sécurité, ça pourra en inspirer (ou pas).


Si tu as d'autres questions, je peux tenter d'y répondre.
Robotiquement,

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Mon 16 Apr 2018, 15:42

Alors, personnellement chez moi I²C ça veut dire Inter-Integrated Circuit et ça n'est absolument pas fait pour faire du carte à carte... Bon c'est un peu tard pour changer maintenant, mais j'avais envie de râler :) .
Ha ha ha :lol: Je crois que j'avais déja eu cette conversation avec toi justement :) On se refait pas hein :wink: A la base, je devais avoir une seule carte avec mes uC, donc pas de câble pour l'I2C ... J'aurais du continuer sur cette voie là !

Ok pour le CAN, c'était l'idée pour l'année prochaine justement. J'ai même des cartes avec MCP tout prét :) Mais pas le temps de faire l'adaptation cette année malheureusement ( vie de famille + boulot toussa toussa ... ) Donc j'ai repris la même archi des années précédentes ce qui me permet d'écrire très peu de code finalement :P

Je vais bosser sur le CRC ( en fait j'ai déja commencé car ça m'interesse ). J'ai de la chance : avec un teensy 3.2 c'est du gâteau et j'ai de la place pour un tableau. Et puis, l'algo me resservira l'année prochaine dans tous les cas si je change de bus ! Pareil pour l'acquittement, j'étais justement en train de l'ajouter.

Bon ... Je retourne bosser dessus alors et je reviens vers vous si j'ai du nouveau :)

Merci pour vos retours !
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

arno
PMI
Posts: 734
Joined: Wed 23 Jun 2004, 21:51
Location: Un peu partout...

Re: Améliorer une liaison I2C entre uC

Post by arno » Mon 16 Apr 2018, 21:51

Salut Nadar,

Ma réaction initiale est la même que Riako. Un collègue nous avait ramené comme règle "pas d'I2C dans le robot hors des cartes", vu les soucis qu'il avait eu sur leurs robots précédents à l'époque. Mais les cartes étant déjà là, je ne vais pas refaire le débat ;) (moi aussi j'aime bien râler un peu).

Ce qui serait intéressant c'est de cibler un peu plus le problème pour mieux le résoudre. Mettre un CRC8 ça ne peux que t'aider, mais c'est encore mieux si les trames passent sans erreur du premier coup et que le CRC8 ne soit là qu'en 2ème rempart.

Tu dis que tu as réglé les soucis CEM, qu'à tu fait de particulier pour ça ?
As tu regardé un peu la forme des signaux à l'oscilloscope pour voir:
* la raideur des fronts (et l'adéquation avec la vitesse choisie)
* si la masse bouge entre les cartes (genre quand les moteurs démarrent/freinent)
* si les niveaux de tension semblent bon
* si un bruit particulier est présent sur la carte (du genre la fréquence de hachage des moteurs ou une de ses harmoniques)

Pour un bus CAN, donc bien plus robuste qu'un I2C, j'ai déjà eu des soucis dans un environnement extrêmement bruité (pas dans un robot) avec une carte proto toute con, où le simple ajout d'un léger filtre devant le transceiver, ainsi que d'une capa à la masse sur le point milieu des résistances de terminaison suffisait à éliminer l'ensemble des perturbations et éviter que le signale s'envole.
Il est possible que ce genre d'ajout puisse t'être bénéfique aussi suivant ce que tu vois à l'oscillo.

Un autre point est que l'I2C fonctionne avec des résistances de pull-up et collecteur ouvert. Pour améliorer l’immunité aux perturbations, une façon de faire et d'augmenter le rapport signal/bruit. Le bruit étant fixe (sauf filtre comme au dessus), il te reste la possibilité d'augmenter le courant. En réduisant les résistances de pull-up, on obtient cet effet dans une certaine mesure au prix d'une plus grosse consommation. Quelle valeur à tu actuellement pour voir si c'est envisageable ?

Un point que l'on regarde beaucoup sur des bus différentiels tel que le CAN est justement la longueur des dérivations et la position des résistances de terminaisons. La même logique s'applique dans une certaine mesure aussi sur un bus I2C. Si tu as juste des pull-up d'un côté du bus, lorsque c'est ce côté qui est commuté à la masse, il n'y a pas de courant qui circule de l'autre côté. Ce n'est pas trop courant comme montage, mais je conseillerait de diviser les pulls-up en deux et les mettre à chaque extrémité du bus, pour garantir qu'un courant circule lorsqu'on colle au zéro de n'importe quel côté. Avec des résistances faibles, cela aide aussi à maintenir l'état haut (il faut une forte perturbation pour tirer au zéro quelque chose ayant une faible impédance).

Si les fronts ne sont pas assez raides, cela peut aussi venir de la capacité (au sens "condensateur") du bus. C'est une caractéristique importante des circuits (par exemple le https://www.nxp.com/docs/en/data-sheet/PCA9515.pdf donne une limite à 400pF). Ça peut augmenter si il y a beaucoup de périphériques dessus par exemple, trop de longueur de câble, voire d'autres élément que je n'ai pas en tête. Là les extenseur de bus doivent aider en réduisant la capacité vu de chaque partie du circuit (il aident aussi pour avoir la sortance nécessaire pour augmenter le courant possible et donc réduire les pull-up). L'autre façon est de réduire la vitesse du bus, permettant au signaux d'être stable à chaque échantillonnage. Tu tournes à quelle vitesse actuellement et avec quel usage du bus ?

Je crois avoir fait le tour de mes maigres connaissances de CEM et de bus I2C. J'espère que ça puisse te donner une idée à laquelle tu n'avais pas encore pensé.

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Mon 16 Apr 2018, 22:56

Waaaa ! Merci aussi pour ta réponse ! ( vous avez été vite les gars dis donc ... 8) )

Alors en préambule, j'ai codé une solution avec un CRC et je viens de tester pendant 1h et pas encore aperçu de soucis ( alors qu'hier j'en en avait déja observé 3/4 ). Donc déja, si ça continu je suis plutôt satisfait ! Et j'ai appris pleins de trucs :D

Pour le reste :
Ma réaction initiale est la même que Riako. Un collègue nous avait ramené comme règle "pas d'I2C dans le robot hors des cartes", vu les soucis qu'il avait eu sur leurs robots précédents à l'époque. Mais les cartes étant déjà là, je ne vais pas refaire le débat ;) (moi aussi j'aime bien râler un peu).
Ok ok ok :lol: J'ai compris :lol: Mais bon pour ma défense j'ai quand même mis des P82B715PN sur mes cartes avec des câbles torsadés donc je suis pas trop mal partit :) Mais bon c'est vraiment la dernière année que je fais ça ...
Tu dis que tu as réglé les soucis CEM, qu'à tu fait de particulier pour ça ?
As tu regardé un peu la forme des signaux à l'oscilloscope pour voir:
* la raideur des fronts (et l'adéquation avec la vitesse choisie)
* si la masse bouge entre les cartes (genre quand les moteurs démarrent/freinent)
* si les niveaux de tension semblent bon
* si un bruit particulier est présent sur la carte (du genre la fréquence de hachage des moteurs ou une de ses harmoniques)
A l'époque ( l'année dernière ) j'avais fait l'experience mais rien de bien fameux ( et forcément, quand j'ai branché l'oscillo j'ai eu aucun bug pendant ma mesure ... Donc bon, difficile de juger ). Comme j'ai tout débranché, j'ai pas pu retester. donc sur ma config de cette année j'avais branché mon oscillo avec mon montage à base de P82B715PN et là, rien a dire ! les signaux étaient quand même bien plus franc. Je me suis dit que c'était gagné ... Mais pareil, j'ai pas pu observé le défaut pendant que mon oscillo était branché. Et sinon, à part l'ajout des P82B715PN :
- cables plus courts ( 3 à 4 fois plus court )
- paires torsadés et cable blindé
- J'ai éloigné les cables de puissance des cables I2C;
Un autre point est que l'I2C fonctionne avec des résistances de pull-up et collecteur ouvert. Pour améliorer l’immunité aux perturbations, une façon de faire et d'augmenter le rapport signal/bruit. Le bruit étant fixe (sauf filtre comme au dessus), il te reste la possibilité d'augmenter le courant. En réduisant les résistances de pull-up, on obtient cet effet dans une certaine mesure au prix d'une plus grosse consommation. Quelle valeur à tu actuellement pour voir si c'est envisageable ?
J'ai suivi la doc du P82B715PN. Donc 4,7k coté teensy et 470 en sortit du P82B715PN au début de ma liaison et à la fin de ma liaison.
Pour un bus CAN, donc bien plus robuste qu'un I2C, j'ai déjà eu des soucis dans un environnement extrêmement bruité (pas dans un robot) avec une carte proto toute con, où le simple ajout d'un léger filtre devant le transceiver, ainsi que d'une capa à la masse sur le point milieu des résistances de terminaison suffisait à éliminer l'ensemble des perturbations et éviter que le signale s'envole.
Il est possible que ce genre d'ajout puisse t'être bénéfique aussi suivant ce que tu vois à l'oscillo.
C'est interessant ça ! Faudrait que je pousse plus l'expérience à l'oscillo.

Bon ... J'ai du taff ... Je suis content si mon CRC résout mon soucis pour la coupe 2018, mais j'aimerais bien savoir d'où ça vient "pour le sport". :wink:
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

arno
PMI
Posts: 734
Joined: Wed 23 Jun 2004, 21:51
Location: Un peu partout...

Re: Améliorer une liaison I2C entre uC

Post by arno » Mon 16 Apr 2018, 23:35

Vu tes réponses il semble effectivement que tu avais mis les chances de ton côté.
nadar breicq wrote:
Mon 16 Apr 2018, 22:56
Alors en préambule, j'ai codé une solution avec un CRC et je viens de tester pendant 1h et pas encore aperçu de soucis ( alors qu'hier j'en en avait déja observé 3/4 ). Donc déja, si ça continu je suis plutôt satisfait ! Et j'ai appris pleins de trucs :D
3/4 erreurs à l'heure, c'est le genre de truc chiant à trouver ;)
Une idée en passant, maintenant que tu as le CRC (c'était pas possible avant...), est que tu peux détecter quand une trame à merdé. Dès que tu détectes un CRC foireux, tu bascule une pin du microcontrôleur, que tu utilises comme entrée de trigger sur l'oscillo, avec SCL/SDA sur 2 autres voies.
Selon les capacités de l'oscillo, en mettant le trig au milieu ou vers la fin de l'écran, il peut y avoir moyen d'avoir les quelques dizaines/centaines de millisecondes avant la détection du CRC erroné, et ainsi voir à quoi ressemblait l'erreur.

Bonne recherche !
C'est qu'avec si peu d'erreurs, le mécanisme de CRC et acquittement devrait probablement être suffisant. Je l'imaginais arriver plus souvent en te lisant au début.

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Tue 17 Apr 2018, 00:11

Selon les capacités de l'oscillo, en mettant le trig au milieu ou vers la fin de l'écran, il peut y avoir moyen d'avoir les quelques dizaines/centaines de millisecondes avant la détection du CRC erroné, et ainsi voir à quoi ressemblait l'erreur
Hooo ! Bonne idée ! Faut que je fasses ça ! Je dois aussi pouvoir le faire remonter sur mon IHM facilement quand le CRC merde, et même peut être recuperer le nombre d'erreurs par matchs d'ailleurs ... Mmm ... Du boulot pour demain on dirait :lol:
C'est qu'avec si peu d'erreurs, le mécanisme de CRC et acquittement devrait probablement être suffisant. Je l'imaginais arriver plus souvent en te lisant au début.
Oui c'est très peu ! Mais tu connais ce bon vieux murphy ! Il pointe le bout de son nez toujours au mauvais moment ( genre, en pleins match officiel quand ton robot est remplis à ras bord et qu'il doit décharger :D ) ...

Par contre, me vient une idée également et je me demande si y'a pas autre chose qui devait foirer l'année dernière mais qui serait plus de l'ordre de mon algo ... Mmm ... Je maintiens le mystère et je vous dis quoi demain lorsque j'aurais testé mon idée . Je vais dormir ! bye !
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Tue 17 Apr 2018, 23:21

Yo !

Donc il s'avère que, même si il y a pu avoir des problèmes d'ordre CEM sur ma liaison, mon "bug" observé était plutôt du à un soucis de timing dans mon protocole de communication. En gros, il arrivait parfois que mon esclave n'ai pas terminé de recevoir et traiter la donnée, que mon maitre était déja en train de lui demander si il avait bien effectué l'action demandée... ce qui était le cas mais pour l'action précédente ... et donc le maitre passait à l'étape d'après ! Ce qui est exactement le bug que j'observais.

En refaisant mon protocole avec le CRC, j'ai verrouillé un peu mieux mon protocole ce qui me permet de ne plus avoir ce soucis.

Et ce qui m'a mis la puce à l'oreille hier, c'est que si j'avais des soucis CEM, j'aurais eu des données corrompus et pas la perte de ma trame complète constituée de 8 bytes ... du coup mes déplacements auraient du être aberrants mais pas inexistants. Et effectivement, mon code devait fonctionner sur des uC plus lents auparavant pour ces raisons de timing je penses, mais en passant sur des uC beaucoup plus rapides le soucis est alors apparu.

Et en faisant le relevé des code erronés, pour l'instant j'ai eu zéro toute la soirée ... Donc bon ... Je suis plutôt content :D :D
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

arno
PMI
Posts: 734
Joined: Wed 23 Jun 2004, 21:51
Location: Un peu partout...

Re: Améliorer une liaison I2C entre uC

Post by arno » Tue 17 Apr 2018, 23:35

Cool si tu as trouvé !

Au moins tu repars avec un truc propre, qui va déchirer à la coupe 8)

User avatar
nadar breicq
Posts: 337
Joined: Fri 07 Mar 2008, 09:49
Location: Amiens
Contact:

Re: Améliorer une liaison I2C entre uC

Post by nadar breicq » Wed 18 Apr 2018, 10:08

arno wrote:
Tue 17 Apr 2018, 23:35
Au moins tu repars avec un truc propre, qui va déchirer à la coupe 8)
Mmm ... Oui ... On en parle à la coupe ? :lol: :lol: :lol:
Participez aux Joutes de robotique 2018 ! :wink:
Membre de l'équipe Les Karibous [2013][2014][2015][2016][2017][2018]
FabManager du FabLab La Machinerie d'Amiens
Membre du club Valrobotik de Valenciennes [2009 - 2012]

Post Reply