Problems with Xiao ESP32 C3 and Adafruit microSD / SDFat Library

First of all hello everyone. This is my first post here.

I’m trying to rerate simple CSV logger for my AQI sensor. I’m using Xiao ESP32 C3 and Adafruit microSD Card BFF Add-On for QT Py and Xiao Adafruit microSD Card BFF Add-On for QT Py and Xiao : ID 5683 : Adafruit Industries, Unique & fun DIY electronics and kits with SdFat Library - Adafruit fork.
Even that this combination should be fully compatible it does not work for me. Below you will find a simple sketch. If I upload it and do nothing everything seams to be working fine. But… when I turn on and off the Serial Monitor in Arduino IDE, the microcontroller is restarting. Writes to the file confirm this. This problem seems to be unique for the Xiao ESP32 C3. The same code*, the same tests on Arduino Giga R1 WIFI + the same Adafruit microSD board + the same Serial Monitor in the same Arduino IDE and there are no problems.
*for Giga R1 I’m using SPI1 instead of SPI (which uses 5V logic).

Any suggestions what may cause this wired behavior?

code:

// SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries
//
// SPDX-License-Identifier: MIT
/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 14 Feb 2023
 by Liz Clark

 This example code is in the public domain.

 */

#include <SPI.h>
//#include <SD.h>
#include "SdFat.h"
SdFat SD;

#define SD_FAT_TYPE 3

// default CS pin is TX for microSD BFF
#define SD_CS_PIN A0

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  SdSpiConfig spiConf(A0, DEDICATED_SPI, SD_SCK_MHZ(10), &SPI);


  if (!SD.begin(spiConf)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test_ADA.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    myFile.println("hello bff!");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test_ADA.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

int i = 0;

void loop() {
  // nothing happens after setup
  if (i < 20) {
    Serial.println(i);
    myFile = SD.open("test_ADA.txt", FILE_WRITE);

    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print("LOOP: \t\t Writing to test.txt...");
      myFile.print("zapis ");
      myFile.println(i);
      // close the file:
      myFile.close();
      Serial.println("LOOP: \t\tdone.");
    } else {
      // if the file didn't open, print an error:
      Serial.println("LOOP: \t\terror opening test.txt");
    }
  }
  i++;
  delay(1500);
}

Hi there,
Not sure if it will help , But I have this working on the Expansion Board SD card.
also I’m attaching a BIN to drop on it with everything compiled.
HTH
GL :slight_smile: PJ

// adapted from Raui Shanchez
// Xiao Esp32C3 , 32 gig SD , formatted Fat 32 with 32k sector size.
//
//

#include "FS.h"
#include "SD.h"
#include "SPI.h"
#define SS D2


void setup(){
  Serial.begin(9600);
  delay (2000);
  Serial.println(); // only for mbed 2.9.x
  Serial.println("Power ON \n ");  // Let's BEGIN!!
  Serial.println("Test program compiled on " __DATE__ " at " __TIME__);
  Serial.println();
  Serial.println("Processor came out of reset.");
  Serial.println();

 // pinMode(fspi->pinSS(), OUTPUT); //VSPI SS
 // pinMode(hspi->pinSS(), OUTPUT); //HSPI SS

 digitalWrite(SS, HIGH); // <-- Set CS pin HIGH to deselect
  Serial.println("--------------");
  Serial.println(SS);
  Serial.println(MOSI); // master out, slave in
  Serial.println(MISO); // master in, slave out
  Serial.println(SCK);  // clock
  Serial.println("--------------");

  if(!SD.begin(SS)){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }

  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }

  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);

  listDir(SD, "/", 0);
  createDir(SD, "/mydir");
  listDir(SD, "/", 0);
  removeDir(SD, "/mydir");
  listDir(SD, "/", 2);
  writeFile(SD, "/hello.txt", "Hello ");
  appendFile(SD, "/hello.txt", "World!\n");
  readFile(SD, "/hello.txt");
  deleteFile(SD, "/foo.txt");
  renameFile(SD, "/hello.txt", "/foo.txt");
  readFile(SD, "/foo.txt");
  testFileIO(SD, "/test.txt");
  Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
  Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}

void loop(){
delay (500);
}

