Puis-je utiliser I2C sur des câbles de 2 m?

24

Dans mon projet actuel, je dois communiquer entre un microcontrôleur et certains capteurs via I2C. L'un d'eux est un capteur de température, il doit être placé à environ 2 mètres du microcontrôleur. Je ne peux pas choisir un autre protocole (le capteur est sur un module avec un connecteur / broches / protocole donné).

Pensez-vous qu'il est possible de communiquer dans cette configuration? Quelles informations dois-je rechercher pour m'assurer que cela peut ou ne peut pas être possible? Avez-vous des conseils?

C'est ma première communication avec IC en dehors du PCB.

JackOfHearts
la source
5
Veuillez ajouter plus d'informations. Quelle serait la vitesse i2c? Résistances de pull-up? Câble utilisé et sa capacité? Qu'est-ce que le MCU hôte et quel est le capteur? Mais en général, I2C fonctionne sur plusieurs mètres sur des câbles comme HDMI, donc cela devrait fonctionner lorsque les choses sont faites correctement.
Justme
6
"Je ne peux pas choisir un autre protocole" Vous pouvez placer un deuxième microcontrôleur près du capteur, lire les données et les envoyer avec le protocole de votre choix.
FooBar
1
Avez-vous une vitesse minimale en kbit / s?
Mât
2
Si vous ralentissez l'horloge, vous pouvez parcourir de longues distances.
copper.hat

Réponses:

36

I2C n'est pas conçu pour être utilisé sur de longues distances mais je connais plusieurs applications où il est effectivement utilisé sur une distance d'environ 2 mètres. Je connais également un cas où ils ont eu des problèmes avec cela et il a finalement été résolu en réparant des boucles de terre, je crois.

Pour être sûr qu'il fonctionnera, vous devez utiliser un prolongateur de bus I2C comme le P82B715.

Cependant, la fiche technique du PB2B715 indique ce qui suit dans la section 8.2:

Pour les câbles à paire torsadée ou plats typiques, tels qu'utilisés pour le câblage téléphonique ou Ethernet (Cat5e), cette capacité est d'environ 50 pF à 70 pF / mètre, de sorte que le câble peut, en théorie, atteindre jusqu'à 50 m de long . De l'expérience pratique, 30 m a prouvé une longueur de câble sûre pour être conduit de cette manière simple, jusqu'à 100 kHz, avec les valeurs indiquées. Des distances plus longues et des vitesses plus élevées sont possibles mais nécessitent une conception plus soignée.

