Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

I2C et EEPROM
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#1 Message par Gérard » dim. 14 juin 2020 21:45

Bonjour à tous,

Code : Tout sélectionner


    I2C2_START
()
    I2C2_WR(%10100000)                 'EEPROM adr 000
    I2C2_WR(ADR_H)
    I2C2_WR(ADR_L)
    ...
    


Code : Tout sélectionner


    I2C2_START
()
    I2C2_WR(%10100000)                 'EEPROM adr 000
    I2C2_WR(H_MN_BIN)
    ...
    


ADR : adresse de l'EEPROM sur 16 bit
ADR_H : poids fort de l'adresse
ADR_L : poids fable de l'adresse

Est-il possible d'utiliser la 2e façon d'écrire pour envoyer l'adresse en une seule ligne de code ou faut-il obligatoirement utiliser la 1re solution?

Merci pour vos idées.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

I2C et EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » lun. 15 juin 2020 11:16

bonjour,



on ne peut pas envoyer une valeur 16 bits directement via I2C
il faut donc decomposer en bytes

envoi de la valeur x 16 bits
en C
EEPROM_Write(Address,Lo(x));
EEPROM_Write(Address+1,Hi(x));

lecture valeur 16 bits
Lo(x):=EEPROM_Read(Address);
Hi(x):=EEPROM_Read(Address+1);


attention avec les EEPROM de grande capacité
notion de pages et Bank de pages.
La longueur de page depend du type d'eeprom page de 32,64,128 ou 256bytes
un tampon RAM correspondant à la page , permet d'eviter de trop grand nombre d'ecriture
en ne sauvant les donnees que modulo page..
exemple avec un datalogger

exemple en C pour Eeeprom 128Kbytes

Code : Tout sélectionner


void Read_Page_From_24FC1026
(unsigned int Page)
{
 
unsigned int Ad;
 
unsigned char Is;
 
unsigned char err;
 
erreurs=0;
 if(
GIE_bitIs=1;
 
GIE_bit=0;
 
err=0;
 
// 1er Bloc eeprom de 512 pages  si Bx=0 => device adresse=0xA4 (avec A2=0 at A1=1)
 // 2em Bloc eeprom de 512 pages si Bx=1 => Device adresse=0xA6  (avec A2=0 at A1=1)
  
Ad=(Page/512)<<1;    // soit 0 ou 2
 
Device_AdresseEEPROM_128K_ADR Ad;
 
sprintf(txt,"read page %05u From Device adresse %04X \r\n",Page,(int)Device_Adresse);
 
UART1_Write_Text(txt);
 
Ad=Page 128 ;
 
I2C1_Start();
 
err=I2C1_Wr(Device_Adresse );      // write
 
err=I2C1_Wr(Hi(Ad));    // send data (data to be written)
 
err=I2C1_Wr(Lo(Ad));
 if (
err>0erreurs++;
 
I2C1_Repeated_Start();
 
err=I2C1_WrDevice_Adresse+);  // Read
 
I2C1_Is_Idle();
 for (
Ad=0;Ad<126;Ad++)
 {
  
Page_Eeprom[Ad]=I2C1_Rd(1u);    // data to be read)
 
}
 
Page_Eeprom[Ad]=I2C1_Rd(0u);    // data to be read)
 
I2C1_Stop();
 
I2C1_Is_Idle();
 
Delay_ms(50);
 if (
Is==1)GIE_bit=1;
}

 
Aide toi, le ciel ou FantasPic t'aidera

I2C et EEPROM
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#3 Message par Gérard » lun. 15 juin 2020 15:53

Je me suis mal exprimé, il s'agit d'une EEPROM programmée dont je souhaite récupérer les valeurs.
Avant de lire, il faut envoyer l'adresse que l'on souhaite lire d'où ma question.

Si je comprends bien, il faut envoyer cette adresse par octet avec l'octet de poids fort en 1er. J'ai juste?
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

I2C et EEPROM
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mar. 16 juin 2020 18:18

Gérard a écrit :Je me suis mal exprimé, il s'agit d'une EEPROM programmée dont je souhaite récupérer les valeurs.
Avant de lire, il faut envoyer l'adresse que l'on souhaite lire d'où ma question.

Si je comprends bien, il faut envoyer cette adresse par octet avec l'octet de poids fort en 1er. J'ai juste?


oui,

c'est l'adresse (ou deplacement dans l'eeprom) où on veut ecrire ou lire
err=I2C1_Wr(Hi(Ad));
err=I2C1_Wr(Lo(Ad));


sachant qu'on ecrit à l'adresse DEVICE
et qu'on lit à l'adresse DEVICE+1
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 25 invités