Que se passe-t-il si j'omets les résistances de rappel sur les lignes I2C?

33

Je viens tout juste de comprendre que les lignes de données et d'horloge I 2 C (SDA et SCL) doivent avoir des résistances de rappel.

Eh bien, j'ai construit quelques horloges avec le RTC DS1307 (voir la fiche technique ) conformément au schéma ci-dessous. Notez que j'ai omis les deux résistances de rappel.

Schéma de mon horloge sans résistances de rappel sur les lignes I2C

Les deux horloges fonctionnent bien, l'une d'elles fonctionne depuis plus de 3 mois maintenant. Comment est-ce possible? En tout cas, je voulais savoir:

  1. Que se passe-t-il lorsque les tranches I 2 C sont omises?

  2. Le manque de tractions risque-t-il d’endommager l’un ou l’autre de ces deux CI dans mon tableau?

Je cherche des réponses qui traitent de mon cas spécifique de connexion d’ATmega328P à un RTC DS1307, comme indiqué dans les schémas que j’ai fournis, mais si la question n’est pas trop vaste, il serait utile de savoir ce qui se passe lorsque les tractions sont omises en général. , c’est-à-dire dans d’autres scénarios de fonctionnement en I 2 C.

PS J'ai fait des recherches sur le Net pour trouver la réponse, mais je pouvais simplement trouver des articles sur le dimensionnement des tractions.

Mise à jour: J'utilise Arduino IDE 1.03 et mon firmware gère le RTC à l'aide de la librairie DS1307RTC Arduino (via ses fonctions RTC.read()et RTC.write()). Cette bibliothèque utilise Wire.hà son tour pour parler au RTC.

Mise à jour 2: Vous trouverez ci-dessous une série de prises de vue que j’ai prises pour aider à expliquer le fonctionnement de l’I 2 C sans les tractions externes.

Portée portée 1 Prise de vue 2

Mise à jour 3 (après ajout des versions I 2 C): vous trouverez ci-dessous une autre série de prises de vue prises après avoir ajouté des résistances de protection (4K7) appropriées aux lignes I 2 C (sur le même tableau). Les temps de montée sont passés d’environ 5 µs à 290 ns. Je 2 C est beaucoup plus heureux maintenant.

Portée portée 3 Prise de vue 4

Ricardo
la source
2
Est-ce que votre code désactive les tractions sur ces pins?
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Il n'y a aucune mention directe aux broches SDA et SCD (18 & 19) dans mon code. Je gère le RTC à l'aide de la bibliothèque DS1307RTC lib Arduino et de ses fonctions RTC.read () et RTC.write ().
Ricardo
Cette librairie utilise à son tour Wire.h pour parler au RTC.
Ricardo
3
Oui, en utilisant certainement des tractions internes. Notez les courbes au lieu d'arêtes vives.
Ignacio Vazquez-Abrams

Réponses:

28

1) Que se passe-t-il lorsque les tranches I2C sont omises?

Il n'y aura pas de communication sur le bus I 2 C. Du tout. La MCU ne pourra pas générer la condition de démarrage I 2 C. La MCU ne sera pas en mesure de transmettre l' adresse I 2 C.

Vous vous demandez pourquoi cela a fonctionné pendant 3 mois? Continuer à lire.

2) L’absence de tractions risque d’endommager l’un ou l’autre de ces deux CI de mon tableau?

Probablement pas. Dans ce cas particulier (MCU, RTC, rien d’autre), certainement pas.

3) Pourquoi le pont de conférence a-t-il été capable de communiquer avec le périphérique esclave I 2 C? I 2 C nécessite des résistances de rappel. Mais ils n'étaient pas inclus dans le schéma.

Probablement, vous avez activé des tractions internes sur l’ATmega. D'après ce que j'ai lu 1 , ATmega possède des tractions internes de 20 kΩ, qui peuvent être activées ou désactivées à partir du micrologiciel. 20kΩ est beaucoup trop faible pour le pull-up I 2 C. Mais si le bus a une faible capacité (physiquement petite) et que la communication est suffisamment lente, 20kΩ peuvent toujours faire fonctionner le bus. Cependant, ce n'est pas une bonne conception fiable, comparé à l'utilisation de résistances de rappel discrètes.

1 Pas un gars ATmega moi-même.

update: En réponse , formes d'onde I 2 C, qui ont été ajoutées à l'OP.
Les formes d'onde dans l'OP ont une constante de temps de montée très longue. Voici à quoi ressemblent habituellement les formes d'onde I 2 C

entrez la description de l'image ici

PIC18F4550, Vcc = + 5V, 2,2 kΩ. La forme d'onde montre SCL. Le temps de montée sur SDA est à peu près le même. La taille physique du bus est modérée: 2 périphériques esclaves, longueur du circuit imprimé ≈100mm.