Ainsi, les experts (NXP est l'ancien Philips, l'inventeur de l'I2C) disent que 30 mètres ont été prouvés comme une distance faisable. D'après mon expérience, 2 mètres est une distance réalisable, et les expériences qui m'ont été rapportées indiquent que des bus I2C plus chargés sans extension sont également possibles.

Les points clés du fonctionnement des bus I2C sur de longues distances sont:

  • Utilisation d'un câble à faible capacité (paire torsadée / Ethernet);
  • Limiter la vitesse du bus;
  • Avoir des tractions correctement dimensionnées.

Calcul de pullup

Texas Instruments a une bonne note d'application (SLVA689) sur le calcul du pull-up .

  • (3.6 V1 V) / 20 mA=130 Ω
  • Rmax=tr/(0.8473Cb)trCbCbtrRmax=2950 Ω. La note d'application de TI comporte des graphiques afin que vous puissiez trouver rapidement les valeurs appropriées.
  • Bien sûr, la valeur du pullup est la valeur équivalente de tous les pullups en parallèle combinés. Vous pouvez avoir un pullup sur l'extrémité maître, l'extrémité esclave et tout autre esclave / maître sur le bus.
  • Plus vous êtes «à la limite», plus vous devez également tenir compte des «parasites» tels que la chute de tension dans le câble.
le_top
la source
Vous avez des tractions correctement dimensionnées? Comment déterminer la valeur et la puissance nominale?
Quantum0xE7
Comme Nick B a commenté une autre réponse, méfiez-vous de la possibilité que la puce d'extension de bus ou quoi que ce soit d'autre chauffe le capteur de température de quelques degrés.
Peter Cordes
14

Vous êtes généralement limité par une capacité de bus maximale de 400 pF.

Cela devrait fonctionner correctement si vous abaissez votre fréquence à quelque chose comme 1 kHz et fournissez un découplage d'alimentation à côté du capteur.

Si vous avez besoin de quelque chose de plus robuste, vous pouvez utiliser des convertisseurs I2C différentiels aux deux extrémités comme le PCA9615 .

filo
la source
Je me souviens vaguement de certains capteurs ayant une fréquence I2C minimale (je ne sais pas pourquoi).
Michael
14

Vous pouvez, mais ce n'est pas recommandé.

Différents bus à des fins différentes

I2C, comme SPI, est conçu pour la communication au sein d'une carte ou d'un groupe de cartes (pensez à Raspberry Pi et ses chapeaux ou Arduino et ses boucliers). Il peut fonctionner sur de plus longues distances (voir les autres réponses) mais ne doit pas être utilisé dans ces cas, simplement parce que ce n'est pas pour cela qu'il a été conçu, optimisé et qualifié.

Le risque que vous prenez est que vous ne pourrez peut-être pas ajouter d'autres capteurs à l'avenir, ou que votre système ne fonctionnera pas partout ou échouera dans certaines circonstances.

Ce que vous devriez rechercher est un bus de terrain, quelque chose comme 1 fil, CAN, RS-485, Ethernet, etc.

Les systèmes sans fil comme le bluetooth ou le zigbee pourraient également être une option.

Sclrx
la source
9

Comme indiqué par @filo, I2C est généralement limité par la capacité du bus. Cependant, il existe des moyens de contourner ce problème:

  1. Utilisez un prolongateur de bus. Le P82B96 ou le PCA9600 seraient tous deux de bonnes options dans votre cas.
  2. Si vous avez besoin de vitesses plus élevées ou de câbles extrêmement longs, vous pouvez utiliser un émetteur-récepteur I2C différentiel comme le PCA9600 . Cependant, cela rendra votre circuit beaucoup plus compliqué et vous aurez besoin d'un circuit intégré aux deux extrémités du câble.

Jetez un œil aux AN10658 et AN11084 de NXP pour plus d'informations.

Caleb Reister
la source
1
Cela fonctionnera bien avec un prolongateur de bus, comme plusieurs autres l'ont dit. Une chose qui n'est pas immédiatement évident à surveiller est que le prolongateur de bus à l'extrémité du capteur peut dissiper suffisamment de chaleur pour augmenter la lecture des capteurs de température de quelques degrés si le capteur et le prolongateur de bus sont proches l'un de l'autre.
Nick B
4

J'aime les réponses de filo et Caleb.

Une autre option consiste à utiliser un ou plusieurs ponts maîtres DS28E17 1 fil à I2C sur les capteurs individuels et à câbler le bus en tant que Onewire. C'est bon pour les bus de plus de 100 m et bien adapté aux applications de réseaux de capteurs à faible débit comme la gestion de la température et de la batterie distribuées.

Janka
la source
Pensée intéressante, bien qu'elle puisse introduire des frais généraux logiciels supplémentaires si le maître n'a pas d'interface 1-Wire.
Caleb Reister
C'est surtout une option si vous avez un hôte Linux, car il dispose de la pile de pilotes complète pour cette cascade. Sur un Raspberry Pi, il vous suffit de connecter GPIO4 à l'entrée 1W du DS28E17 via ces 100 m de fil (plus GND bien sûr), éditez config.txt et vous avez terminé. Il est entièrement transparent, ressemble à un I²C local. Juste plus lentement.
Janka
Merci. J'ai été vraiment surpris que 1-Wire puisse faire ce genre de distance. Je suppose que cela a du sens, car les résistances sont plus petites.
domen
Onewire ne se fonde pas sur la synchronisation du front montant, mais à la place, toute la synchronisation des bits est effectuée par rapport au front descendant, qui est activement piloté. C'est pourquoi il est moins sensible aux charges capacitives élevées. Quelques nF sont ok.
Janka