Pourquoi ma carte SD ne peut plsi lire quand l'LCD est initié (i2C)

Bonjour à tous,

J'ai un problème de fou.
J'ai deux PCB. Le deuxièmre est l'évolution du premier.
En soit la partie des connections de la carte SD au microcontrolleur n'a pas changé. J'ai rgeardé, c'est le meme sur les deux schéma.

Quand j'upload le code avec le LCD active dans la premiere carte,

  • L'OLED est initité et affiche des message
  • La carte SD est initité et il vérifie les dossiers (lis) et écris les log

Quand j'upload le meme code sur ma deuxièmre carte

  • l'OLEDest initié et affiche des message
  • la carte SD est initié mais il n'arrive plus a lire un fichier qui existe

Ceci

Serial.println(F("DBUG"));
    Serial.println(_config_rtc_file);
    
    if (!_sd.exists(_config_rtc_file))
    {
       Serial.print(_config_rtc_file); Serial.println(F(" n'existe pas"));
    }

m'affiche

/clock.txt n'existe pas

Quand je commente ceci

//#define OLED

(Tout mon code lié à l'OLED est entouré de #ifdef OLED #endif)
Ma carte SD est lue.

C'est dingue, car je n'arrive pas voir de différence entre les deux schémas et je n'arrive pas à comprendre pourquoi l'OLED qui communique via I2C a une influence alors que les autres élément I2C ne cause pas de problèmes.

Vous me direz ca doit etre un problème hardware (soit du deuxième PCB) et pas un problème de code, mais j'ai encore vérifier les schema et je ne vois pas binz.

Avez-vous déjà eu un problème similaire?

je vais vous donner du code, mais il va en avoir tellement, que vous ne souriez pas par ou commencer:

void setup() {
  Serial.begin(9600);
if(!Si.begin()){ // Init SD
    while(1){
      Si.sprintln(F("Error: Si.begin()"),0);
      delay(1000);
    }
  }
// C'est ici que j'iniatilse ma carte CD

}

Voici comment j'initialise ma carte SD

bool Foxuino::_sd_begin()
{
//	#if defined(LOGGER)
		Serial.println(F("Begin SD"));
		bool isOk = false;  
    do
    { 
      if (!_sd.begin(_chipselect))
    	{
      	Serial.println(F("No card SD"));
        isOk = false;
        delay(1000);
      }
    	else
    	{
        isOk = true;
      }
   
    }while(isOk == false);
    _sd.chdir();
    return isOk;
  //  #endif
}

Je continue par initié Wire.begin
(je continue mes commentaire dans le code)

void setup() {
  Serial.begin(9600);
if(!Si.begin()){ // Init SD
    while(1){
      Si.sprintln(F("Error: Si.begin()"),0);
      delay(1000);
    }
  }
// C'est ci-desus que j'iniatilse ma carte CD

Wire.begin();

// J ENABLE WATCHDOG ET OLED

#if defined(OLED)
    #if defined (WATCHDOG)
      wtime = Watchdog.enable();
      Si.sprint(F("\r\nEnabling Watchdog for "),0);
      Si.sprint(wtime,0);
      Si.sprintln(F("ms"),0);
      Watchdog.reset();
    #endif

    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
    display.display()

    #if defined (WATCHDOG)
      Watchdog.disable();
    #endif

    delay(10000); // Give a delay to display the Splash
    // Clear the buffer.
    display.clearDisplay();

    display.fillRect(0, 0, display.width(), 10, INVERSE);
    display.display();
    display.setTextColor(BLACK);
    display.setCursor(1,1);
    display.print("Setup");
    display.display();
    display.setTextColor(WHITE);
    display.setCursor(0,16);

    int o_y = 10;
    o_y = oledCursorY(o_y);
    display.setCursor(0,o_y);
    display.print("[OK] OLED");
    display.display();

#else
    Si.sprintln(F("[NA] OLED"),0);
  #endif

// EN AUCUN CAS J ECRIS OU LIS DANS MA CARTE JUSQU'A LA

#if defined(OLED)
    o_y = oledCursorY(o_y); // Je déplace mon curseur en Y
    display.setCursor(0,o_y);
    display.print("[OK] Wire");
    display.display();
  #endif

// Je scan tous mes périférique I2C. L'OLED et LES AUTRES I2C SONT BIEN VUS
// IL N Y A PAS DE CONFLIT D'ADRESSAGE
   I2Cscan.begin();

// J'INITIALISE LE PCF8674 ET DEFINI LES BROCHE EN SORTIE
expander.begin(0x27);
      expander.pinMode(1,OUTPUT);
      expander.pinMode(2,OUTPUT);
      expander.pinMode(3,OUTPUT);
      expander.pinMode(4,OUTPUT);
      expander.pinMode(5,OUTPUT);
      expander.pinMode(6,OUTPUT);

// JE METS TOUTES MES SORTIE DU PCF8574 EN L ETAT BAS SAUF POUR P1,P2;p3
for(int p=1; p<7;p++){
      expander.digitalWrite(p,LOW);
      delay(50);
      Serial.print(F("\tP")); Serial.print(p); Serial.print(F(":"));
      Serial.println(expander.digitalRead(p) ? "HIGH" : "LOW");
      delay(50);
    }

// JE METS ICI P1, P2 et P3 DANS l'ETAT HAUT      
      expander.digitalWrite(wm1_power_pin, HIGH);
      Serial.print(F("\twm1_power_pin")); Serial.print(wm1_power_pin); Serial.print(F(":"));
      Serial.println(expander.digitalRead(wm1_power_pin) ? "HIGH" : "LOW");
      
      expander.digitalWrite(wm2_power_pin, HIGH);
      Serial.print(F("\twm2_power_pin")); Serial.print(wm2_power_pin); Serial.print(F(":"));
      Serial.println(expander.digitalRead(wm2_power_pin) ? "HIGH" : "LOW");
      
      expander.digitalWrite(wm3_power_pin, HIGH);
      Serial.print(F("\twm3_power_pin")); Serial.print(wm3_power_pin); Serial.print(F(":"));
      Serial.println(expander.digitalRead(wm3_power_pin) ? "HIGH" : "LOW");


// J'USQU'ICI LA CARTE SD N'INTERVINT TOUJOURS = PAS DE LECTURE / ECRITUE

// MAINTENANT LESPROBLEMES COMMENCENT
// J'INITIALISE MON RTC (DS3231)
if (! Si.RtcBegin())
    {
     Serial.println("RTC ERREUR");
     }
}

et j'ai le message RTC ERREUR dans mon terminal.

Je vais donc détailler Si.RtcBegin(), car c'est là que je lis dans ma carte SD pour voir si le fichier clock.txt existe

bool Foxuino::RtcBegin()
{
   if(rtc.begin())
  {
    Serial.println(F("DBUG"));
    Serial.println(_config_rtc_file);
    
    if (!_sd.exists(_config_rtc_file))
    {
      Serial.print(F("does not exist"));
     }
   }
}

Ceci m'afiche

/clock.txt does not exist

Il m'indique bien que le fichier n'existe alors qu'il existe.
Si j'utilise ma premiere carte avec la meme carte SD, je n'ai pas ce problème que mon OLED est activé.

Comme je l'ai indiqué aucun autres périférique I2C me cause se problème. Je vais encore regarder regarde mes deux schéma, mais même je me demandais si vous aviez déjà expérimenté un problème comme celui-ci avec une carte SD et un écran LCD OLED?

Merci pour vos tuyaux

pierrot10:
C'est dingue, car je n'arrive pas voir de différence entre les deux schémas et je n'arrive pas à comprendre pourquoi l'OLED qui communique via I2C a une influence alors que les autres élément I2C ne cause pas de problèmes.

les cartes SD utilisent SPI, pas I2C non ?

Oui c'est bien ca! C'est bien pourquoi je suis dans l'inconpréhension

pas assez de jus ? plan de masse différent ? résistances ?

pierrot10:
J'ai deux PCB. Le deuxièmre est l'évolution du premier.

Donc pourquoi chercher dans le soft un problème si manifestement la cause se trouve plutôt dans le hard?
Les questions à se poser devrait être:

  • Quelles sont les différences dans le hardware?
  • Quelles sont les différences dans le routage des cartes?

Donc pourquoi chercher dans le soft un problème si manifestement la cause se trouve plutôt dans le hard?

Oui ca peut parraitre allez à l'envers, mais je ne vois pas de ce ui est faux, en comprant les deux.
Même si ca peut parraitre absurde, j'essaye de comprendre le comportement mon soft, aussi parce que j'ai un doute sur mon OLED.

Par exemple, quand je liste mes périférique I2C, je vois bien mon ecran (0x3C)

I2C Scanner
Scanning...
I2C Devise found at 0x27 !
I2C Devise found at 0x39 !
I2C Devise found at 0x3C !
I2C Devise found at 0x50 !
I2C Devise found at 0x68 !
Info:
0x27:PCF8574
0x3C:OLED
0x68:DS3231
0x50:24LC64
0x77:BME280
0x5A:MLX90614
0x39:TSL5461
0x49:Seesaw

End

Adafruit dit que pour un écran 64x128, il faut utiliser l'adresse 0x3D.
J'ai donc changé ceci

//display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
    display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128x64)

C'est intéressant de voir que mon problème disparait, mais plus rien de s'affiche dans mon OLED. Ce qui n'est pas surprenant, puisque l'OLED est vu à ladresse 0x3C. J'aimerais bien changer l'adresse de mon OLED en 0x3D mais l'OLED que j'ai n'offre pas cette possiblité.

Bref..

Mais comment je pourrais debuger un bus I2C? Plus particulièrement un écran OLED 128x64