Nick Alexeev
la source
Merci pour votre réponse! Oui, l'ATmega a des tractions qui doivent être activées dans mon cas. Je revérifierai le code et les bibliothèques que j'utilise, ainsi que le tableau. J'espère que cela clarifiera un peu les choses.
Ricardo
1
Vous voudrez peut-être vérifier d’abord avec la fiche technique de votre périphérique esclave. Si je me souviens bien, les tractions sur les ATMega peuvent aller de 30k à 60k (cela dépend de la Vcc, de la température et d'un certain nombre d'autres facteurs; vous ne pouvez pas vraiment compter sur eux pour une résistance fiable). Vous voulez vous assurer que vous envoyez suffisamment de courant à l'esclave pour assurer une logique correcte 1. Si la résistance est trop grande, votre dispositif esclave n'aura pas assez de courant et vous serez au même endroit où vous vous trouvez. à présent.
audiFanatic
4
@audiFanatic +1. BTW, IMO, y compris les résistances de tirage dans les cartes de dérivation et leur installation par défaut est une erreur. Imaginez ce qui se passe si quelqu'un a plusieurs panneaux de discussion sur un bus I2C. Chaque pull-up est généralement 2,2kΩ ou plus. Les résistances de rappel sur toutes les cartes de rupture apparaissent en parallèle. Le pull-up combiné devient trop raide pour I2C. [Plus d'informations sur ce problème potentiel ici et ici .]
Nick Alexeev
2
@ Ricardo Ce n'est pas un bus I2C heureux sur vos coups de visée [première série de vues de visée dans l'OP]. J'ai ajouté un coup de visée à ma réponse aussi.
Nick Alexeev
3
Cet article a quelques formes d'onde de bons et de mauvais signaux i2c
ford
16

La bibliothèque que vous utilisez et les bibliothèques dont elle dépend (Wire) activent les tractions internes d’ATMega. Ce sont des tractions faibles et, en utilisation normale, complètent les tractions externes (deux résistances en parallèle). En raison de la résistance relativement élevée de 20k à 70k, ils ne causent que peu de problèmes, voire aucun, avec ceux utilisés en externe.

Que se passe-t-il lorsque les tranches I2C sont omises?

Désormais, sans résistances externes, les faibles tensions internes sont les seules choses qui font que la ligne est haute. En fonction de la configuration de votre carte, de la vitesse de votre ligne i2c, de la fréquence à laquelle vous y accédez, des interférences externes, etc., elles pourraient fonctionner, mais pas forcément. Vous avez eu de la chance. Vous avez des tractions, mais pas celles auxquelles vous vous attendiez.

Le manque de tractions risquerait-il d’endommager l’un de ces deux circuits intégrés dans mon tableau?

Même sans les pull-ups internes, l'absence de pull-ups n'endommagera ni l'un ni l'autre. La construction interne des lignes SCl et SDA des périphériques i2c est semblable à celle des transistors NPN. Ce sont des collecteurs ouverts , essentiellement des diodes à commande / commutation de courant.

La dernière chose à noter, cependant, avoir les tractions internes activées, lorsque votre ATMega est à 5v et que le périphérique i2c est uniquement à 3,3v, peut poser problème. Ou, si vous avez les tractions internes, et les résistances externes connectées à une tension de 3,3 V ou autre, peuvent également causer des problèmes. Il s'agit essentiellement d'un bogue intentionnellement ignoré dans la bibliothèque Wire.

Passant
la source
4
+1 - You do have pull-ups, just not ones you expected.- Je suppose que vous l'avez cloué. Merci!
Ricardo
Juste pour que vous sachiez que j'ai ajouté quelques plans pour aider à clarifier ce qui se passe avec ma configuration.
Ricardo
2
@ Ricardo yep, en les voyant, à 33khz. Un tiers de la vitesse spécifiée la plus basse en i2c, et le signal est toujours très mauvais. À 100khz ou 400khz, vous n'auriez pas une communication fonctionnelle. Ce qui est intéressant, c’est que de nombreux périphériques i2c fonctionnent à une fraction des vitesses maximales. Rappelez-vous simplement que les pullups internes peuvent atteindre 70 000 ohms, une résistance i2c typique est de 4,7 000
Passerby
8

En règle générale, vous aurez besoin des résistances de rappel pour un circuit d'interface I 2 C. Si l'interface est vraiment une spécification complète I 2 C aux deux extrémités des câbles, les lignes de signal sans résistances ne pourront jamais atteindre le niveau haut. Ils peuvent rester bas ou atteindre un niveau intermédiaire déterminé par le courant de fuite dans les pièces à chaque extrémité. La raison en est que vrai I 2 C est un bus à drain ouvert.

Certains appareils peuvent en réalité disposer de résistances de rappel intégrées dans la plage de 20 Ko à 100 000 ohms, uniquement pour maintenir les broches d'interface à un niveau inactif élevé lorsque l' interface I 2 C de la pièce n'est pas utilisée. Pour des interfaces simples et courtes, ces résistances de rappel peuvent suffire à fournir le courant nécessaire pour tirer les lignes plus haut lorsque des horloges et / ou des données sont signalées.