//

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
  Serial.printf("Listing directory: %s\n", dirname);

  File root = fs.open(dirname);
  if(!root){
    Serial.println("Failed to open directory");
    return;
  }
  if(!root.isDirectory()){
    Serial.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while(file){
    if(file.isDirectory()){
      Serial.print("  DIR : ");
      Serial.println(file.name());
      if(levels){
        listDir(fs, file.name(), levels -1);
      }
    } else {
      Serial.print("  FILE: ");
      Serial.print(file.name());
      Serial.print("  SIZE: ");
      Serial.println(file.size());
    }
    file = root.openNextFile();
  }
}

void createDir(fs::FS &fs, const char * path){
  Serial.printf("Creating Dir: %s\n", path);
  if(fs.mkdir(path)){
    Serial.println("Dir created");
  } else {
    Serial.println("mkdir failed");
  }
}

void removeDir(fs::FS &fs, const char * path){
  Serial.printf("Removing Dir: %s\n", path);
  if(fs.rmdir(path)){
    Serial.println("Dir removed");
  } else {
    Serial.println("rmdir failed");
  }
}

void readFile(fs::FS &fs, const char * path){
  Serial.printf("Reading file: %s\n", path);

  File file = fs.open(path);
  if(!file){
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)){
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)){
      Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
  Serial.printf("Renaming file %s to %s\n", path1, path2);
  if (fs.rename(path1, path2)) {
    Serial.println("File renamed");
  } else {
    Serial.println("Rename failed");
  }
}

void deleteFile(fs::FS &fs, const char * path){
  Serial.printf("Deleting file: %s\n", path);
  if(fs.remove(path)){
    Serial.println("File deleted");
  } else {
    Serial.println("Delete failed");
  }
}

void testFileIO(fs::FS &fs, const char * path){
  File file = fs.open(path);
  static uint8_t buf[512];
  size_t len = 0;
  uint32_t start = millis();
  uint32_t end = start;
  if(file){
    len = file.size();
    size_t flen = len;
    start = millis();
    while(len){
      size_t toRead = len;
      if(toRead > 512){
        toRead = 512;
      }
      file.read(buf, toRead);
      len -= toRead;
    }
    end = millis() - start;
    Serial.printf("%u bytes read for %u ms\n", flen, end);
    file.close();
  } else {
    Serial.println("Failed to open file for reading");
  }


  file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }

  size_t i;
  start = millis();
  for(i=0; i<2048; i++){
    file.write(buf, 512);
  }
  end = millis() - start;
  Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
  file.close();
}

Serial Output.

Power ON 
 
Test program compiled on Apr  1 2024 at 10:08:13

Processor came out of reset.

--------------
4
10
9
8
--------------
SD Card Type: SDHC
SD Card Size: 30474MB
Listing directory: /
  DIR : System Volume Information
  FILE: test.txt  SIZE: 1048576
  DIR : gif
  FILE: foo.txt  SIZE: 13
Creating Dir: /mydir
Dir created
Listing directory: /
  DIR : System Volume Information
  FILE: test.txt  SIZE: 1048576
  DIR : mydir
  DIR : gif
  FILE: foo.txt  SIZE: 13
Removing Dir: /mydir
Dir removed
Listing directory: /
  DIR : System Volume Information
Listing directory: System Volume Information
Failed to open directory
  FILE: test.txt  SIZE: 1048576
  DIR : gif
Listing directory: gif
Failed to open directory
  FILE: foo.txt  SIZE: 13
Writing file: /hello.txt
File written
Appending to file: /hello.txt
Message appended
Reading file: /hello.txt
Read from file: Hello World!
Deleting file: /foo.txt
File deleted
Renaming file /hello.txt to /foo.txt
File renamed
Reading file: /foo.txt
Read from file: Hello World!
1048576 bytes read for 2528 ms
1048576 bytes written for 2828 ms
Total space: 30454MB
Used space: 4MB

compiler output

FQBN: esp32:esp32:XIAO_ESP32C3
Using board 'XIAO_ESP32C3' from platform in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10
Using core 'esp32' from platform in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10

