Je rencontre à mon tour un problème avec un écran I²C .
Pour une question d’intégration, je souhaite changé mon écran actue ( Lien ), qui fonctionne en I²C avec une adresse imposée qui est 0x78 et qui fonctionne très bien, par celui ci (Lien) .
Sur mon nouvel écran l'adresse est sélectionnable soit 0x78 soit 0x7A .Elle est configurée au dos avec une Résistance de 0 ohms indiquant que son adresse est mise sur 0x78 .
Donc théoriquement la même adresse que mon ancien écran, tous deux fonctionne en I²C , tout deux sont driver par un SSD1306 si je me trompe pas !
Je me suis dis, normalement ça devrait roulé, car la configuration est la même , donc l'initialisation aussi etc ...
Et ben que nini , mon nouvel écran reste noir !!!!! même pas un petit sourcillement !
J'ai essayé de googler pour trouver des infos, j'ai trouvé le même écran avec différents codes qui ont des adresses différentes , j'ai donc essayé en modifiant l'adresse sans conviction.... choux blanc avec les adresses 0x3C et 0x20 , 0x7A et 0x78 .
J'ai essayé de passer l'I²C à 100Khz aussi.
Voici une partie seulement du code qui nous concerne :
Normalement apres la configuration quand j'active l'ecran je devrais voir un petit sursaut de l'écran, même si aucune donnée est envoyé, hors j'ai l'impression qu'il reste éteint ......
Code : Tout sélectionner
#define adresse_W 0x78
#define adresse_R 0x79
#define Command 0x00
#define Data 0x40
-
-
//--------------------- Initialisation I2C ------------------
I2C1_Init(400000);
-
-
OLED_Conf();
OLED_Init();
//#####################################################################################
//########################## BOUCLE INFINIE ##################################
//#####################################################################################
while(1){
bla bla
}
//#############################################################################################
//############################ PROGRAMME SECONDAIRE ##################################
//#############################################################################################
//-------------------------------------------------------------------------------------------------
void OLED_Conf(){ // Configuration de l'écran
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse de l'esclave 0b01111000 + Write
I2C1_Wr (Command); // Command ou Data
I2C1_Wr (DISPLAYOFF); // écran éteint
I2C1_Stop();
delay_ms(10);
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse 0b01111000 + Write
I2C1_Wr (Command); // Command
I2C1_Wr(ADRESSAGE_MODE); // 0x20 Choix du Mode d'adressage Hori/vert/page
I2C1_Wr(0x00); // mode horizontal
I2C1_Stop();
delay_ms(10);
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse 0b01111000 + Write
I2C1_Wr (Command); // Command
I2C1_Wr(SSD1308_SETCONTRAST); // réglage du contraste
I2C1_Wr(0xf0); // Valeur Contraste
I2C1_Stop();
delay_ms(10);
Efface_ecran();
delay_ms(10);
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse de l'esclave 0b01111000 + Write
I2C1_Wr (Command); // Command
I2C1_Wr (DISPLAYON); // allume l'écran
I2C1_Stop();
delay_ms(10);
}
//-------------------------------------------------------------------------------------------------
// Cette fonction remplis l'écran de noir
// J'affecte la zone active à l'écran entier, et j'envoie des 0x00
void Efface_ecran(){
unsigned int LOC_Compteur=0; // Variable locale
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse 0b01111000 + Write
I2C1_Wr (Command); // Command ou Data
I2C1_Wr(ADRESS_COLONE); // Dit à l’écran qu'on lui envoie les limites de colonnes
I2C1_Wr(0); // Valeur 1ere colonne
I2C1_Wr(127); // Valeur dernière colonne
I2C1_Wr(ADRESS_PAGE); // Dit à l’écran qu'on lui envoie les limites des pages
I2C1_Wr(0); // Valeur de la première page
I2C1_Wr(7); // Valeur de la dernière page
I2C1_Stop();
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse de l'esclave 0b01111000 + Write
I2C1_Wr (Data); // Data
for (LOC_Compteur=0;LOC_Compteur<1024;LOC_Compteur++){ // Je remplis l'écran de noir
I2C1_Wr (0x00);
}
I2C1_Stop();
//-------------------------------------------------------------------------------------------------
// Cette fonction remplis l'écran de blanc
// J'affecte la zone active à l'écran entier, et j'envoie des 0x00
void Ecran_Blanc(){
unsigned int LOC_Compteur=0; // Variable locale
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse 0b01111000 + Write
I2C1_Wr (Command); // Command ou Data
I2C1_Wr(ADRESS_COLONE); // Dit à l’écran qu'on lui envoie les limites de colonnes
I2C1_Wr(0); // Valeur 1ere colonne
I2C1_Wr(127); // Valeur dernière colonne
I2C1_Wr(ADRESS_PAGE); // Dit à l’écran qu'on lui envoie les limites des pages
I2C1_Wr(0); // Valeur de la première page
I2C1_Wr(7); // Valeur de la dernière page
I2C1_Stop();
I2C1_Start();
I2C1_Wr (adresse_W); // Envoi l'adresse de l'esclave 0b01111000 + Write
I2C1_Wr (Data); // Data
for (LOC_Compteur=0;LOC_Compteur<324;LOC_Compteur++){ // Je remplis l'écran de noir
I2C1_Wr (0x255);
}
I2C1_Stop();
}
}
Auriez vous une idée pour identifier le problème ?
J'ai pensé à un soucis d'alimentation , j'alimente le tout en 4.5V pareil .
Merci de m'avoir lu