Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1162 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programmation I2C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation I2C

n°1475324
Eagles Eye​s
Posté le 14-11-2006 à 16:48:07  profilanswer
 

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

mood
Publicité
Posté le 14-11-2006 à 16:48:07  profilanswer
 

n°1475362
Eagles Eye​s
Posté le 14-11-2006 à 17:52:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programmation I2C

 

Sujets relatifs
Programmation financièreprogrammation drivers reseau sous winows
Partiel de programmation (C++)programmation
Programmation socket CPB dans la programmation d'une FONCTION EXEL
programmationprogrammation
Concours de programmation : Prologin 2007programmation avec VBA
Plus de sujets relatifs à : Programmation I2C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR