//***** fonction d'EMISSION
void emis2_I2C(unsigned char composant,int adresse,unsigned char donnee)
{
unsigned char LSB=0;
unsigned char MSB=0;
LSB= adresse & 0xFF; // Pour init du poids faible de pointeur
MSB= ( adresse & 0xFF00)>>8; // Pour init du poids fort de pointeur
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=MSB; // initialisation poids fort du pointeur de l'EEPROM
while(STAT_BF==1){;} // attente fin d'émission de l'adresse MSB
while(ACKSTAT==1)
{
SSPBUF=MSB;
while(STAT_BF==1){;}
} // attente du ACK de l'EEPROM
SSPBUF=LSB; // initialisation des poids faibles du pointeur de l'EEPROM
while(STAT_RW==1){;} // attente fin d'émission de l'adresse LSB
while(ACKSTAT==1)
{
SSPBUF=LSB;
while(STAT_RW==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é
}
//************* RECEPTION *************
unsigned char lect2_I2C(unsigned char composant,int adresse)
{
unsigned char LSB=0;
unsigned char MSB=0;
LSB= adresse & 0xFF; // Pour init du poids faible de pointeur
MSB= ( adresse & 0xFF00)>>8; // Pour init du poids fort de pointeur
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=MSB; // 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=LSB; // 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
RCEN=1; // On valide la reception
while(STAT_BF==1){;} // attente la fin de la reception, si BF=1, on a la donnnée dans 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
RCEN=0; // On valide la reception
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
}
// ************ P.P ********************
main()
{
init_lcd();
init_I2C();
while(1)
{
emis2_I2C(EEPROM1,i,z);
tempo1ms(10);
a=lect2_I2C(EEPROM1,i);
sprintf(texte,"valeur=%d",a);
puts_lcd(texte,0);
i++;
z++;
efface_lcd();
tempo1ms(400);
}
}