pic24fJ128GA010 communication I2C
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

pic24fJ128GA010 communication I2C



  1. #1
    jules38410

    pic24fJ128GA010 communication I2C


    ------

    Bonjour, je veux faire communiquer mon pic24f avec une EEPROM 24LC256 en I2C mais apres avoir testé mon code , il ne marche pas, le probléme vient de l'I2C car mes 2 lignes SDA et SCL sont niveaux haut et ne bougent pas.
    J'ai pourtant tout configuré comme il est expliqué dans la datasheet du pic , je ne comprend pas.

    Voici ma librairie I2C:


    Code:
    // Prototypes des fonctions pour gestion I2C
    void i2c_init(void);
    void i2c_start(void);
    void i2c_repeat_start(void);
    void i2c_stop(void);
    void i2c_ack(void);
    void i2c_error(void);
    void i2c_ecrire(char i2c_octet);
    char i2c_lire(char ack);
    //Stockage de données dans l'EEPROM
    void stocker(char adresseH, char adresseL,char data);
    //Lecture de données dans l'EEPROM
    char lire(char adresseH,char adresseL);
    
    ////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////
    // Utilisation Module interne pour Communication I2C  //////////////////////////////////////////////////
    // Utilisation Horloge interne (4 MHz) ////////
    ///////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////
    void i2c_init(void)
    {
    
       I2C1BRG = 39; // fonctionnement 100kHz pour horloge interne de 4MHz
       I2C1CONbits.I2CEN = 0;	// Disable I2C Mode
       I2C1CONbits.DISSLW = 1;	// Disable slew rate control
       IFS1bits.MI2C1IF = 0;	 // Clear Interrupt
       I2C1CONbits.I2CEN = 1;	// Enable I2C Mode
    
    }
    
    //////////////////////////////////////////////////////////////////////////
    void i2c_start(void)
    {
            I2C1CONbits.SEN=1;						// Start I2C
    	while (I2C1CONbits.SEN==1);				// Test: fin de transmission
    }
    
    //////////////////////////////////////////////////////////////////////////
    void i2c_repeat_start(void)
    {
    	I2C1CONbits.RSEN=1;						// Repeat-Start I2C
    	while (I2C1CONbits.RSEN==1);			// Test: fin de transmission
    }
    
    //////////////////////////////////////////////////////////////////////////
    void i2c_stop(void)
    {
            I2C1CONbits.PEN=1;						// Stop I2C
    	while (I2C1CONbits.PEN==1);				// Test: fin de transmission
    }
    
    //////////////////////////////////////////////////////////////////////////
    void i2c_error(void)
    {
    }
    
    //////////////////////////////////////////////////////////////////////////
    //void i2c_ack(void)
    //{
    //	if (ACKSTAT==1)				// Pas de réception acknowledge de l'esclave
    //		i2c_error();
    //}
    
    //////////////////////////////////////////////////////////////////////////
    void i2c_ecrire(char i2c_octet)
    {
    	 I2C1TRN=i2c_octet;			// Envoie octet vers esclave
    	while (I2C1STATbits.R_W==1);				// Attente fin transmission
    
            
    }
    
    //////////////////////////////////////////////////////////////////////////
    char i2c_lire(char ack)			// ack=0: Acknowledge; ack=1: No Acknowledge
    {
    	char	octetlu;
    	I2C1CONbits.RCEN=1;						// Réception de l'octet émis par esclave
    	while (I2C1CONbits.RCEN==1);			// Test fin de transmission
    	if (ack==0)
    		I2C1CONbits.ACKDT=0;
    	else
    		I2C1CONbits.ACKDT=1;
    	I2C1CONbits.ACKEN=1;					// Envoie acknowledge avec valeur de ACKDT
    	while (I2C1CONbits.ACKEN==1);			// Test fin de transmission
    	octetlu= I2C1RCV;
    	return(octetlu);
    }
    
    
    //Stockage de données dans l'EEPROM
    void stocker(char adresseH,char adresseL, char data)
    {
        i2c_start();
        i2c_ecrire(0xA0);
        i2c_ecrire(adresseH);
        i2c_ecrire(adresseL);
        i2c_ecrire(data);
        i2c_stop();
        
    }
    
    //Lecture de données dans l'EEPROM
    char lire(char adresseH,char adresseL)
    {
        int data;
        i2c_start();
        i2c_ecrire(0xA0);
        i2c_ecrire(adresseH);
        i2c_ecrire(adresseL);
        i2c_start();
        i2c_ecrire(0xA1);
        data=i2c_lire(0);
        i2c_stop();
        return(data);
    }

    -----

  2. #2
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    Bonjour,

    Où est ton fichier.c?

  3. #3
    jules38410

    Re : pic24fJ128GA010 communication I2C

    J'en ai plusieurs, que ve tu savoir ? Je ne comprend pas à quoi il peut te servir.

  4. #4
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    Pour savoir où tu bloques

  5. A voir en vidéo sur Futura
  6. #5
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Voila je pense que c'est cela que tu voulais mais il n'y a rien je teste juste ma fonction et mon ecran m'affiche 0 pour b, le programme n'est pas bloqué dans une boucle.


    Code:
    int16_t main(void)
    {  
    
        /* Configure the oscillator for the device */
        ConfigureOscillator();
    
        /* Initialize IO ports and peripherals */
        InitApp();
    
        /* TODO <INSERT USER APPLICATION CODE HERE> */
     
     InitLCD();
     int b ;
     afftext("bonjour");
    stocker(0x00,0x01, 5);
    b=lire(0x00,0x01);
    affmotdec(b);
    
    
    }

  7. #6
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    Ton programme est trop incomplet pour faire communiquer ton EEPROM.

  8. #7
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Pourrais tu expliquer un peu plus stp, je pense que le probléme vient de ma librairire I2C il n' y a aucun signaux qui circule SDA et SCL sont bloqués niveau haut je ne vois pas le rapport avec mon main qui sert juste à tester cette fonction.
    Merci.

  9. #8
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    On est pas censé touché aux librairies. Il faut juste savoir les utiliser correctement

  10. #9
    jules38410

    Re : pic24fJ128GA010 communication I2C

    c'est moi qui l'ai crée de a à z en regardant la datasheet du pic c'est pour cela que je demande de l'aide car il y a surement un probléme dedans.

  11. #10
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    Ah ok je regarde.
    Je me renseigne comment créer une librairie car j'ai jamais fait ça.

  12. #11
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Voici la doc du pic si cela peut aider quelqu'un ou il "explique" comment configurer le mode i2c.

    Le document est sous Copyright il ne peut être validé, Cram 64.
    Dernière modification par Cram 64 ; 18/06/2014 à 15h29.

  13. #12
    futhier9178

    Re : pic24fJ128GA010 communication I2C

    Comment tu m'embrouilles c'est pas une librairie alors que tu as écrit.
    Il te manque pas de choses :
    -Quelle condition pour activer ton port I²C
    -Quelle condition pour l'arrêter
    ...

  14. #13
    jules38410

    Re : pic24fJ128GA010 communication I2C

    En informatique, une bibliothèque logicielle est une collection de fonctions, qui peut être déjà compilée et prête à être utilisée par des programmes.
    Après je peut me tromper en appelant cela ainsi...
    bref on va pas chipoter pour un nom ,et pour activer le port I2C :

    I2CEN: I2Cx Enable bit
    1 = Enables the I2Cx module and configures the SDAx and SCLx pins as serial port pins
    0 = Disables I2Cx module; all I2C™ pins are controlled by port functions

  15. #14
    spown

    Re : pic24fJ128GA010 communication I2C

    Bonjour/bonsoir est bienvenue sur FUTURA,

    Je t'encourage sur ce que t'as fait ( écrire la libraire ".h" ). Ca va t'aider mieux à comprendre ton uC ainsi I2C. Mais pour avoir quelque chose fonctionnelle et rapide, cherche ces 2 fichers " i2c.h" et "i2c.c" dans ton répertoire. D'ailleurs quel IDE et compilateur utilises tu ?

    Ca te manque quelque registre au niveau d'initialisation, essaye ca :
    Code:
    void i2c_init(void)
    {
    
       I2C1BRG = 39; // fonctionnement 100kHz pour horloge interne de 4MHz
       I2C1CON = 0x1200;	// Disable I2C Mode
       I2C1RCV = 0x0000;
       I2C1TRN = 0x0000;
       I2C1CON = 0x9200; // ON I2C	// Enable I2C Mode
    
    }
    J'ai pas verifié pour le reste, sinon il manque d'information dans ton fichier main ( PORT, TRIS, while...).

  16. #15
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Merci, de ton aide j'ai essayé avec ton init mais cela ne marche toujours pas.
    Pour le registre TRIS j'ai configurer SDA(RG3) et SCL(RG2) en entrée et je suis sous MPLAB X IDE v2.05.

  17. #16
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Bonjour, donc je me suis armé de mon oscillo et je suis donc aller voir ce qu'il se passe et j'arrive a envoyé des start, restart et des stop j'ai donc ensuite essayer ma fonction stocker mais il se trouve que je ne vois que le start, le 0xA0 et le stop et il n'envoie pas mon adresse et la data.

  18. #17
    jules38410

    Re : pic24fJ128GA010 communication I2C

    J'ai trouvé solution :
    Code:
     while(I2C1STATbits.TRSTAT==1);
    cette ligne attend la fin du transfertt de 8 bit + ACK
    néamoins la lecture ne s"effectue pas comme je le voudrais tout le dialogue i2c est juste quand je vérifie à l'oscilloscope mais la valeur retourné ne correspond à rien.
    help

  19. #18
    RISC

    Re : pic24fJ128GA010 communication I2C

    Salut,

    Il existe des exemples de code pour le PIC24FJ128GA010 pour les différents périphériques dont l'I2C.
    Tu les trouveras sur cette page : http://www.microchip.com/codeexamples ensuite tu filtres par famille et tu verras les codes CE3xx.
    Pour l'I2C regarde le CE311 (pour mémoire E2PROM I2C), CE323M, CE337

    a+

  20. #19
    jules38410

    Re : pic24fJ128GA010 communication I2C

    Tout d'abord, merci de répondre.
    Mais je crois que l'i2c fonctionne maintenant, et que le problème viendrait de mon EEPROM voir mes hypothèses en dessous.

    Et voici , un lien vers la datasheet de l'EEPROM:

    http://ww1.microchip.com/downloads/...eDoc/21203M.pdf

    En faite je ne suis pas sur de 2 truc quand j'utilise la fonction lire, le pointeur est sur la dernière adresse lue ou aussi sur la dernière écrite . Et quand j'utilise la fonction lireADR quand je refait le i2c_start je croie qu'il n'est pas prit en compte en regardant à l'oscillo.

    Et enfin quand j'utilise la fonction lireADR, j'ai remarqué que mon programme bloquait dans le test de fin de transmission de lecture, ce qui pourrait être du au fait que mon i2c_start qui n'est pas prit en compte l'instruction de lecture n'est pas envoyé à la EEPROM et quand le pic essaye de lire par la suite il ne reçoit rien donc attend.

Discussions similaires

  1. Power Line communication sur une ligne DC. Communication CAN
    Par invitee2723b34 dans le forum Électronique
    Réponses: 3
    Dernier message: 21/02/2012, 11h28
  2. Communication hid
    Par invite6a8b282c dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 20/10/2010, 13h32
  3. BTS Communication
    Par invite83f4eae0 dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 14/06/2010, 13h29
  4. communication au LHC
    Par Jiav dans le forum Discussions scientifiques
    Réponses: 81
    Dernier message: 08/02/2009, 18h51
  5. communication
    Par invite2e883e8f dans le forum Électronique
    Réponses: 0
    Dernier message: 07/11/2008, 07h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.