Je n'arrive plus à initialiser ma carte SD, SdFAT 2

Bonjour à tous,

Je me relance dans mon project et je mets à jour mon code.
Depuis SdFat est passé sur une nouvelle version et mon code bug. tant mieux, je le corrige mais en suivant le fichier d'exemple, pour parcourir un dossier (Directory Fonction), je n'arrive plus à initier ma carte.

Board: SMAD21 MO
SD Card : exFat

Dans mon fichier.h, j'ai ceci

#include <FreeStack.h> // For SdFAT
#include <SdFat.h>

#define SD_FAT_TYPE 2 // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.

Puis dans la partie private, j'ai ceci (extrait)

class Ecosensors{
 	protected:
 	private:
 		#if SD_FAT_TYPE == 0
			SdFat _sd;
			File _file;
			File _root;
		#elif SD_FAT_TYPE == 1
			SdFat32 _sd;
			File32 _file;
			File32 _root;
		#elif SD_FAT_TYPE == 2
			SdExFat _sd;
			ExFile _file;
			ExFile _root;
		#elif SD_FAT_TYPE == 3
			SdFs _sd;
			FsFile _file;
			FsFile _root;
		#endif  // SD_FAT_TYPE


 		// SD
 		int _carddetect;
		int _chipselect;
		bool _isSDenable;
		bool _isSdReady;
public:
		// SD
    bool sd_begin();

dans mon fichier .cpp, j'ai cette fonction qui va vérifier la carte

bool Ecosensors::sd_begin()
{
  pinMode(_carddetect, INPUT_PULLUP);
  Serial.println(F("\tBegin SD"));
  Serial.print(F("\tSD_FAT_TYPE: "));

  #if SD_FAT_TYPE == 0
    Serial.println(F("SdFat/File as defined in SdFatConfig.h"));
  #elif SD_FAT_TYPE == 1
    Serial.println(F("for FAT16/FAT32"));
  #elif SD_FAT_TYPE == 2
    Serial.println(F("for exFAT"));
  #elif SD_FAT_TYPE == 3
    Serial.println(F("for FAT16/FAT32 and exFAT"));
  #endif  // SD_FAT_TYPE

  _isSdReady = false;
  int c=1;
  do
  { 
    if (!_sd.begin(4))
    {
      Serial.print(F("\t"));
      Serial.print(c);
      Serial.println(F(": Attending the detect the SD card"));
      //isOk = false;
      _isSdReady = false;
      c++;
      delay(1000);
    }
    else
    {
      _isSdReady = true;
    }
   
  }while(_isSdReady == false && c < 4);

  if(_isSdReady == false)
  {
    Serial.println(F("Sd is not ready"));
    _isSDenable = false;
    _logger = false;
    return _isSdReady;
  }

  _sd.chdir();
  //listFiles(NULL);
  //afficherContenuRepertoire(_sd, 1);

  return _isSdReady;
}

Avanr cela fonctionnait très bien avec la valeur de 4 pour le chipset. Je ne comprends pas pourquoi maintenant cela ne fonctionne plus. J'ai aussi essayé de lui donner 8 tentatives, sans succès.

Qu'est-ce qui a changer dans _sd.begin(4)

Merci

Post mis dans la mauvaise section, on parle anglais dans les forums généraux, je viens de déplacer le post dans la section francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

Peut être rien dans cette partie là mais peut être la vitesse par défaut du SPI? Essayez de passer une SPI CONFIG au lieu de juste 4.


#define SD_CS_PIN 4
#define SPI_SPEED SD_SCK_MHZ(4)   // vitesse réduite pour tester 
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_SPEED)

// puis dans sd_begin() :
if (!_sd.begin(SD_CONFIG))

Salut J-M-L

Malheuresement rien ne fonctionne. J'ai essayé plusieurs vittes sans succès

#define SD_CS_PIN 4
  #define SPI_SPEED SD_SCK_MHZ(48)   // vitesse réduite pour tester 
  #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_SPEED)

48Mhz étant la vitesse du CPU (ATSAMD21G18 ARM Cortex M0 at 48Mhz)

J'ai aussi essayé DEDICATED_SPI

