+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Responsable Corrections

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 622
    Points : 34 113
    Points
    34 113
    Billets dans le blog
    9

    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 : 1234
Taille : 97,1 Ko

    Bonne lecture



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

  2. #2
    Expert éminent
    Avatar de Auteur
    Profil pro
    Inscrit en
    avril 2004
    Messages
    6 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 6 706
    Points : 9 048
    Points
    9 048

    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 Corrections

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 622
    Points : 34 113
    Points
    34 113
    Billets dans le blog
    9

    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 : 1162
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 Corrections

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 622
    Points : 34 113
    Points
    34 113
    Billets dans le blog
    9

    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
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 640
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 640
    Points : 7 754
    Points
    7 754

    Par défaut

    Citation Envoyé par f-leb Voir le message
    Nom : slaveaddressmcp4017.JPG
Affichages : 1162
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 ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Responsable Corrections

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 622
    Points : 34 113
    Points
    34 113
    Billets dans le blog
    9

    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
    8 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 974
    Points : 23 810
    Points
    23 810

    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.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Modérateur
    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    1 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 1 647
    Points : 5 160
    Points
    5 160

    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 !
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  9. #9
    Expert éminent
    Avatar de Auteur
    Profil pro
    Inscrit en
    avril 2004
    Messages
    6 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 6 706
    Points : 9 048
    Points
    9 048

    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
    8 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 974
    Points : 23 810
    Points
    23 810

    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
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  11. #11
    Expert éminent
    Avatar de Auteur
    Profil pro
    Inscrit en
    avril 2004
    Messages
    6 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 6 706
    Points : 9 048
    Points
    9 048

    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
    8 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 974
    Points : 23 810
    Points
    23 810

    Par défaut

    c'est tout à fait ce qu'il faut faire car c'est ce qu'on trouve dans toute la littérature
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  13. #13
    Responsable Corrections

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 622
    Points : 34 113
    Points
    34 113
    Billets dans le blog
    9

    Par défaut

    J'ai mis à jour l'article, merci à tous

  14. #14
    Futur Membre du Club
    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 : 9
    Points
    9

    Par défaut Remerciements

    Merci beaucoup pour ce tutoriel8 -)

  15. #15
    Expert éminent
    Avatar de Auteur
    Profil pro
    Inscrit en
    avril 2004
    Messages
    6 706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 6 706
    Points : 9 048
    Points
    9 048

    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
    406
    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 : 406
    Points : 1 013
    Points
    1 013
    Billets dans le blog
    1

    Par défaut


Discussions similaires

  1. bus I2C avec compilateur c de CCS
    Par damousino dans le forum C
    Réponses: 3
    Dernier message: 23/02/2009, 19h14
  2. Bus I2C entre Zigbee et PCF8575
    Par seicom2008 dans le forum C
    Réponses: 0
    Dernier message: 01/02/2008, 11h52
  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