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

Arduino Discussion :

Arduino et le bus I2C [Tutoriel]


Sujet :

Arduino

  1. #1
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut Arduino et le bus I2C


    Je vous propose un nouvel article intitulé :


    [...] Dans ce tutoriel, nous allons décrire l'architecture physique du bus I2C, le protocole de communication série et comment communiquer en I2C entre une carte Arduino et un capteur de température DS1621.
    Nom : prog_final2.jpg
Affichages : 5404
Taille : 97,1 Ko

    Bonne lecture



    Les meilleurs cours et tutoriels pour apprendre les systèmes embarqués
    Les meilleurs cours et tutoriels pour apprendre Arduino

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Article intéressant.
    Juste une petit question à propos du paragraphe V-B. Branchements :

    L'adresse est codée avec sept bits. Dans le protocole, l'adresse est suivie du bit R/W pour indiquer une opération de lecture/écriture et former un octet. Avec Arduino, A0, A1 et A2 seront les bits de poids faible et le huitième bit de poids fort est à zéro. Ce qui donne pour la valeur de l'octet d'adresse du composant :
    Adresse = 0100 1000 = 48Hex
    Est-ce que le protocole I2C fixe la valeur des 5 premiers bits ?
    Si j'ai bien compris le 8ème bit de poids fort est forcément 0 car il correspond au start. Mais ensuite, les 4 bits suivants sont-ils obligatoirement 1001 ?

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    Salut

    Peut-être faudra-t-il que je reformule ce passage dans l'article

    Dans le protocole I2C, l'adresse est codée sur 7 bits (quoi que j'ai vu qu'on pouvait étendre à 10 bits). Je prends un autre exemple, le MCP4018 (potar numérique):
    Nom : slaveaddressmcp4017.JPG
