Programmation I2C

Programmation I2C - C - Programmation

Marsh Posté le 14-11-2006 à 16:48:07    

Salut
Pour un projet je dois programmer le port I2C d'un ATMEGA32 pour lire et écrire dans un EEPROM (série 24cXXX). La partie écriture se passe correctement mais pour la lecture quand j'envoie la trame, l'EEPROM ne répond pas.
 
Voici le code d'écriture:
 
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);              // Start
while (!(TWCR & (1<<TWINT)));    // Attente de la transmission du start
 
TWDR = 0xA0;      // Adresse de l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWDR = 0x00;      // Adresse dans l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWDR = 0x00;      // Adresse dans l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWDR = 0xAA;        // Valeur a ecrire
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de la valeur
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);             // Stop

 
 
et voici celui de lecture
 
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);              // Start
while (!(TWCR & (1<<TWINT)));    // Attente de la transmission du start
 
TWDR = 0xA0;      // Adresse de l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWDR = 0x00;      // Adresse dans l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWDR = 0x00;      // Adresse dans l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));  
 
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);              // Start
while (!(TWCR & (1<<TWINT)));    // Attente de la transmission du start
 
TWDR = 0xA1;      // Adresse de l'EEPROM
TWCR = (1<<TWINT) | (1<<TWEN);    // Transmission de l'adresse
while (!(TWCR & (1<<TWINT)));    // Attente fin de travail
 
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);              // Stop

 
 
Apparemment, le micro n'attend pas la réception de la trame transmise pas l'EEPROM et passe directement au stop.L'EEPROM ne recevant plus d'horloge, elle ne peut donc pas envoyer sa trame.
 
Comment pourrais je faire pour continuer l'envoie de l'horloge avant que le stop n'arrive ??
 
Merci d'avance
 
 
Eagles

Reply

Marsh Posté le 14-11-2006 à 16:48:07   

Reply

Marsh Posté le 14-11-2006 à 17:52:19    

bon autant pour moi j'ai trouvé il manquait avant le stop le NOACK...
 
TWCR = 0x84;                           // NOACK
while (!(TWCR & (1<<TWINT))); // Attente fin de travail

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed