Bonjour à tous,
Je travaille actuellement sur la carte picdem2 de chez microship et je rencontre quelque difficulté avec l'EEPROM I²C 24LC256. Je programme en C, et j'ai réalisé deux fonction: une d'ecriture l'autre de lectrure. Mon programme principale enregistre une valeur dans l'eeprom, la lit et l'affiche sur ecran LCD. Le programme s'execute normalement dans un premier temps , le lcd affiche bien la valeur stocké à l'adresse 0 de l'eeprom. Le souci arrive lorsqu'il s'agit de réenregistrer au même endroit mémoire ( car ma fonction d'ecriture n'ecrit qu'à l'adresse 0). En effet, lors de la deuxieme emission, l'EEPROM n'envoi pas le ACK et mon pic est donc sans cesse en attente. Je sais que le pointeur interne de l'eeprom est automatiquement incrémenté mais alors comment faire pour ecrire au debut a l'@ 0 puis ensuite à la suite comme il est normal de faire. je suis un peu perdu, merci beaucoup pour vos informations. voici mon code :Code:void emis_I2C(int composant,int donnee) { SEN=1; // Start condition while(SEN==1){;} // attente fin d'opération Start SSPBUF= ( EEPROM1 | 0 );// charge adresse de l'EEPROM pour qu'elle se reconnaisse avec RW=0 écriture while(STAT_BF==1){;} // attente fin d'émission de l'adresse de l'EEPROM while(ACKSTAT==1)// attente du ACK de l'EEPROM { SEN=1; // Start condition while(SEN==1){;} // attente fin d'opération Start SSPBUF= ( EEPROM1 | 0 );// charge adresse de l'EEPROM pour qu'elle se reconnaisse avec RW=0 écriture while(STAT_BF==1){;} // attente fin d'émission de l'adresse de l'EEPROM } SSPBUF=0; // initialisation poids fort du pointeur de l'EEPROM while(STAT_BF==1){;} // attente fin d'émission de l'adresse MSB while(ACKSTAT==1){;} // attente du ACK de l'EEPROM SSPBUF=0; // initialisation 2 des poids faibles du pointeur de l'EEPROM while(STAT_RW==1){;} // attente fin d'émission de l'adresse LSB while(ACKSTAT==1){;} // attente du ACK de l'EEPROM SSPBUF=donnee; // on charge la donnée à enregistrer dans l'EEPROM while(STAT_RW==1){;} // on attends la fin d'émission de la donnée PEN=1; // envoi le stop condition while(PEN==1){;} // on attends la fin du stop condition, evoi terminé } int lect_I2C(int composant) { SEN=1; // Start condition while(SEN==1){;} // attente fin d'opération Start SSPBUF= (composant | 0 ); // charge adresse de l'EEPROM pour qu'elle se reconnaisse avec RW=0 écriture while(STAT_BF==1){;} // attente fin d'émission de l'adresse de l'EEPROM while(ACKSTAT==1){;} // attente du ACK de l'EEPROM SSPBUF=0; // initialisation poids fort du pointeur de l'EEPROM while(STAT_BF==1){;} // attente fin d'émission de l'adresse MSB while(ACKSTAT==1){;} // attente du ACK de l'EEPROM SSPBUF=0; // initialisation 2 des poids faibles du pointeur de l'EEPROM while(STAT_BF==1){;} // attente fin d'émission de l'adresse LSB while(ACKSTAT==1){;} // attente du ACK de l'EEPROM RSEN=1; // envoi RE-start condition while(STAT_BF==1){;} // attente fin d'émission du repete startcondition SSPBUF= ( composant | 1 ); // charge adresse de l'EEPROM pour qu'elle se reconnaisse avec RW=1 lecture while(ACKSTAT==1){;} // attente du ACK de l'EEPROM tempo10us (1); RCEN=1; // On valide la reception tempo10us (1); while(STAT_BF==0){;} // attente la fin de la reception, si BF=1, on a la donnnée dans SSPBUF b=SSPBUF; ACKEN=1; // on valide l'emission du ACK en mode reception ACKDT=1; // on envoi un NOACK pour dire, qu'on a bien recu l'octet PEN=1; // envoi le stop condition while(PEN==1){;} // on attends la fin du stop condition, evoi terminé return(SSPBUF); // on renvoi la donnée lue } // le programme principale: main() { init_lcd(); init_I2C(); TRISB0=0; //pour les led de PICDEM TRISB1=0; TRISB2=0; TRISB3=0; PORTB=0; while(1) { for(i=5;i<100;i++) { emis_I2C(EEPROM1,i); tempo1ms(100); a=lect_I2C(EEPROM1); sprintf(texte,"r=%d",a); puts_lcd(texte,0); tempo1ms(400); } } }
-----