bool Ecosensors::sd_begin()
{
  pinMode(_carddetect, INPUT_PULLUP);

  #define SD_CS_PIN 4
  #define SPI_SPEED SD_SCK_MHZ(48)   // vitesse réduite pour tester 
  #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_SPEED)

  Serial.println(F("\tBegin SD"));
  Serial.print(F("\tSD_FAT_TYPE: "));

  #if SD_FAT_TYPE == 0
    Serial.println(F("SdFat/File as defined in SdFatConfig.h"));
  #elif SD_FAT_TYPE == 1
    Serial.println(F("for FAT16/FAT32"));
  #elif SD_FAT_TYPE == 2
    Serial.println(F("for exFAT"));
  #elif SD_FAT_TYPE == 3
    Serial.println(F("for FAT16/FAT32 and exFAT"));
  #endif  // SD_FAT_TYPE

  _isSdReady = false;
  int c=1;
  do
  { 
    if (!_sd.begin(SD_CONFIG))
    {
      Serial.print(F("\t"));
      Serial.print(c);
      Serial.println(F(": Attending the detect the SD card"));
      //isOk = false;
      _isSdReady = false;
      c++;
      delay(1000);
    }
    else
    {
      _isSdReady = true;
    }
   
  }while(_isSdReady == false && c < 4);

  if(_isSdReady == false)
  {
    Serial.println(F("Sd is not ready"));
    _isSDenable = false;
    _logger = false;
    return _isSdReady;
  }

  _sd.chdir();
  //listFiles(NULL);
  //afficherContenuRepertoire(_sd, 1);

  return _isSdReady;
}

J'ai esayé avec la librairie SD, et ca marche. Il faudrait que je compare ou que j'utilise cette librairie...

Mais, si j'ose, comment, je peux inclure SD dans mon fichier.h et mon fichier.cpp

J'ai essayé ceci dans mon fichier cpp

bool Ecosensors::sd_begin()
{
  pinMode(_carddetect, INPUT_PULLUP);


  Serial.println(F("\tBegin SD"));
  /*
  Serial.print(F("\tSD_FAT_TYPE: "));

  #if SD_FAT_TYPE == 0
    Serial.println(F("SdFat/File as defined in SdFatConfig.h"));
  #elif SD_FAT_TYPE == 1
    Serial.println(F("for FAT16/FAT32"));
  #elif SD_FAT_TYPE == 2
    Serial.println(F("for exFAT"));
  #elif SD_FAT_TYPE == 3
    Serial.println(F("for FAT16/FAT32 and exFAT"));
  #endif  // SD_FAT_TYPE
    */

  _isSdReady = false;
  int c=1;
  do
  { 
    if (!SD.begin(_chipselect))
    {
      delay(1000);
      Serial.print(F("\t"));
      Serial.print(c);
      Serial.println(F(": Attending the detect the SD card"));
      //isOk = false;
      _isSdReady = false;
      c++;
      
    }
    else
    {
      _isSdReady = true;
    }
   
  }while(_isSdReady == false && c <= 3);

  if(_isSdReady == false)
  {
    Serial.println(F("Sd is not ready"));
    _isSDenable = false;
    _logger = false;
    return _isSdReady;
  }

  //_sd.chdir();
  //listFiles(NULL);
  //afficherContenuRepertoire(_sd, 1);

  return _isSdReady;
}

Mais ei je mets tout en haut de mon cpp et de mon fichier.h

#include <SPI.h>
#include <SD.h>

Je n'ai pas d'erreur au moment de la compilation mais quand je lance mon code, le terminal s'arrete au moment de

if (!SD.begin(_chipselect))
    {}

Je fais forcément un truc ma correct :hugs: dans ma librairire

Quel module SD utilisez vous exactement, avec la référence ou le fabricant, et pouvez vous confirmer le câblage MOSI, MISO, SCK, CS ainsi que la tension d'alimentation du module?

Concernant SdFat vous dites faire l’évolution - est-ce le passage de la V1 à la V2 ou juste à La version 2.2.2 ? Celle ci a modifié la façon dont le SPI utilisateur est initialisé, avec l'ajout de fonctions SPI array. (Un point structurel important est que depuis la version 2, le mode SPI dédié, ENABLE_DEDICATED_SPI, est activé par défaut dans SdFatConfig.h, alors qu'en version 1 le comportement par défaut était plus proche du mode partagé.)

Il faudrait tout le code … par exemple est ce que sd_begin est appelé depuis le constructeur de Ecosensors ou depuis setup(). Un appel SPI ou SD.begin() déclenché depuis le constructeur d'un objet global sur SAMD21, avant que le setup et l'initialisation du cœur Arduino soient terminés, peut provoquer ce type de blocage silencieux.

Hello J-ML
Je suis désolé pour ma réponse tardive.

Alors sur ce coup la, je n'ai vraiment pas été malin :hot_face:

J'ai été confonté à cela, il y a deux ans et c'est que hier soir que j'ai pensé à ça (c'était trop tard pour le testé) J'avais même écris un exemple ici. :face_with_symbols_on_mouth:

En plus de cela, j'avais bien spécifié ceci.

Je viens de tester le fichier d'exemple 06_rtc-sd-bme280 et ca marche, donc je pense qu'il falait faire ceci

Il y a juste ceci qui m'embête mais j'ai vu des info passer

Je vais reprendre le travail de EcoBoard et le faire évoluer/améliorer/corriger. C'est vraiment très bien.

Concernant mon Post #5, je pense qu'on peut mettre ça de côté pour le moment.
Je le traiterai dans un sujet séparé, si nécessaire plus tard.

Mais la je crois que j'ai une bonne base de travail pour continuer

OK Bonne continuation.