Plusieurs esclaves I²C avec différentes adresses VS. utilisant un multiplexeur

JK

Plusieurs esclaves I²C avec différentes adresses VS. utilisant un multiplexeur


Je voudrais interfacer un grand nombre de capteurs I²C identiques, disons 32, avec un MCU qui n’a que 2 bus I²C.

Je peux configurer chaque capteur pour avoir jusqu’à 8 adresses différentes. Je peux donc avoir 8 capteurs par bus ou 16 capteurs au total ce qui n’est pas suffisant pour mon application.

J’ai l’intention d’utiliser un multiplexeur ou une sorte de tampon I²C (décrit dans ce document , page 8) afin d’augmenter le nombre de capteurs que je peux interfacer.

Cependant, je dois maintenant choisir entre plusieurs options:

  • Avoir 4 bus de capteurs différents avec 8 capteurs chacun et utiliser deux multiplexeurs (ou tampons) à 2 canaux sur chaque bus MCU pour basculer entre ces 4 bus de capteurs.
  • Avoir 8 bus de capteurs différents avec 4 capteurs chacun et utiliser deux multiplexeurs à 4 canaux sur chaque bus MCU pour basculer entre ces 8 bus de capteurs.

Ce ne sont que des exemples, il existe de nombreuses autres configurations mais la question est la même:

Y a-t-il une raison de préférer avoir plus de canaux avec moins de capteurs sur chacun plutôt que d’avoir moins de canaux avec plus de capteurs sur chacun?

J’ai essayé de comprendre s’il y aurait un changement dans le max. taux de mise à jour de mes capteurs dans chaque configuration mais je ne vois aucune différence.

Si certains d’entre vous ont déjà fait face à ce dilemme et / ou ont un élément de réponse, je serais heureux de l’entendre!

EDIT: le capteur en question est le TLV493D , un magnétomètre à 3 axes. Une description du bus avec jusqu’à 8 capteurs est disponible à la page 24 du manuel d’utilisation lié précédemment.

Je n’ai pas encore d’idée précise sur les multiplexeurs mais ce sera probablement quelque chose de similaire à la famille PCA954 *.

Andy aka

« Moins » pas « moins ». Quel est le capteur – fiche technique s’il vous plaît.

brhans

Vous avez 2 bus I2C dans votre micro, vous pouvez donc effectuer 2 opérations I2C à la fois. Peu importe que vous divisiez chacun en 2×8 ou 4×4, vous ne pouvez toujours parler qu’à un seul appareil par bus à la fois.

JK

@Andyaka, le message a été modifié.

JK

@brhans, c’est bien la conclusion à laquelle je suis parvenu. Je voulais être sûr de ne rien manquer. La seule différence que je vois jusqu’à présent est le nombre de résistances de rappel que je devrai utiliser, mais ce n’est pas un gros problème pour moi.

tuyau

@ChrisKnudsen Veuillez écrire les réponses dans la boîte de réponses afin que votre réponse puisse être vérifiée en votant, en modifiant, en acceptant, etc.

Réponses


 Tom Carpenter

Après une inspection plus approfondie des périphériques que vous utilisez, il semble que pour configurer leur adresse, vous devez pouvoir mettre chaque périphérique sous tension individuellement, ce qui signifie que vous aurez besoin d’une broche d’E / S par périphérique pour pouvoir définir l’adresse.

De plus, pour pouvoir configurer 8 adresses, vous devez pouvoir régler la tension sur la broche SDA lorsque l’appareil est sous tension. Cette condition sera difficile à satisfaire en utilisant des multiplexeurs I2C. Pour y parvenir, vous devrez envoyer un paquet sur le bus I2C, en veillant à maintenir la ligne SDA haute ou basse pendant 200us. Pendant ces 200us, vous devez allumer un appareil.

Pour cette raison, vous feriez mieux de choisir un ensemble d’options différent de ma suggestion d’origine:

Option 1

La méthode la plus simple serait d’utiliser une paire de multiplexeurs I2C, un connecté à chaque maître I2C. Chaque extenseur d’E / S aurait 4 bus en aval de 4 périphériques.

Étant donné qu’il n’y a que 4 appareils sur chaque bus, cela signifie que le LSB de l’adresse (défini par la tension de broche SDA / ADDR à la mise sous tension) peut toujours être défini sur 1 (la valeur de repos du bus I2C). Cela supprime la difficulté de régler la tension SDA au niveau correct lors de la mise sous tension des appareils.

Deuxièmement, vous pouvez vous limiter à n’avoir besoin que de 3 broches d’E / S pour alimenter les appareils. La séquence de mise sous tension peut devenir:

  1. Le premier appareil sur chaque bus se met sous tension avec VCC. Une fois sous tension, vous écrivez sur chaque bus pour changer le registre MOD1 en b11.

  2. Vous utilisez une ligne d’E / S pour alimenter le deuxième périphérique sur chaque bus. Encore une fois, vous pouvez maintenant écrire sur chaque bus et changer le registre MOD1 en b10.

  3. Vous utilisez une deuxième ligne d’E / S pour alimenter le troisième périphérique sur chaque bus. Écrivez sur chaque bus pour changer MOD1 en b01.

  4. Vous utilisez votre troisième ligne d’E / S pour mettre sous tension le quatrième et dernier périphérique sur chaque bus.

Cela vous donne maintenant 8 bus, chacun composé de 4 appareils avec une adresse unique. Il n’est pas nécessaire de régler la broche SDA / ADDR à une tension spécifique.

