Pourquoi I²C n'a-t-il que des résistances de pull-up (question d'entretien)?


15

L'intervieweur a voulu savoir pourquoi des résistances de rappel sont utilisées sur SDA et SCL alors que la logique opposée peut également être implémentée. Y a-t-il une explication pour laquelle l'utilisation de la résistance de rappel est la conception choisie?



Tout comme un commentaire, le protocole de bus I2C en mode ultra rapide fonctionne comme une configuration push-pull, voir nxp.com/documents/user_manual/UM10204.pdf , section 3.2 Protocole de bus I2C en mode ultra rapide
Kvegaoro

Je me demande pourquoi NXP n'a pas spécifié de protocole I2C ultra-rapide qui utilisait le SDA bidirectionnel et le SCK unidirectionnel, avait le SDA du disque maître dur quand il voulait produire un high, et avait le master attendre assez longtemps pour que la ligne soit tirée haut dans les cas où il se soucierait de ce qu'un esclave avait à dire?
supercat

L'enquêteur a-t-il donné sa version d'une réponse?
copper.hat

Réponses:


14

Pour développer un peu la réponse de Jon:

Oui, tout dépend des MOSFET que vous souhaitez utiliser.

Les MOSFET à canal N sont bien meilleurs pour la logique de commutation que le canal P car:

  • Ils ont généralement une résistance beaucoup plus faible ( )RSON
  • Ils s'allument et s'éteignent plus rapidement

Donc, pour une configuration à drain ouvert (ce qui est I2C), il est beaucoup moins cher et plus facile de la créer en utilisant un arrangement "au ralenti haut" avec des MOSFET à canal N plutôt que "au ralenti bas" avec des MOSFET à canal P.

Une troisième option serait "ralenti bas" en utilisant des MOSFET à canal N, mais pour cela, vous avez besoin d'un pilote de grille haute tension pour élever la tension de grille suffisamment au-dessus de la tension source pour que le MOSFET s'allume. Ce n'est pas pratique pour les petits bus de communication, mais cette disposition est en fait assez couramment utilisée dans les ponts en H pour la conduite de moteurs où vous souhaitez avoir la même réponse (ou similaire) entre le côté haut et le côté bas du pont H. L'utilisation de paires de canaux P et de canaux N dans un pont en H signifie généralement que vous devez incorporer une zone morte entre la désactivation du canal P et la commutation du canal N car cela prend beaucoup plus de temps, ce qui réduit votre efficacité énergétique. .

Mais pour les petits bus de communication comme I2C où vous avez besoin d'une vitesse élevée, d'un faible coût et d'une simplicité d'utilisation, le "ralenti élevé" avec des MOSFET à canal N et des résistances de rappel est de loin le plus rentable.


Je ne suis pas d'accord sur le fait que la "haute vitesse" soit prise en compte dans I2C (au moins dans sa conception initiale). Les tractions résistives ne sont guère le moyen d'atteindre une vitesse élevée si tel est l'objectif.
Le Photon

1
Ne confondez pas la commutation à vitesse plus élevée avec une bande passante plus élevée. La commutation à grande vitesse vous donne des bords beaucoup plus nets, ce qui signifie une communication plus fiable.
Majenko

1
Les tractions résistives ne sont pas non plus le moyen d'atteindre une vitesse de commutation plus élevée.
Le Photon

C'est pourquoi il est important de sélectionner les bonnes valeurs de résistance pour I2C 'et pourquoi Arduino est mauvais pour utiliser les pullups internes par défaut.
Majenko

