Communication I2C avec un MCP3421 - C - Programmation
MarshPosté le 12-03-2012 à 14:44:57
Bonjour, J'ai un souci de communication avec mon MCP3421 18-Bit Analog-to-Digital Converter Voila une parti du programme que j'ai écris pour communiquer avec l'i2C :
printf((const far rom char *)"\n\n\n\n\n\n\n\n " ); printf((const far rom char *)"\n\r/--------------------------------------------------------/\n" ); printf((const far rom char *)"\n\r/---------------------- Test MCP3421 --------------------/\n" ); printf((const far rom char *)"\n\r/--------------------------------------------------------/\n" );
//Initialisation des différent tableau utilisé
for(a = 0; a <= 3; a++) { valeur[a]=0; }
//On met le MCP3421 en mode High Speed SSPCON2bits.SEN=1; while(PIR1bits.SSPIF==0); PIR1bits.SSPIF=0; // normalement il faudrait lire et traiter ACK
SSPBUF=0x08; while(PIR1bits.SSPIF == 0);
PIR1bits.SSPIF=0; SSPCON2bits.PEN=1;
while(1) {
printf((const far rom char *)"\n\n\n\n\n\n" ); for(a = 0; a <= 3; a++) { printf((const far rom char *)"\n\rValeur de valeur[%d] : %X \n",a,valeur[a]); }
printf((const far rom char *)"\n\rLecture d'une nouvelle valeur du MCP3421 ?\n" ); printf((const far rom char *)"\n\r1 - Oui lecture" ); printf((const far rom char *)"\n\r2 - Non ecriture\n" ); do { data=RS232ReadByte(); }while(data!='1' & data != '2'); Emi_Rs232(data);
SSPBUF=0xD0; while(PIR1bits.SSPIF == 0); while(SSPCON2bits.ACKSTAT==1);//On attend ACK de MCP3421 PIR1bits.SSPIF=0;
SSPCON2bits.RCEN=1;//1= Enables Receive mode for I2C On change le mode
while(PIR1bits.SSPIF==0); valeur[0]=SSPBUF;//On charge ce que l'on recoi dans le tableau PIR1bits.SSPIF=0; SSPCON2bits.ACKDT=0; //On dit que l'on veut un ack SSPCON2bits.ACKEN=1; //On envoi l'ack
} else if(data=='2')/* Ecriture */ { IdleI2C(); // ensure module is idle StartI2C(); IdleI2C(); /* Envoie du 1er Octet "SLAVE ADRESS" : */ WriteI2C(0b11010000); // Send and Check SLAVE ADRESS, wait for it to complete
/* Envoie du 2ème Octet "INSTRUCTION BYTE" : */ IdleI2C(); // ensure module is idle WriteI2C(0b10001100); // Send and Check INSTRUCTION BYTE, wait for it to complete IdleI2C(); // ensure module is idle
StopI2C(); } }
Les valeurs que j'ai enregistrées sont 0xFF dans mon tableau. je ne comprend pas pourquoi il ne m'envoie rien. quelqu'un a déjà utilisé ce convertisseur et pourrai m'aider? Merci
Marsh Posté le 12-03-2012 à 14:44:57
Bonjour, J'ai un souci de communication avec mon MCP3421 18-Bit Analog-to-Digital Converter
Voila une parti du programme que j'ai écris pour communiquer avec l'i2C :
printf((const far rom char *)"\n\n\n\n\n\n\n\n " );
printf((const far rom char *)"\n\r/--------------------------------------------------------/\n" );
printf((const far rom char *)"\n\r/---------------------- Test MCP3421 --------------------/\n" );
printf((const far rom char *)"\n\r/--------------------------------------------------------/\n" );
//Initialisation des différent tableau utilisé
for(a = 0; a <= 3; a++)
{
valeur[a]=0;
}
//On met le MCP3421 en mode High Speed
SSPCON2bits.SEN=1;
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0; // normalement il faudrait lire et traiter ACK
SSPBUF=0x08;
while(PIR1bits.SSPIF == 0);
PIR1bits.SSPIF=0;
SSPCON2bits.PEN=1;
while(1)
{
printf((const far rom char *)"\n\n\n\n\n\n" );
for(a = 0; a <= 3; a++)
{
printf((const far rom char *)"\n\rValeur de valeur[%d] : %X \n",a,valeur[a]);
}
printf((const far rom char *)"\n\rLecture d'une nouvelle valeur du MCP3421 ?\n" );
printf((const far rom char *)"\n\r1 - Oui lecture" );
printf((const far rom char *)"\n\r2 - Non ecriture\n" );
do
{
data=RS232ReadByte();
}while(data!='1' & data != '2');
Emi_Rs232(data);
/* Lecture */
if(data=='1')
{
SSPCON2bits.SEN=1;
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
SSPBUF=0xD0;
while(PIR1bits.SSPIF == 0);
while(SSPCON2bits.ACKSTAT==1);//On attend ACK de MCP3421
PIR1bits.SSPIF=0;
SSPCON2bits.RCEN=1;//1= Enables Receive mode for I2C On change le mode
while(PIR1bits.SSPIF==0);
valeur[0]=SSPBUF;//On charge ce que l'on recoi dans le tableau
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=0; //On dit que l'on veut un ack
SSPCON2bits.ACKEN=1; //On envoi l'ack
while(PIR1bits.SSPIF==0);
valeur[1]=SSPBUF;
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=0;
SSPCON2bits.ACKEN=1;
while(PIR1bits.SSPIF==0);
valeur[2]=SSPBUF;
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=0;
SSPCON2bits.ACKEN=1;
while(PIR1bits.SSPIF==0);
valeur[3]=SSPBUF;
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=1;
SSPCON2bits.ACKEN=1;
while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
SSPCON2bits.PEN=1;
}
else if(data=='2')/* Ecriture */
{
IdleI2C(); // ensure module is idle
StartI2C();
IdleI2C();
/* Envoie du 1er Octet "SLAVE ADRESS" : */
WriteI2C(0b11010000); // Send and Check SLAVE ADRESS, wait for it to complete
/* Envoie du 2ème Octet "INSTRUCTION BYTE" : */
IdleI2C(); // ensure module is idle
WriteI2C(0b10001100); // Send and Check INSTRUCTION BYTE, wait for it to complete
IdleI2C(); // ensure module is idle
StopI2C();
}
}
Les valeurs que j'ai enregistrées sont 0xFF dans mon tableau. je ne comprend pas pourquoi il ne m'envoie rien. quelqu'un a déjà utilisé ce convertisseur et pourrai m'aider? Merci