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

Raspberry Pi Discussion :

Lire les ports d'un expandeur de bus MCP23016


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Lire les ports d'un expandeur de bus MCP23016
    bonjour,
    je dois utiliser un expandeur de bus I2C MCP23016 avec la librairie wiringPiI2C sur mon système.
    I2cdetect détecte le MPC sans problème entre les adresses de base 0x20 et 0x27 mais mon programme retourne généralement la valeur -1.

    J'ai écrit ces lignes dans un programme de test pour lire les entrées du port GP0:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <mcp23016.h>
    #include <wiringPi.h>
    #include <wiringPiI2C.h>
     
    using namespace std;
     
    int main()
    {
      int fd;
     
      fd = wiringPiI2CSetup(0x27) ;
      mcp23016Setup(66, 0x27);
     
      wiringPiI2CWriteReg16(fd, 0x04, 0x00);	//Input_Polarity_Register
      wiringPiI2CWriteReg16(fd, 0x06, 0xff); 	//GP0 as input port
      cout << " Read GP0 : " << wiringPiI2CReadReg8(fd, 0x00) << endl;
     
      return(0);
    }

    Quelques fois, je lis la bonne valeur mais le plus souvent, je lis -1.
    Sur la sortie TP du MCP23016, j'ai un beau signal carré à 1,3MHz.
    Si quelqu'un a déjà mis en oeuvre ce composant, je suis preneur d'une solution.

    Merci.

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


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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 762
    Points : 58 019
    Points
    58 019
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    Tu peux rajouter des affichages pour voir d'où vient l'erreur exactement :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <errno.h>
    ...
     
    fd = wiringPiI2CSetup(0x27) ;
     
    if (fd==-1) {cout << "erreur ici" << endl;}
     
    ...
     
    int a=wiringPiI2CWriteReg16(fd, 0x04, 0x00);	//Input_Polarity_Register
    if (a==-1) {cout << "erreur là, errno = " << errno << endl;}
     
    ...

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonjour et merci pour la réponse,
    j'avais exploité dans la foulée la valeur de errno dans un appel à perror() et j'ai systématiquement une erreur 121 Remote I/O error.
    Pour l'instant, je ne comprend pas d'où ça sort. Le MCP 23016 est seul sur la carte avec ses 3 résistances de configuration d'adresse et son bus I2C. Je l'alimente avec le +5v issu du Raspberry.
    J'investigue mais je n'ai pas trop d'idées. Je farfouille sur le Net.

    Merci.

  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
    Salut,
    Donc tu dis que ça fonctionne par moment ?
    On peut voir ton schéma de câblage, le schéma exacte avec tout dessus ?

    A+

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    bonjour,
    voici la partie I2C de ma carte que je teste pour l'instant sur une breadboard n'ayant pas encore le PCB.
    Nom : partieI2C.jpg
Affichages : 739
Taille : 34,3 Ko
    Le connecteur J3 est relié aux broches SDA et SCL du Raspberry. Pas de cavaliers sur J5.
    J'utilise l'alimentation +5v du Raspberry et je positionne les entrées des ports GP0 et GP1 par straps.
    SDA et SCL sont à 3,7v (pull-up du Raspberry), je vais tenter d'alimenter le MCP23016 avec l'alim 3,3v du Raspberry.

    Je ne vais quand même pas mettre en cause les fonctions WiringPi...
    Je fais ma manip et je rend compte.

    Merci.

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Re,
    j'ai alimenté l'expandeur de bus en 3,3v en provenance du Raspberry.
    Plus aucune erreur à l'exécution de mon programme mais j'ai toujours 255 à la lecture du port GP0.
    J'ai laissé GP0 en entrée et programmé GP1 en sortie avec une led sur le bit 0 de GP1.
    Les bits 0 et 1 de GP0 sont forcés à 0, les bits 2 et 3 à +3,3v.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    int main()
    {
      int fd, retour = 0, i;
    
      fd = wiringPiI2CSetup(0x27);
      if(fd < 0)
      {
        perror("wiringPiI2CSetup");
        exit(-1);
      }
      retour = mcp23016Setup(80, 0x27);
     
      retour = wiringPiI2CWriteReg16(fd,0x04,0x00); //sorties non inversees
      if(retour == -1)
        perror("pb sorties non inversees");
    
      retour = wiringPiI2CWriteReg8(fd,0x06,0xff); //GP0 en entree
      if(retour == -1)
        perror("pb GP0 en entree");
    
      retour = wiringPiI2CWriteReg8(fd,0x07,0x00); //GP1 en sortie
      if(retour == -1)
        perror("pb GP1 en sortie");
    
      cout << "Read du Registre GP0 : " << wiringPiI2CReadReg8(fd,0x00) << endl;
      for(i=0; i<20; i++)
      {
        retour = wiringPiI2CWriteReg8(fd, 0x01, i%2);
        if(retour == -1)
          perror("pb pilotage led");
        sleep(1);
      }
      return(0);
    }
    La led clignote mais je ne comprend pas pourquoi je ne vois pas les 2 bits de poids faibles à 0 sur le "Read du Registre GP0". Si j'avais eu 0x00 comme résultat, j'aurais compris que le MCP23016 n'est peut être pas trop à l'aise en 3,3v et qu'il interprète ce niveau en entrée comme un 0.
    Peut être un adaptateur de niveau sur le bus I2C pour continuer à alimenter le MCP en +5v (genre TCA9406) ?

    Merci pour vos avis.

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

Discussions similaires

  1. Lire les ports com1 et com2
    Par biquet dans le forum LabVIEW
    Réponses: 4
    Dernier message: 04/11/2008, 16h31
  2. Lire les données sur un port //
    Par gastoncs dans le forum Périphériques
    Réponses: 1
    Dernier message: 20/08/2008, 22h40
  3. Lire les données du port série RS232
    Par Sytchev3 dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2008, 08h47
  4. Réponses: 20
    Dernier message: 16/11/2007, 12h29
  5. lire les données sur un port RS232
    Par xave dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2005, 16h40

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