Après quelques lectures / tests, j'ai réussi à établir une communication stable entre 2 appareils en utilisant I2C avec un câble à paire torsadée en cuivre FTP CAT5.
- Fil vert - SCL
- Fil blanc / vert - GND
- Fil bleu - SDA
- Fil blanc / bleu - GND
GND est connecté uniquement à une extrémité du câble, l'horloge du bus I2C est à 10 kHz et j'ai utilisé des résistances de rappel de 10 km à VCC
Cela fonctionne bien et stable. Quand j'ai décidé d'utiliser 2 autres paires de câbles pour l'alimentation (+ 12V), cela a cessé de fonctionner. J'ai testé + 12V sur une paire GND sur l'autre paire, également + 12V / GND sur la même paire: même résultat, cela a cessé de fonctionner. Le bus I2C entier a cessé de fonctionner, d'autres périphériques y sont également connectés.
Je me demande si je peux utiliser le même câble ou choisir le plus sûr - un autre câble pour l'alimentation.
Réponses:
Peut-être exagéré s'il fonctionnait auparavant, mais une option consiste à utiliser un convertisseur I2C vers différentiel tel que PCA9615 , LTC4331 , etc.
Non seulement la gamme sera étendue, mais vous aurez également une meilleure immunité au bruit.
la source
Comme je l'ai noté dans un commentaire, il est difficile de déboguer sans trace d'oscilloscope, mais la première chose qui se démarque de votre question est la résistance de rappel de 10 kOhm. C'est inhabituellement élevé pour I2C, bien qu'il puisse facilement fonctionner dans de nombreux cas.
J'essaierais d'abord de les abaisser à 1 kOhm, pour voir si cela affecterait quoi que ce soit. Si cela aide, vous pouvez les augmenter progressivement, bien que cela ait un impact sur votre temps de montée.
la source
Vous devez absolument laisser tomber vos résistances de pullup sur de longues distances, et 10m est un long chemin et 10k Ohm est très élevé.
La valeur de la résistance de rappel est liée à trois choses:
Essayez d'utiliser l'une des calculatrices disponibles et commencez votre lecture ici avec la note TI sur les valeurs de pullup ou ici avec la norme NXP I2C (7.1).
En ce qui concerne le problème que vous rencontrez, il devrait être évident que la mise à la terre de paires supplémentaires (12V, Gnd) dans le câble changera la capacité des fils de signal I2C.
la source
Quelques notes:
Obtenir les bonnes valeurs de pull up est vital, en particulier pour SDA. Différents appareils peuvent absorber différentes quantités de courant. J'ai vu des configurations qui génèrent des 1 supplémentaires dans les données en raison d'une résistance de pull-up trop petite, après le passage à une puce de capteur plus petite. Les géométries plus petites signifiaient qu'il ne pouvait pas ramener l'autobus à un zéro propre.
La vitesse tue. Un long câble est en fait un filtre LRC passe-bas. Pour de nombreuses applications I2C, vous pouvez ralentir l'horloge sans rien perdre. Une horloge plus lente peut compenser un pull-up faible et une grande capacité (mais pas un pull-up trop fort).
Les longs câbles sont une invitation à EMI. J'ai vu une implémentation I2C qui nécessitait une pince en ferrite pour passer les tests d'immunité. La terminaison d'extrémité, le câble blindé ou les filtres peuvent vous aider.
Attention à la résistance parallèle. Si vous avez un pull-up de 1k sur le maître, puis un 1k sur chacun des quatre périphériques clients sur le bus, alors vous avez un pull-up net de 200 Ohms. Ne va pas travailler.
la source
La carte de dérivation Sparkfun I2C est une bonne solution qui comprend:
la source
Premièrement: je tiens à remercier la communauté d'avoir publié une réponse.
Deuxièmement: j'ai trouvé une solution basée sur ces réponses, voici ce que j'ai fait:
Test d'abaissement des résistances de traction à 4,7 K et 2 K. Sur 2K, je commence à recevoir des réponses de temps en temps, donc je baisse à 1K, puis je commence à recevoir des réponses, mais une partie des données manquait dans chacune d'entre elles. Après cette résistance de pullup commutée sur la broche SDA avec 10K et tout commence à fonctionner de manière stable.
La solution dans mon cas est donc 1K pullup sur SCL et 10K sur SDA.
Merci pour votre temps.
la source