IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Bus I2C multi composant même adresse [Bus communication]


Sujet :

Embarqué

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 47
    Points
    47
    Par défaut Bus I2C multi composant même adresse
    Bonjour à tous et bonne année !

    Je viens vers vous aujourd'hui pour trouver une solution à mon problème.

    Pour faire simple: le contexte:
    j'ai une carte kl25z de chez freescale (NXP maintenant) qui comporte 4 bus I2C (jusqu'à la tout vas bien !)
    de l'autre coté du ring j'ai 15 capteurs GY-521 6DOF MPU6050 (accelerometre gyroscopique).

    Le problème:
    Ces capteurs n'ont que 2 adresses possible sur le bus (0x68 et 0x69) donc je ne peut utilser que 2 capteurs par bus donc 8 au total!

    avec quelque recherche sur internet je suis tombé sur ça :

    (résumé en 3 ligne a la fin !)


    source:http://playground.arduino.cc/Main/MPU-6050

    Using more than two MPU-6050 sensors can be achieved by connecting each of the AD0 pins to a separate output of the Arduino. If the number of pins is a problem, then a shift register or a port expander can be used.

    The output of a 5V Arduino can not be used. In that case a voltage divider or level shifter for 3.3 volts on each of the outputs is needed. The 5V output pins can also be converted in 3.3V open collector outputs by using transistors or an open-collector driver. Pullup resistors to 3.3V should be added for a high level of 3.3V.
    Suppose all AD0 lines are default high (3.3V), so every MPU-6050 is I2C address 0x69. That I2C address is however never used ! The Arduino makes one of the AD0 lines low, and uses that sensor at I2C address 0x68. After that is finished, the Arduino selects another AD0 line, and can use that sensor.
    So every sensor is used at I2C address 0x68 (one by one) and 0x69 is never used.

    This should make it possible to have many MPU-6050 sensors in a project. Even more than 10 sensor should be possible.
    Note that requesting data from many MPU-6050 sensors is slow, because the I2C-bus is slow. A sensor with SPI interface is faster.

    At this moment (15 July 2014) it is not known if this trick works for the MPU-6050.
    Pour les ceux qui ne veulent pas ce casser la tête (google traduction):

    Utilisation de plus de deux capteurs MPU-6050 peut être réalisé en connectant chacun des repères de AD0 à une sortie séparée de l'Arduino. Si le nombre de broches est un problème, alors un registre à décalage ou une extension de port peut être utilisé.

    La sortie d'un Arduino 5V ne peut être utilisé. Dans ce cas, un diviseur de tension ou de décalage de niveau de 3,3 volts sur chacune des sorties est nécessaire. Les broches de sortie 5V peuvent également être convertis en 3.3V sorties à collecteur ouvert en utilisant des transistors ou un pilote à collecteur ouvert. Résistance de tirage au 3.3V devraient être ajoutées pour un haut niveau de 3.3V.
    Supposons toutes les lignes de AD0 sont élevés par défaut (3,3), de sorte que chaque MPU-6050 est l'adresse I2C 0x69. Cette adresse I2C est cependant jamais utilisé! L'Arduino fait l'une des lignes de faible AD0, et utilise ce capteur à l'adresse I2C 0x68. Après cela est terminé, l'Arduino sélectionne une autre ligne de AD0, et peut utiliser ce capteur.
    Ainsi, chaque capteur est utilisé à l'adresse I2C 0x68 (un par un) et 0x69 est jamais utilisée.

    Cela devrait permettre d'avoir de nombreux capteurs MPU-6050 dans un projet. Plus encore que le capteur 10 doit être possible.
    Notez que la demande de données à partir de nombreux capteurs MPU-6050 est lent, parce que le bus I2C est lente. Un capteur avec interface SPI est plus rapide.

    En ce moment (15 Juillet 2014) on ne sait pas si cette astuce fonctionne pour le MPU-6050.

    et les gros flemmard :

    résumé:
    il propose de mettre tous les capteurs sur un seul bus I2C avec la même adresse (0x68) et lorsque je veux savoir la valeur d'un des capteurs on change son bit d'adressage a 0x69 et dans le code on envoie 0x69.
    il dise à la fin qu'il n'ont pas eu le cas de tester!

    je voulais donc savoir si vous pensiez que cela était possible ou non !

    cordialement !
    Sh0rtY

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 33
    Points : 47
    Points
    47
    Par défaut
    Je vais prendre des composant en liaison SPI plus simple et rapide !!

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Bonjour;

    il propose de mettre tous les capteurs sur un seul bus I2C avec la même adresse (0x68) et lorsque je veux savoir la valeur d'un des capteurs on change son bit d'adressage a 0x69 et dans le code on envoie 0x69.
    Dans le cas où le bus I2C admette que plusieurs capteurs puissent avoir la même adresse : est-ce que l'on peut modifier l'adresse de ces capteurs alors qu'ils sont sous tension ?

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 208
    Points : 11 688
    Points
    11 688
    Par défaut
    Citation Envoyé par Sh0rtY Voir le message
    résumé:
    il propose de mettre tous les capteurs sur un seul bus I2C avec la même adresse (0x68) et lorsque je veux savoir la valeur d'un des capteurs on change son bit d'adressage a 0x69 et dans le code on envoie 0x69.
    il dise à la fin qu'il n'ont pas eu le cas de tester!

    je voulais donc savoir si vous pensiez que cela était possible ou non !
    c'est pas une solution ça, c'est du n'importe quoi ! En gros joue des possibilités de conflit du BUS I2C
    C'est comme s'amuser volontairement a faire déborder des tableaux, dans un langage informatique, pour incrémenter d'autres tableaux contiguës (en adresse) ! Mouais.... on peut c'est sur !

    En plus la datasheet dit bien
    The slave address of the MPU-60X0 is b110100X which is 7 bits long. The LSB bit of the 7 bit address is determined by the logic level on pin AD0. This allows two MPU-60X0s to be connected to the same I2C bus.
    When used in this configuration, the address of the one of the devices should be b1101000 (pin AD0 is logic low) and the address of the other should be b1101001 (pin AD0 is logic high).
    L'adresse esclave est bien 0x68 ou 0x69 (donc 2 esclaves autorisés sur le même bus I2C). J'ai mis en gras le mot other et je ne vois de 's' et de toute manière, c'est jamais bon de sortir des specs d'une datasheet !

    Citation Envoyé par Sh0rtY Voir le message
    Je vais prendre des composant en liaison SPI plus simple et rapide !!
    Tu m'étonnes ! Bon par contre ça va te demander autant d'I/O que de capteur pour les Chips Select.

    Citation Envoyé par Auteur Voir le message
    Dans le cas où le bus I2C admette que plusieurs capteurs puissent avoir la même adresse : est-ce que l'on peut modifier l'adresse de ces capteurs alors qu'ils sont sous tension ?
    Bonne question ! J'ai rien vu dans la datasheet et est ce que les adresses matérielles des composants I2C peuvent être changée en live ????? J'ai jamais essayé et ça ne m'est jamais venu non plus à l'esprit de le faire...

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Je viens de découvrir des routeurs I2C tels que le TCA9548A de Texas Instruments. Il y a 1 entrée maître et 8 voies esclaves que l'on peut interroger les unes après les autres et sur lesquels on pourrait brancher N composants I2C (d'après la doc).

    Peut-être est-ce la solution ?

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 208
    Points : 11 688
    Points
    11 688
    Par défaut
    Bien vu Auteur !!!!!
    http://www.ti.com/lit/ds/symlink/tca9548a.pdf

    Je connaissais pas mais ça me semble répondre parfaitement au besoin initial.

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 650
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 650
    Points : 11 143
    Points
    11 143
    Par défaut
    Par contre, dis moi si je me trompe : il faut d'abord envoyer une commande pour activer la voie voulue puis, ensuite, envoyer une seconde commande pour interroger le capteur ? Et si le capteur a la même adresse que le routeur ?

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 208
    Points : 11 688
    Points
    11 688
    Par défaut
    Effectivement tu as raison, ça fonctionne comme ça.
    D'après le chapitre 8.5.2 (fin de la page 13 et début de la page 14) un conflit d'adresse ne peut pas arriver. On est pas sur les mêmes du tout (0x70 à 0x77 pour le switch et 0x68 ou 0x69 pour le composant)

    Il me semble qu'il y a une cohérence dans l'attribution des plages d'adresses suivant qu'on a affaire à un composant I2C de type capteur, I/O expander, mémoire, etc... C'est pour cette raison que des bits sont fixes. Je me trompe peut être mais je crois avoir lu quelque part que c'est normalisé pour éviter le maximum de conflits mais sachant que l'adresse n'est que sur 7 bits on ne peut évidemment pas avoir une adresse unique pour chaque composant.

  9. #9
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 223
    Points : 28 213
    Points
    28 213
    Par défaut
    Citation Envoyé par Sh0rtY Voir le message
    il propose de mettre tous les capteurs sur un seul bus I2C avec la même adresse (0x68) et lorsque je veux savoir la valeur d'un des capteurs on change son bit d'adressage a 0x69 et dans le code on envoie 0x69.
    Donc en gros AD0 sert de ChipSelect.
    Donc en gros il te faut autant de sortie supplémentaire que tu as de capteur à adresser
    Donc en gros, on perd tout l’intérêt du bus I2C en le transformant en un vilain pseudo-SPI bien moisi.

    A supposer que l'on puisse changer l'adresse I2C du chip en live, ce dont je suis aussi un peu sceptique, c'est une solution de dépannage en l'absence d'autres solutions. Mais s'il y a d'autres solutions, il vaut mieux d'abords les étudier effectivement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les adresse sur le Bus i2c-0
    Par rufa11 dans le forum Matériel
    Réponses: 0
    Dernier message: 04/05/2014, 00h58
  2. Comment garder la même adresse IP à chaque connection internet ?
    Par Matt2094 dans le forum Dépannage et Assistance
    Réponses: 37
    Dernier message: 24/07/2006, 17h22
  3. Creer un bus I2c en C++
    Par ToMs dans le forum C++
    Réponses: 3
    Dernier message: 28/03/2006, 17h10
  4. acceder au bus i2c avec visual c++
    Par ledaker dans le forum MFC
    Réponses: 1
    Dernier message: 06/03/2006, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo