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); }
-----