Problème de lecture température LM75 sur bus I2C
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Problème de lecture température LM75 sur bus I2C



  1. #1
    invitec6c4cac3

    Problème de lecture température LM75 sur bus I2C


    ------

    Bonjour,

    J'ai un problème pour lire la température du capteur LM75.
    En effet, j'ai un projet et je dois faire la lecture de la température
    du capteur branché sur un module APF9328 armadeus via le bus I2C.
    Quand je regarde les signaux SCL et SAD sur l'oscilloscope, je vois
    bien que l'adresse envoyée est bien reçue mais que l'acquisition n'est
    pas bonne. Je ne sais pas si c'est le programme ou au niveau du
    capteur. Je fais la compilation sous linux via le terminal mais le
    programme s'arrête à ce niveau:

    Code:
    // write the desired register address
        if ( ioctl( fd, I2C_SLAVE, addr) < 0 ){
            printf("Write error\n");
    Voici mon programme de lecture:

    Code:
    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdint.h>
    
    #include <linux/i2c.h> 
    #include <linux/i2c-dev.h>
     
    #include <sys/ioctl.h>
     
    int fd;
    
    int read_byte( int fd,unsigned char addr, unsigned char reg, unsigned char *buf )
    { 
        buf [32];
        // create an I2C write message (only one byte: the address)
        struct i2c_msg msg = {addr, 1, 1, buf };
        // create a I2C IOCTL request
        struct i2c_rdwr_ioctl_data rdwr = { &msg, 1 };
     
        buf[0] = reg; // select reg to read
     
        // write the desired register address
        if ( ioctl( fd, I2C_SLAVE, addr) < 0 ){
            printf("Write error\n");
            return -1;
        }
        msg.len = 2;
        buf[0]=0;
        buf[1]=0;
        msg.flags = I2C_M_RD; // read
        
     
        // read the result and write it in buf[0]
        if ( ioctl( fd, I2C_SLAVE, addr ) < 0 ){
            printf("Read error\n");
            return -1;
        }
        printf("bufs %02x -> %02x\n", buf[0], buf[1]);
        return (((unsigned char)buf[0])<<8 | ((unsigned char)buf[1]) );
        
        //return 0;
    }
     
    /* i2cread i2c-devfile addr*/
    int main(int argc, char **argv){
      unsigned char buf;
      unsigned char addr;
      unsigned char subaddr;
      unsigned char value;
     
      if(argc != 4){
        printf("wrong args numbers\nsyntaxe (hexa) :\ni2cread i2c-devfile addr subaddr\n");
        return -1;
      }
     
      fd = open(argv[1],O_RDWR);
      if(fd < 0){
        printf("can't open %s\n",argv[1]);
        return -1;
      }
      addr =    (unsigned char )strtol(argv[2], (char **)NULL, 16);
      subaddr =    (unsigned char )strtol(argv[3], (char **)NULL, 16);
     
      read_byte(fd,addr, subaddr, &buf); 
     
      printf("Read component %02x at subaddress %02x -> %02x\n",addr,subaddr,buf);
      return value;
    }
    D'avance merci pour vos réponses
    Dseven

    Prière à l'avenir de ne pas oublier les balises code afin d'en faciliter la lecture

    -----
    Dernière modification par Jack ; 19/03/2012 à 15h24.

  2. #2
    inviteb06a0922

    Re : Problème de lecture température LM75 sur bus I2C

    Bonjour,

    Je viens pour savoir ou t'en es. Je travaille en ce moment sur un projet similaire. Mais, j'utilise par contre un capteur flexiforce et par l'entremise du pcf8591, je veux récupérer les données issues du capteur, données qui seront transmises à travers le bus I2C à ma carte embarquée APF27dev. Aussi, j'ai élaboré un programme similaire au tien. Ainsi, je voudrais savoir comme lorsque tu fais une analyse de signaux, tu constates que le device choisi lors de l'exécution c'est-à-dire l'adresse de l'esclave est la bonne. Dis-moi s'il te plait, laquelle des adresses as-tu rentré? celle du pcf8591 c'est-à-dire "0x48" ou celle à laquelle on ajoute le bit "R/W" à l'occurrence dans notre cas, celui de la lecture, "0x91".

    En faisant quelques recherches et la lecture du data sheet du pcf8591 nous dit que ce derniers ne possède pas à proprement dit des registres spécialisés pour l'écriture ou la lecture. Les seuls registres que possèdent le pcf8591 est celui de "Byte Control", l'octet de contrôle permettant de gérer la lecture des entrées AIN0,1..., l'activation de l'auto-incrémentation, l'activation du mode différentiel ou pas, etc.

    Je suis confronté au même problème mais je n'ai pas avec moi un oscilloscope pour visionner les signaux issus de SDA ou CLK. Et lors de l'exécution du programme, j'ai toujours cette condition dans la fonction read_byte qui est vérifiée, du coup, le programme s'arrête là.

    Si t'as trouvé une solution, pourrais-tu la partager??

    Merci

Discussions similaires

  1. Problème sur bus I2C : driver ??
    Par Poseidon88 dans le forum Électronique
    Réponses: 12
    Dernier message: 06/12/2011, 17h40
  2. Différences de valeur entre plusieurs capteurs de température LM75
    Par invite3570b5f7 dans le forum Électronique
    Réponses: 15
    Dernier message: 18/09/2011, 21h10
  3. Problème de bus I2C
    Par invited67456b2 dans le forum Électronique
    Réponses: 6
    Dernier message: 28/02/2009, 11h57
  4. Plusieurs LM75 sur un bus I2C
    Par invitec330b05b dans le forum Électronique
    Réponses: 2
    Dernier message: 13/09/2008, 07h48
  5. bus I2C soucis de lecture
    Par invited2746380 dans le forum Électronique
    Réponses: 3
    Dernier message: 24/04/2007, 13h58
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...