Oui, vous pouvez choisir vos résistances pour obtenir de meilleurs temps de montée. Mais l'ensemble du système est encore plus lent et / ou utilise plus de puissance qu'il ne le serait avec des pilotes de totem (ce qui ajouterait bien sûr d'autres coûts).
Le Photon

12

Un autre avantage du pull-up passif / pull-down actif est qu'il peut fonctionner avec une gamme de tensions d'alimentation. Notez que les niveaux numérique haut et bas sont explicitement spécifiés avec IIC. Ces niveaux sont suffisamment bas pour fonctionner avec des tractions de 3,3 V. Il est donc possible de construire des appareils fonctionnant à la fois sur 5 V et 3,3 V. En fait, les lignes de bus IIC peuvent être tirées jusqu'à 3,3 V, et cela fonctionnera avec un mélange d'appareils sur le bus qui sont alimentés séparément à différentes tensions.


Je suis presque à 100% c'est la réponse qu'ils cherchaient, j'ai un ami qui m'a demandé cela lors d'une interview pour une grande entreprise de fabrication de CPU (devinez laquelle) et c'était la réponse qu'ils recherchaient.
user34920

6

Alors que NMOS a un avantage sur PMOS en termes de vitesse / surface, cette différence est vraiment minime lorsque vous parlez d'un pilote sur une ou deux broches. Et après tout, la plupart des pilotes de sortie sont en fait des types de mâts totémiques qui nécessitent à la fois NMOS et PMOS, donc s'ils avaient choisi une configuration pull-down ou pull-up, ils se seraient retrouvés avec un pilote de sortie plus petit qu'un totem- conducteur de poteau.

Mais il y a un avantage des sorties NMOS open drain par rapport à PMOS open drain qui ne s'applique pas directement à I2C: lorsque VCC est positif, NMOS open drain permet aux puces avec différents niveaux VCC d'être connectées les unes aux autres. C'est (en partie) pourquoi de nombreux circuits intégrés logiques discrets à drain ouvert NMOS sont disponibles.

D'un autre côté, je ne connais AUCUNE puce PMOS à drain ouvert disponible sur le marché. En fait, je ne pense pas avoir rencontré de sortie PMOS à drain ouvert sur aucune puce. (J'ai utilisé ECL plusieurs fois, qui a une sortie à émetteur ouvert NPN avec un comportement similaire au drain ouvert PMOS)

La disponibilité des puces logiques discrètes NMOS à drain ouvert rend NMOS open drain beaucoup plus familier aux concepteurs électroniques que PMOS open drain.

La familiarité et la disponibilité des puces discrètes (pour le prototypage, par exemple) ont probablement influencé les concepteurs d'I2C à choisir la configuration NMOS à drain ouvert.


6

Je suppose que la réponse remonte à la raison pour laquelle nous utilisons une convention de masse négative en premier lieu (et ce n'était certainement pas omniprésent avant l'ère des semi-conducteurs). La raison en est que les appareils à canal N ont de meilleures performances que les appareils à canal P en raison de la physique des types de supports majoritaires utilisés.

Au début des circuits intégrés, c'était une limitation assez sérieuse et il y avait donc une préférence pour l'utilisation de transistors à canal N (ou NPN) pour atteindre les meilleures performances possibles. De cela, nous avons obtenu un système de masse négatif et des sorties à collecteur ouvert qui nécessitaient l'utilisation de résistances de pull-up plutôt que de pull-down.

Bien sûr, le bus I2C n'est pas à grande vitesse, il n'y a donc aucune raison qu'il ne puisse pas être mis en œuvre à l'aide de résistances de rappel, mais également aucun avantage. Nous respectons donc la convention et elle utilise des tractions.


2

Voici quelques spéculations (historiquement fondées) ...

Lorsque vous avez pullup (plutôt que push-pull), vous pouvez évidemment avoir plusieurs périphériques en conflit pour le bus sans courants excessifs (une bonne chose - mais vous pouvez obtenir la même chose avec un pulldown).

Dans "l'ancien temps" des transistors bipolaires, la logique TTL la plus simple utilisait des collecteurs ouverts avec des transistors NPN - tout est référencé à la masse, ce qui rend les niveaux de déclenchement simples à définir quelle que soit la tension du bus. De plus, NPN était plus rapide que PNP.

