Existe-t-il une valeur de résistance correcte pour les résistances de tirage I2C?

72

La fiche technique de la mémoire EEPROM 24LC256 indique que:

Le bus SDA nécessite une résistance pull-up de type VCC (typiquement 10 kΩ pour 100 kHz, 2 kΩ pour 400 kHz et 1 MHz).

Je pensais que toute résistance avec une valeur kΩ ferait l'affaire (et il semble que ma mémoire EEPROM fonctionne correctement à différentes fréquences avec une résistance de 10 kΩ).

Mes questions sont:

  • Existe-t-il une valeur correcte pour les résistances de rappel?
  • Existe-t-il une loi / règle pour déterminer cette valeur?
  • Comment différentes valeurs de résistance affectent-elles le bus de données I²C?
JonathanD
la source

Réponses:

66

La résistance de tirage correcte pour le bus I 2 C dépend de la capacité totale sur le bus et de la fréquence à laquelle vous souhaitez faire fonctionner le bus.

La formule de la fiche technique ATmega168 (qui, je crois, provient de la spécification officielle I 2 C) est la suivante:

Freq<100kHzRmin=Vcc-0.4V3mA,Rmax=1000nsCautobus

Freq>100kHzRmin=Vcc-0.4V3mA,Rmax=300nsCautobus

La micropuce 24LC256 spécifie une capacité de broche maximale de 10 pF (ce qui est assez typique). Comptez le nombre de périphériques que vous avez en parallèle sur le bus et utilisez la formule ci-dessus pour calculer une plage de valeurs qui fonctionneront.

Si vous éteignez des batteries, j'utiliserais des valeurs situées dans la partie supérieure de la plage. S'il n'y a pas de limites de puissance sur la source d'alimentation ou des problèmes de dissipation de puissance dans les CI, j'utiliserais des valeurs sur l'extrémité inférieure de la plage.

Je vends des kits avec un RTC I 2 C (DS1337). J'inclus les résistances 4K7 dans le kit, ce qui semble être un compromis raisonnable pour la plupart des utilisateurs.

jluciani
la source
J'imagine généralement que le bus est inactif (dégagé) la plupart du temps, alors pour une application de batterie, il est plus important de gérer des problèmes plus importants que d'essayer d'optimiser les extractions I2C: P
Nick T
5
La seule chose que je voudrais ajouter est un tampon au-dessus de la capacité totale des périphériques sur le bus. La trace elle-même ainsi que les joints de soudure des plaquettes aux broches auront également une certaine impédance. Sur des bus plus longs, la capacité du tracé / fil peut être supérieure à la capacité de la broche des périphériques. Lors de la conception de cartes de production, je ne détermine généralement pas la valeur finale jusqu'à ce que j'ai un prototype en main et que le bus puisse couvrir différentes valeurs.
Mark
14

Il est logique que les fréquences plus élevées nécessitent des augmentations de résistance plus faibles: une résistance plus faible charge / décharge plus rapidement la capacité du câble, ce qui entraîne des bords plus raides. Avec les impulsions plus larges des basses fréquences, un bord moins raide n'influencera pas autant la forme de l'impulsion.

Par conséquent, la spécification I2C donne les valeurs maximales pour les résistances de rappel en fonction de la capacité du bus pour trois classes de vitesse:

entrez la description de l'image ici

Les valeurs minimales sont définies en fonction de la tension du bus et doivent limiter le courant via les drivers.

