Programmation I2C - C - Programmation
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
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