Si j'ai plusieurs appareils fonctionnant avec leur propre tension d'alimentation et que cette tension d'alimentation n'est pas constante, il est impératif d' avoir un pull-up plutôt qu'un pull down . Si plusieurs appareils tentaient de tirer le bus vers leurs rails d'alimentation respectifs, le flux de courant serait illimité et quelque chose pourrait frire. Au moins, ils sont tous d'accord sur la valeur du terrain, donc cette question ne se pose pas.

Avec CMOS, l'histoire change - maintenant le niveau de déclenchement est à mi-chemin. Mais les EE peuvent être un groupe traditionnel. Certes, venant des premiers jours des transistors, je n'ai même jamais remis en question le choix des tractions, pour les raisons ci-dessus.

Comme je l'ai dit, ce ne sont que des spéculations.


1

Cela peut être une chose historique.

Les anciens transistors et circuits intégrés consommaient en fait moins d'énergie lorsqu'ils étaient à 5 V qu'à 0 V. Comme il y avait une différence significative entre les deux niveaux, les concepteurs ont choisi de faire de l'état `` inactif '' celui de 5 V. Puis, au fil du temps, les transistors et les circuits intégrés se sont améliorés, ce qui fait que les deux États consomment à peu près la même quantité d'énergie, mais il n'y avait aucune raison réelle de modifier les normes.

Maintenant, vous voyez beaucoup de choses comme ça - où le ralenti est de 5 V - simplement parce que les normes n'ont jamais changé.


Il est toujours vrai que la plupart des circuits intégrés peuvent consommer plus d'énergie qu'ils ne peuvent en fournir, c'est donc toujours applicable.
Joel B

1

Cela fait de nombreuses années que je n'ai pas lu la spécification I2C, mais je me souviens quand elle a été utilisée pour la première fois, les gens l'appelaient souvent le bus à 2 fils à collecteur ouvert. Cela a rendu les connexions et la détection de collision super faciles, même pour les coups. Il y a encore 20 ans, il n'était pas considéré comme un bus hautes performances, juste bon marché et facile.


1

Je dirais que c'est parce que I2C est défini comme un bus où toutes les unités connectées doivent être à drain ouvert ou à collecteur ouvert. Cela signifie qu'il ne peut conduire le bus que bas, pas haut. (Lorsque le transistor de commande de sortie est bloqué, la broche est dans un état de haute impédance.)

Ce schéma offre de beaux avantages, par exemple que vous pouvez connecter des appareils avec différentes tensions de signalisation et que le bus se corrige automatiquement des erreurs de communication.

De toute évidence, la norme aurait pu être définie dans l'autre sens, comme une configuration ralenti-bas / actif-haut, et les autres réponses ici touchent assez bien cet élément.

Source: LabWorX 1, Maîtriser le bus I2C, par Vincent Himpe. Un très bon livre sur I2C, son historique, comment l'implémenter dans le matériel et comment l'utiliser dans les implémentations logicielles et de débogage.


1

La vraie réponse que personne n'a encore suffisamment abordée est qu'elle vous permet de connecter des périphériques alimentés par différentes tensions (tant que les broches d'E / S sont tolérantes). Par exemple, un appareil 3,3 V peut communiquer avec un appareil qui est hors tension 1,8 V tant que l'IO de l'appareil 1,8 V tolère des tensions allant jusqu'à 3,3. Bien sûr, chaque appareil peut piloter 0 V, mais tous les appareils ne sont pas capables de fonctionner jusqu'à la tension de vos résistances de rappel.

De plus, la plupart des circuits intégrés peuvent absorber plus de courant qu'ils ne peuvent en générer. Cela est dû à la dissipation thermique. Il est donc plus facile pour la pièce de faire passer le courant (conducteur de terre) des tractions que de fournir du courant (entraînant une haute tension) dans les tractions.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.