Affichages : 5676
Taille : 29,3 Ko

    Le constructeur a fixé l'adresse à : 0101111 (bits A0 à A6)
    Ici, aucune possibilité de modifier l'adresse de façon hardware comme avec le ds1621.

    Sous Arduino, il faut rajouter un bit A7=0 (pas évident que cela a un rapport avec le Start) pour passer l'adresse dans un octet, soit 0010 1111
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    Wire.beginTransmission(0x2F)

    Après c'est la tambouille de la librairie Wire d'Arduino de générer les start, stop, bit RW quand il faut.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    Il est vrai que c'est un peu confus, car on trouve aussi dans la littérature des "octets d'adresse" composés des 7 bits suivis du bit R/W (lecture ou écriture).

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 048
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 048
    Points : 14 480
    Points
    14 480
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Nom : slaveaddressmcp4017.JPG
Affichages : 5676
Taille : 29,3 Ko

    Le constructeur a fixé l'adresse à : 0101111 (bits A0 à A6)
    Tiens, moi j'aurais écrit 0101111 (bits A6 à A0), histoire d'être en phase avec le croquis. Nan ?

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    Oui oui, A6 à A0, de gauche à droite comme sur la figure.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 233
    Points : 28 261
    Points
    28 261
    Par défaut
    Pour être plus précis, l'adresse est codée sur octet sous la forme 7 bits + un bit de R/W, donc un octet. Les 7 bits de poids fort constitue l'adresse du chip, tout ou partie de cette adresse pouvant être fixée en dur par le constructeur. Le bit de poids faible indique si le chip recevra des octets dans la suite de l'échange (R/W à 0) ou si au contraire c'est lui qui devra émettre des octets (R/W à 1).
    On peut ainsi extrapoler en disant qu'un chip à en réalité 2 adresses sur un octet, l'adresse paire pour recevoir, l'adresse impaire pour émettre.

    Cependant toutes les adresses ne sont pas utilisables, certaines sont réservées. C'est le cas de l'adresse 11110xx0, qui indique justement que on passe en mode adressage 10 bits. Dans ce cas on a 11110 qui indique ce mode, xx qui sont les 2 bits de poids fort de l'adresse et R/W systématiquement à 0. Suivra un second octet qui indiquera les 8 autres bits de l'adresse (donc pas de R/W ici). Et pour passer en émission, on fera suivre d'un restart avec un troisième octet copie du premier octet à l'exception du bit R/W qui passe à 1.

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 222
    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 222
    Points : 11 755
    Points
    11 755
    Par défaut
    Tout est expliqué ici page 15 http://www.google.fr/url?sa=t&rct=j&...05454873,d.d24
    C'est une doc de NXP (anciennement Philips qui a conçu I2C), elle passe rapidement en revue différents bus puis détail le bus I2C. Une super doc !

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Je viens de relire la doc sur la bibliothèque Wire de Arduino.

    Donc la fonction begin() prend en paramètre l'adresse du composant sur 7 bits, des valeurs entre 8 et 127 (les valeurs entre 0 et 7 sont réservées).
    Cependant comme l'a indiqué sevyc64, le 8ème bit est celui qui indique le sens de la communication : écriture ou lecture.

    Citation Envoyé par documentation Arduino
    7 bits identify the device, and the eighth bit determines if it's being written to or read from. The Wire library uses 7 bit addresses throughout. If you have a datasheet or sample code that uses 8 bit address, you'll want to drop the low bit (i.e. shift the value one bit to the right), yielding an address between 0 and 127.
    Donc si je reprends l'exemple de l'article avec le capteur de température, avec A2=A1=A0=0 l'adresse du composant est (et si je ne me trompe pas) :
    1001 0000 en écriture (écriture sur l'esclave)
    1001 0001 en lecture (lecture des données de l'esclave)
    Et 1001 étant le quartet de l'adresse imposé par le constructeur sur ce composant. J'avoue qu'au départ je n'avais pas saisi ce point , mais depuis que j'ai vu la doc de plusieurs composants dont celle du AD5171 (potentiomètre numérique) j'ai compris qu'une partie de l'adresse est imposée par le constructeur et une autre est au libre arbitre de l'utilisateur.



    Vincent : je conserve ton lien, merci

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 233
    Points : 28 261
    Points
    28 261
    Par défaut
    Tu as bien compris.

    La source de confusion en I2C, tant que l'on a pas compris le principe, c'est que l'on parle toujours d'un adressage sur 7 bits, bit 0 à bit 6, et d'un 8ème bit pour le sens de la communication. Mais en réalité, lorsqu'on regarde l'octet transmis, l'adressage se fit sur les bits 1 à 7, le sens de communication n'est pas le 8ème bit, mais bien le bit 0.

    Pour les adresses :
    - L'adresse 0 (000 0000) est réservée au broadcast, adressage de l'ensemble des esclaves reliés
    - Les adresses 1 à 3 (000 00xx) sont réservées pour d'autres usages
    - Les adresses 4 à 7 (000 01xx) sont réservées aux périphériques I2C Haute Vitesse
    - Les adresses 8 à 119 sont utilisées pour les périphériques I2C vitesse normale
    - Les adresses 120 à 123 (111 10xx) sont réservé à l'adressage 10 bits

    - Les adresses 124 à 127 sont réservé pour d'autres usages

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    ok. Je pense que dans l'article, pour éviter la confusion, il vaut mieux rester sur une base de 7 bits. Et l'adresse du capteur de température est ainsi :
    100 1000.
    En indiquant, si je ne me trompe pas, que le constructeur impose la valeur des 4 premiers bits (ici 1001) sans doute pour éviter d'aller piocher dans une adresse non valide (cf. la réponse de sevyc) et que l'utilisateur a le choix de spécifier la valeur des 3 derniers. Il peut donc potentiellement placer dans le système 2^3 = 8 capteurs de température.

    En précisant, ensuite, que le 8ème bit indique la direction du message.

    Qu'en pensez-vous ?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 233
    Points : 28 261
    Points
    28 261
    Par défaut
    c'est tout à fait ce qu'il faut faire car c'est ce qu'on trouve dans toute la littérature

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 910
    Points : 58 642
    Points
    58 642
    Billets dans le blog
    46
    Par défaut
    J'ai mis à jour l'article, merci à tous

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 10
    Points
    10
    Par défaut Remerciements
    Merci beaucoup pour ce tutoriel8 -)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Est-il possible d'épingler la discussion pour la retrouver plus facilement comme ça été fait pour les 2 autres articles sur Arduino ?

    Fait

  16. #16
    Membre éprouvé
    Avatar de landry161
    Homme Profil pro
    C#,PHP,MySQL,Android...
    Inscrit en
    Juillet 2010
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : C#,PHP,MySQL,Android...

    Informations forums :
    Inscription : Juillet 2010
    Messages : 423
    Points : 1 060
    Points
    1 060
    Billets dans le blog
    1
    Par défaut

  17. #17
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 3 ans plus tard ...
    toujours d' actualité.
    il faudra que j' y revienne pour comprendre, les opérations sur les bits, ...
    En pratique, le ds1621 semble plus précis que les dht, et plus rapide. Grâce à cet article écrire une classe pour le piloter est très simple.
    Fonctionne avec l' ESP8266-12E.
    Pas cher sur aliExpress (1.75 €)

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut vive internet
    Merci! Pour cet article. Vive internet, vive le partage d'informations et la vulgarisation de celles-ci! Au top!

Discussions similaires

  1. bus I2C avec compilateur c de CCS
    Par damousino dans le forum C
    Réponses: 3
    Dernier message: 23/02/2009, 20h14
  2. Bus I2C entre Zigbee et PCF8575
    Par seicom2008 dans le forum C
    Réponses: 0
    Dernier message: 01/02/2008, 12h52
  3. Creer un bus I2c en C++
    Par ToMs dans le forum C++
    Réponses: 3
    Dernier message: 28/03/2006, 18h10
  4. acceder au bus i2c avec visual c++
    Par ledaker dans le forum MFC
    Réponses: 1
    Dernier message: 06/03/2006, 11h43

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