stevenvh
la source
3
Trois ans plus tard, Texas Instruments écrivit une note d'application dont le sens est assez proche de celui de cette réponse.
Nick Alexeev
Article EDN: Calculs de conception pour des communications I2C robustes . [Il suffit d'empiler des documents de référence.]
Nick Alexeev
11

La plage de valeurs est correcte, mais il est difficile de décrire exactement cette plage. En règle générale, 10k fonctionne.

Les sorties numériques ont une capacité spécifiée pour générer ou absorber le courant. Si votre sortie pouvait absorber 5 mA et que la sortie était connectée via une tension de rappel à 5 ​​V puis à 0, vous auriez besoin d'une résistance minimale de 1k. Si vous utilisez moins de 1k, la sortie ne pourra pas absorber suffisamment de courant pour tirer la broche jusqu'à 0V. Si vous utilisez une valeur supérieure, telle que 10k, la broche ne doit couler que 0,5 mA, ce qui est bien inférieur à sa valeur nominale.

Les entrées numériques ont un courant de fuite spécifié. C'est un peu comme la quantité de courant nécessaire pour "maintenir" un 0 ou un 1 à une entrée. Si votre résistance de rappel est trop grande, elle ne pourra pas surmonter le courant de fuite. S'il dépasse à peine le courant de fuite, le bruit dans le circuit peut suffire à modifier l'entrée.

Lorsque vous utilisez des sorties numériques capables de capter et de générer du courant ("pilote de totem", "pilote push-pull"), vous pouvez être tenté de ne pas utiliser de résistances de soulèvement ou de descente. Cependant, il est très important que les entrées CMOS ne puissent pas flotter ou qu'elles puissent tirer un courant excessif ... et il est très facile d'oublier que les broches MCU bidirectionnelles apparaissent généralement comme des entrées!


I2C et d'autres protocoles similaires utilisent des sorties "open drain" (ou "open collector"). Au lieu d’avoir des sorties qui peuvent monter et descendre, et des sorties à drain ouvert ne peuvent que tirer. C'est pourquoi la résistance externe de rappel est requise. Il existe maintenant des restrictions supplémentaires sur la gamme de résistances de tirage; la valeur de montée forme un circuit RC avec la capacité du bus. Une valeur trop petite empêchera encore une fois les pilotes de sortie d'absorber suffisamment de courant pour que la broche soit complètement descendue à 0. Cependant, une valeur trop grande prendra trop de temps pour charger la capacité du bus.

S'il existe des temps de configuration / maintien que vous n'êtes pas autorisé à violer, ils vous aideront à déterminer une constante de temps RC. La capacité du bus étant largement déterminée par la configuration du circuit imprimé, vous pouvez alors choisir une valeur R qui se combine au C pour fournir une valeur qui se situe confortablement dans le temps de configuration / maintien de votre entrée numérique.

ajs410
la source
7

Des valeurs de soulèvement basses (résistance plus faible) peuvent améliorer les bords des transitions de signal mais peuvent parfois être trop rigides - si les périphériques sur le bus ne peuvent pas absorber le courant de soulèvement, vous obtenez une logique 'basse' qui n'est pas vraiment basse , ce qui peut causer des erreurs de communication (et beaucoup de douleur.)

J'accepterais la plus grande résistance au pull-up qui vous donne des communications fiables.

Adam Lawrence
la source
5

Pour les basses fréquences, la valeur importe peu, mais pour les hautes fréquences, elle peut avoir un effet de filtrage sur le signal, en combinaison avec d'autres capacités du circuit. C'est pourquoi ils recommandent des valeurs différentes pour des vitesses différentes.

endolithe
la source
2

Un problème que je n'ai pas encore vu mentionné est la consommation d'énergie. Si l’on utilise une alimentation de 3,3 volts, une résistance de 3,3 K à la terre gaspillera 1 mA de courant (3,3 mW de puissance) chaque fois qu’une sortie est faible. L'utilisation d'une résistance de 10 K réduirait à la fois le courant et la puissance d'un facteur trois. S'il y a beaucoup de communication sur le bus I2C, cette consommation d'énergie risque de constituer une partie importante de la consommation totale d'énergie, en particulier si le bus peut rester inactif pendant de longues périodes. Par exemple, si on lit 100 octets / seconde, mais après avoir lu chaque octet, le bus restera avec le périphérique émettant le premier bit de l'octet suivant, et la plupart de ces octets ont la valeur MSB vide, le bus peut dépenser 90% de le temps avec SCL et SDA bas. En fonction de ce que fait le système, cela pourrait considérablement augmenter la consommation d'énergie.

Pour économiser de l'énergie, il peut être utile de connecter une résistance "pull-up" à une broche d'E / S plutôt qu'à une VDD. Bien que je n’aie jamais vu d’implémentations matérielles I2C offrir une prise en charge de cela, avoir les données de sortie principales sur une broche d’entrée / sortie séparée qui est connectée au bus via une résistance plutôt que d’utiliser un pilote à collecteur ouvert et une résistance de tirage fixe évitera gaspillage de courant lorsque le maître veut produire un "0". En outre, si le maître laisse le SCK bas pendant un certain temps sans se soucier de ce qui se trouve sur SDA, il peut désactiver le rappel jusqu'à ce qu'il soit prêt pour une communication supplémentaire. Si aucun des périphériques ne doit utiliser d'étirement de l'horloge, le maître peut simplement utiliser une sortie directe pour SCK et ne pas s'embarrasser de toute remontée sur ce fil.

Si l’on utilise un logiciel bit-bang avec un processeur rapide et que l’on veut obtenir de bonnes performances malgré une capacité de bus élevée, l’approche ci-dessus peut être combinée à l’utilisation des tractions faibles intégrées du processeur. Lors de la lecture des données, activez brièvement une remontée très forte immédiatement après chaque front descendant de SCK, puis passez à une remontée faible. Le fort pull-up tirera la ligne haute en dépit de la capacité, et une fois que la ligne sera haute, la faible pull-up sera capable de la maintenir haute. Même si un appareil avait du mal à tirer la ligne vers le bas contre le fort soulèvement, il pourrait le faire une fois que le fort soulèvement est désactivé.

supercat
la source
-1

Voici les formes d'onde, pour 400 kiloBits / seconde (forme d'onde 200KHz 101010). Le RC est de 4,7K ohm et 212pF. La valeur RC permet l’installation de 2 TAU.

entrez la description de l'image ici

analogsystemsrf
la source
Cette réponse est tout simplement fausse. L’horloge à 200 kHz donne 200 kb / s et non 400. Seuls les fronts montants sont affectés par la résistance au soulèvement. Les graphes semblent déroutants, presque comme s'il y avait une sorte de modulation en cours. Les quantités physiques et leurs unités sont écrites avec un espace (ou espace fin) entre les deux. Tau est un symbole, pas une abréviation.
Venny
@venny Il s'agit des formes d'onde typiques d'un bus fonctionnant trop rapidement pour le temps de stabilisation. Avec seulement 2 TAU installés, il n’ya pas de flat-top aux formes d’ondes, d’où la "sorte de modulation"; S'il s'agissait d'un schéma pseudo-aléatoire, la variabilité de la sédimentation serait très évidente. lire sur "données des yeux". Enfin, l’horloge à 200KHz est haute pour 2,5uS puis basse pour 2,5uS; la période de 2,5 µS correspond exactement aux données de 400 KHz que j'ai mentionnées.
analogsystemsrf