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 ---
- 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 ---
Modérateur : Gérard
I2C et EEPROM
- Gérard
Expert- Messages : 1653
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
Bonjour à tous,
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.
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.
I2C et EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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_bit) Is=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_Adresse= EEPROM_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>0) erreurs++;
I2C1_Repeated_Start();
err=I2C1_Wr( Device_Adresse+1 ); // 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;
}
I2C et EEPROM
- Gérard
Expert- Messages : 1653
- Âge : 65
- Enregistré en : septembre 2015
- Localisation : Alsace - Haut-Rhin
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?
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?
I2C et EEPROM
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 37 invités