cmd /c if exist "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\partitions.csv" COPY /y "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\partitions.csv" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\partitions.csv"
cmd /c if not exist "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\partitions.csv" if exist "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\variants\\XIAO_ESP32C3\\partitions.csv" COPY "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\variants\\XIAO_ESP32C3\\partitions.csv" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\partitions.csv"
cmd /c if not exist "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\partitions.csv" COPY "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\tools\\partitions\\default.csv" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\partitions.csv"
cmd /c IF EXIST "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\bootloader.bin" ( COPY /y "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\bootloader.bin" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\sketch_mar16a_SD_Exp_c3.ino.bootloader.bin" ) ELSE ( IF EXIST "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\variants\\XIAO_ESP32C3\\bootloader.bin" ( COPY "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\variants\\XIAO_ESP32C3\\bootloader.bin" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\sketch_mar16a_SD_Exp_c3.ino.bootloader.bin" ) ELSE ( "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\esptool_py\\4.5.1/esptool.exe" --chip esp32c3 elf2image --flash_mode dio --flash_freq 80m --flash_size 4MB -o "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\sketch_mar16a_SD_Exp_c3.ino.bootloader.bin" "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\tools\\sdk\\esp32c3\\bin\\bootloader_qio_80m.elf" ) )
esptool.py v4.5.1
Creating esp32c3 image...
**** EDIT Brevity ****
Successfully created esp32c3 image.
"C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10/tools/gen_esp32part.exe" -q "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8/partitions.csv" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8/sketch_mar16a_SD_Exp_c3.ino.partitions.bin"
cmd /c if exist "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8\\libraries\\Insights" "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10/tools/gen_insights_package.exe" "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8" sketch_mar16a_SD_Exp_c3.ino "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3"
cmd /c IF 0==1 COPY /y "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\openocd-esp32\\v0.11.0-esp32-20221026\\share\\openocd\\scripts\\board\\esp32c3-builtin.cfg" "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\debug.cfg"
cmd /c IF 0==1 COPY /y "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\tools\\ide-debug\\esp32c3.json" "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\debug_custom.json"
cmd /c IF 0==1 COPY /y "C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\2.0.10\\tools\\ide-debug\\svd\\esp32c3.svd" "D:\\Arduino_projects\\sketch_mar16a_SD_Exp_c3\\debug.svd"
Multiple libraries were found for "SD.h"
  Used: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10\libraries\SD
  Not used: C:\Users\Dude\AppData\Local\Arduino15\libraries\SD
  Not used: D:\Arduino_projects\libraries\SD
Using library FS at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10\libraries\FS 
Using library SD at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10\libraries\SD 
Using library SPI at version 2.0.0 in folder: C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10\libraries\SPI 
"C:\\Users\\Dude\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\riscv32-esp-elf-gcc\\esp-2021r2-patch5-8.4.0/bin/riscv32-esp-elf-size" -A "C:\\Users\\Dude\\AppData\\Local\\Temp\\arduino\\sketches\\12EDFA38154FA8D69920B5DEB88B17A8/sketch_mar16a_SD_Exp_c3.ino.elf"
Sketch uses 288952 bytes (22%) of program storage space. Maximum is 1310720 bytes.
Global variables use 14276 bytes (4%) of dynamic memory, leaving 313404 bytes for local variables. Maximum is 327680 bytes.
"C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1/esptool.exe" --chip esp32c3 --port "COM3" --baud 921600  --before default_reset --after hard_reset write_flash  -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x0 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\12EDFA38154FA8D69920B5DEB88B17A8/sketch_mar16a_SD_Exp_c3.ino.bootloader.bin" 0x8000 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\12EDFA38154FA8D69920B5DEB88B17A8/sketch_mar16a_SD_Exp_c3.ino.partitions.bin" 0xe000 "C:\Users\Dude\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.10/tools/partitions/boot_app0.bin" 0x10000 "C:\Users\Dude\AppData\Local\Temp\arduino\sketches\12EDFA38154FA8D69920B5DEB88B17A8/sketch_mar16a_SD_Exp_c3.ino.bin" 
esptool.py v4.5.1
Serial port COM3
Connecting...
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: a0:76:4e:3f:a3:88
Uploading stub...

SD_EXP_c3.zip (182.6 KB)