Il est difficile de le distinguer de votre schéma, mais dans certains cas, les interfaces I 2 C sont implémentées à l’aide de broches de port d’E / S à usage général, puis sont codées dans le logiciel. Parfois, l’implémenteur peut ne pas utiliser les broches d’E / S dans cette configuration en utilisant une méthodologie à drain ouvert, ce qui peut expliquer pourquoi une interface sans résistances de rappel peut sembler fonctionner.

À la fin de la journée, vous vous devez probablement de vérifier la signalisation de l’une de vos anciennes horloges à l’aide d’un oscilloscope pour vérifier si les 1 et les 0 de l’interface fonctionnent dans les limites de tension spécifiées. Ensuite, vous saurez avec certitude si vous avez été incroyablement chanceux avec cette implémentation ou si l'un des facteurs que j'ai mentionnés ci-dessus est en jeu.

Michael Karas
la source
4

Que se passe-t-il lorsque les tranches I2C sont omises?

Très probablement, le bus I2C ne fonctionnera tout simplement pas.

Le manque de tractions risquerait-il d’endommager l’un de ces deux circuits intégrés dans mon tableau?

Préférablement pas.

Le photon
la source
3

Vos lignes I2C ne fonctionneront pas du tout. Si je ne me trompe pas, I2C n'affirme que les signaux bas, mais ne les ramène pas à un état haut, c'est pourquoi vous avez besoin de ces résistances.

Tout manque de tractions ne devrait pas endommager les circuits intégrés.

Funkyguy
la source
Les broches I2C sont à drain ouvert.
Matt Young
1

I2C est un protocole de logique TTL; de sorte que vos lignes de données et d'horloge sont à ciel ouvert. En d’autres termes, le matériel I2C ne peut gérer que ces lignes basses; ils sont laissés flottants quand ils ne sont pas à zéro. C'est là que les résistances de rappel entrent en jeu. Il s'agit d'un schéma simplifié, mais travaillez avec moi pendant une seconde.

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab


Comme vous pouvez le voir; la résistance de soulèvement est nécessaire pour garantir qu'une logique 1 est visible à la sortie lorsque la logique TTL ne pilote pas la sortie basse. La logique TTL ne peut pas conduire les lignes haut comme je l'ai déjà mentionné. Si cela n’était pas présent, la sortie resterait flottante et il est imprévisible que ce que vous voyez à la sortie (pour autant que vous sachiez, votre micro-ondes ou les dysfonctionnements intestinaux de vos collègues causés par un certain ourson gommeux sans sucre pourraient causer la valeur à fluctuer).

Maintenant, si vous implémentiez I2C dans un logiciel avec un microcontrôleur, cela ne poserait probablement pas trop problème, car il utilisera très probablement la logique CMOS, qui peut piloter des sorties hautes ou basses.

audiFanatic
la source
1
Content que cela ait aidé.
audiFanatic
2
Que les dispositifs utilisent la logique TTL ou CMOS importe peu - les sorties normales TTL et CMOS extrairont le signal vers le haut et le bas. Les signaux I2C sont soit à collecteur ouvert TTL, soit (plus vraisemblablement) CMOS à drain ouvert - dans les deux cas, le transistor qui tirerait le signal haut est absent de l’étage de sortie de la source; tirer les signaux élevés. Il est possible que le microcontrôleur ait des tractions internes sur ces pintes.
Peter Bennett
3
-1 Comme Peter Bennett l'a dit, une grande partie de cette réponse est tout simplement fausse. L'appel des signaux TTL "open-drain" est le cadeau.
Joe Hass
Notez qu’il existe des avantages à utiliser I2C avec TTL, à savoir que vous n’avez souvent pas besoin de convertisseurs de niveau pour gérer des composants avec différentes tensions d’alimentation connectées au même bus. Le simple fait de régler la tension de rappel sur la tension d’entrée d’acceptation la plus élevée de la puce à la tension la plus basse suffit largement avec les étages d’ entrée TTL . Sur CMOS, cela ne fonctionnerait pas.
Ben Voigt
@BenVoigt: Non - l'appel de la configuration "TTL" "nécessite une résistance de rappel" est incorrect, car cet arrangement peut être réalisé avec CMOS ou TTL, et le DS1307 est une partie CMOS. La fiche technique Maxim indique clairement que les sorties sont à drain ouvert, et le diagramme synoptique montre un FET pour une sortie.
Peter Bennett
0

Lorsque je mordis I2C avec un micro en tant que maître qui fournit l’horloge, j’ai été en mesure de piloter le SCL sans tirer.

Toutefois, SDA doit être OC avec un pull-up pour que le périphérique esclave puisse se retirer et répondre correctement.

Cordialement

Wayne
la source