Option 2

La deuxième option consiste à utiliser un tampon / isolateur I2C (par exemple PCA9515a) pour chaque appareil. Vous connectez un groupe de 16 via des isolateurs à un maître et l’autre groupe de 16 via des isolateurs au second maître.

Vous auriez alors besoin de 16 broches d’E / S pour contrôler les broches d’activation des isolateurs. Chaque broche d’E / S contrôle un isolateur sur chaque maître I2C.

Pour lire à partir d’un appareil, vous activez simplement l’isolateur correspondant et lisez deux appareils simultanément à l’aide de vos deux maîtres. L’activation de la broche d’E / S 0 permet la lecture à partir du périphérique 0 sur chaque maître, la broche d’E / S 1 permet la lecture à partir du périphérique 1 sur chaque maître, etc.

Pour enregistrer les broches d’E / S, vous pouvez utiliser un décodeur de ligne 74HC154 ou similaire 4:16, étant donné que vous n’aurez qu’un seul isolateur sélectionné à un moment donné. Cela réduit le nombre de broches d’E / S de 16 à 4.



Ancienne réponse (applicable aux appareils qui définissent l’adresse à l’aide de broches Axx):

Lorsque vous utilisez un multiplexeur I2C, vous devez écrire une commande dans le multiplexeur pour changer le bus aval actuellement actif. Cela prend du temps.

Si vous avez moins de bus en aval pour basculer entre (c.-à-d. Maximiser le nombre de périphériques sur chaque bus), vous réduisez le nombre de commandes nécessaires pour lire tous les périphériques – vous pouvez lire tous les périphériques sur un bus, puis passer au bus suivant.

Le moyen le plus rapide de lire tous les périphériques est d’utiliser l’option qui a plus de périphériques par bus en aval et moins de bus en aval.

Dans votre cas, vous avez deux bus en amont. Connectez chacun d’eux à un multiplexeur I2C. Pour chaque multiplexeur I2C, faites deux bus en aval de 8 appareils.

Bien que vous puissiez choisir d’utiliser un multiplexeur 1: 2 qui vous donne juste assez d’espace d’adressage, vous pouvez toujours utiliser un multiplexeur 1: 4 en laissant deux bus en aval inutilisés sur chaque multiplexeur. Cela vous donne la possibilité d’ajouter des appareils supplémentaires ultérieurement si nécessaire.

JK

Merci pour votre réponse. J’avais cela à l’esprit, mais je pensais que la commande de commutation du multiplexeur serait non significative par rapport au temps de lecture de chaque capteur. Pensez-vous que ces commandes augmenteraient considérablement le taux de mise à jour?

Tom Carpenter

@JK dépend. Prend deux octets I2C pour changer de bus. Donc, en ayant 8 par bus, vous économisez deux octets chaque fois que vous lisez à partir de tous les capteurs (c’est 40us avec un bus à 400 kHz).

JK

Vrai. Dans cet esprit, est-il correct de dire qu’il est préférable d’utiliser des tampons comme décrit dans le rapport d’application TI (PCA9515 par exemple) sur mux car leur commande nécessite une seule broche supplémentaire (pour une commutation à 2 canaux) et non I²C commandes?

Tom Carpenter

@JK est essentiellement un multiplexeur I2C qui n’est en fait qu’un extenseur d’E / S I2C et une série de tampons. L’extenseur d’E / S sélectionne simplement quel tampon est activé. Si vous avez les broches d’E / S de rechange sur votre MCU, vous pouvez suivre le rapport de l’application TI et utiliser des tampons – essentiellement vos broches d’E / S MCU remplacent l’expandeur d’E / S I2C.

JK

Parfait, je vais aller pour cela et vous informer en cas de problème.


 Janka

Du point de vue de la programmation:

Très probablement, tous vos magnétomètres sont gérés par un seul fil. De préférence, réservez un bus I²C pour ce fil, afin de pouvoir facilement implémenter l’échantillonnage isochrone. Cela simplifiera la mise en œuvre d’une commande en boucle fermée à temps discret.

L’autre I²C peut alors être contrôlé par un autre thread et collecte tous les autres capteurs dont vous pourriez avoir besoin.


 Andy aka

Je peux configurer chaque capteur pour avoir jusqu’à 8 adresses différentes. Je peux donc avoir 8 capteurs par bus ou 16 capteurs au total ce qui n’est pas suffisant pour mon application.

Selon la fiche technique, définir 8 esclaves avec des adresses différentes nécessite 7 lignes IO supplémentaires. Pour acheminer (via un multiplexeur) le bus vers 32 esclaves nécessite 5 lignes d’E / S supplémentaires et aucun problème avec la configuration des adresses esclaves.

Vous pouvez probablement utiliser un mutiplexeur standard (1:16 ou 2 x 1: 8) pour commuter l’alimentation sur 1 appareil esclave sur 16 (ou 2 esclaves sur différents bus I2C) et donc le bus (ses) n’a pas besoin d’être multiplexé. Je ne sais pas quel est le temps de démarrage d’une condition de mise hors tension pour les esclaves, donc cela pourrait finir par être un peu lent.

Je ne dis certainement pas que c’est la solution optimale pour votre application spécifique, mais elle devrait être considérée comme une option si les broches IO sont demandées.

JK

C’est vrai, je pense (pour l’instant) que j’aurai assez de broches IO pour que cela ne soit pas un problème.

 

adresses, avec, différentes, esclaves, I2C, multiplexeur, plusieurs, un, utilisant, vs

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *