Signal I2C et puissance sur longue portée (câble de 10 mètres)

9

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.

user3503519
la source
3
Avez-vous vérifié que l'alimentation côté réception est suffisamment fine? Pas de pépins, pas de retombées ... Les câbles CAT5 sont assez fins, c'est pourquoi PoE utilise> 40 V pour l'alimentation.
Vladimir Cravero
4
C'est là que vous avez besoin d'un oscilloscope. Tout le reste sera une supposition (éduquée).
pipe
1
Je ne tordrais pas SDA ou SCL avec GND parce que vous ne voulez pas de capacité entre eux. Je voudrais tordre + 12V avec GND car vous voulez une capacité entre eux. Quel courant (de retour) le + 12V a-t-il? (vous pourriez avoir un rebond au sol)
Huisman
5
GND est connecté uniquement à une extrémité du câble? À moins que je ne comprenne mal, cela ne semble pas juste.
mkeith
1
Voulez-vous dire UTP cable? Je suis sûr qu'il peut être utilisé pour plus de protocoles que simplement FTP;)
Andrew Morton

Réponses:

15

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.

entrez la description de l'image ici entrez la description de l'image ici

Wesley Lee
la source
1
Excellente réponse, c'est exactement ce qui devrait être fait, mais bien sûr, cela peut être un changement radical pour le PO.
Jack Creasey
Je veux dire, ils sont super faciles à mettre en œuvre (par rapport au passage à RS-485, CAN, etc.), mais oui par rapport au changement de certaines résistances, c'est un changement radical.
Wesley Lee
1
Le problème de @JackCreasey OP n'est pas seulement la capacité du câble, ils semblent souffrir du bruit sur la ligne 12V qu'ils ont ajoutée. L'abaissement des résistances de pull-up offre une immunité au bruit supplémentaire, mais ils ne peuvent pas continuer à abaisser cette résistance indéfiniment.
Dmitry Grigoryev
@DmitryGrigoryev Puisque l'OP n'a donné aucun détail, je ne sais pas comment vous pourriez suggérer que du bruit était injecté. Je suis d'accord que vous ne pouvez pas simplement continuer à baisser la terminaison / pullup… .mais l'OP est trop grand par 10: 1.
Jack Creasey
9

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.

tuyau
la source
10 k n'est pas si gros pour un bus I2C sur 10 kHz, cependant? (Ou devrait-il être à 100 kHz OP?)Ω
Huisman
@Huisman Deux bons points. 10 kOhm ne m'inquiéteraient pas à 10 kHz sur un PCB normal mais ce n'est peut-être pas suffisant sur le câble. Et 10 kHz est inhabituel, mais pas insolite, je suppose.
pipe
7
10k Ohm est énorme pour I2C sur n'importe quelle distance. C'est le principal problème du PO.
Jack Creasey
1
Je suppose qu'il est préférable de diviser les résistances et d'en utiliser une à chaque extrémité. 2 résistances de pullup à 4,7 kΩ, une à chaque extrémité, devraient être un meilleur choix qu'une seule résistance de pullup de 2,2 kΩ.
12431234123412341234123
Je vais essayer de baisser les résistances, c'est tout ce qui fait sens pour moi après tous ces commentaires.
user3503519
5

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:

  1. Capacité du câble
  2. Tension de visée et détection du niveau Rx.
  3. La vitesse

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.

Jack Creasey
la source
2
Je suis d'accord, le câble CAT5 peut être supposé avoir environ 50pF par mètre, donc 10 mètres dépassent la limite de capacité de 400pF de la spécification I2C. Et atteindre une horloge I2C de 400 kHz ne peut pas être atteint avec une capacité de 400pF en utilisant le courant de rappel de 3 mA spécifié des résistances. Heureusement, ralentir la vitesse aidera - à moins que les appareils aient une limitation de vitesse d'horloge minimale. Nous ne savons pas quels sont ces appareils et quelles sont les tensions du bus I2C, mais en effet, les pullups doivent être ajustés pour fournir au moins 3mA et si les appareils permettent et conviennent de la tension de bas niveau du bus, alors encore plus.
Justme
Oui, je vais tester avec ça, mais ma question est pourquoi ça marche s'il n'y a pas d'alimentation sur ce câble?
user3503519
Une paire de câbles flottante n'a pas la même capacité que votre paire de signaux lorsqu'elle est mise à la terre. Pour votre configuration, le +12 et le Gnd sont essentiellement les mêmes ... ils ont une capacité au câble de signal qui a un impact sur votre temps de montée. .
Jack Creasey
2

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.

Jason Treon
la source
0

La carte de dérivation Sparkfun I2C est une bonne solution qui comprend:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

entrez la description de l'image ici

gatorback
la source
-1

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.

user3503519
la source
1
C'est fou cependant. Quel type de matériel utilisez-vous ici? Peut-être que quelque chose est mal configuré.
pipe
1
D'un côté, c'est ESP32 avec micropython, de l'autre côté est atmega8 programmé avec Arduino IDE. Je ne considère finalement pas cela comme une communication sûre, donc je vais passer en série (RS232), car j'ai testé, cela fonctionne bien sur ces plages
user3503519
1
Si j'étais vous, je regarderais aussi le RS-485 qui serait encore plus robuste et encore plus simple. L'inconvénient est qu'il nécessite plus de fils de signal mais vous en avez déjà beaucoup dans votre CAT5.
pipe
1
Eh bien, je ne vois pas comment va directement implémenter RS-485 sur un processeur atmega ou ESP 32 sans convertisseurs et matériel supplémentaires, donc RS-232 est le meilleur choix ici. Un seul sélecteur de niveau TTL sera utilisé.
user3503519