Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SD_MMC update #8294

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 77 additions & 13 deletions libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino
Original file line number Diff line number Diff line change
@@ -1,21 +1,59 @@
/*
* Connect the SD card to the following pins:
* pin 1 - D2 | Micro SD card |
* pin 2 - D3 | /
* pin 3 - CMD | |__
* pin 4 - VDD (3.3V) | |
* pin 5 - CLK | 8 7 6 5 4 3 2 1 /
* pin 6 - VSS (GND) | ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ /
* pin 7 - D0 | ▀ ▀ █ ▀ █ ▀ ▀ ▀ |
* pin 8 - D1 |_________________|
* ║ ║ ║ ║ ║ ║ ║ ║
* ╔═══════╝ ║ ║ ║ ║ ║ ║ ╚═════════╗
* ║ ║ ║ ║ ║ ║ ╚══════╗ ║
* ║ ╔═════╝ ║ ║ ║ ╚═════╗ ║ ║
* Connections for ║ ║ ╔═══╩═║═║═══╗ ║ ║ ║
* full-sized ║ ║ ║ ╔═╝ ║ ║ ║ ║ ║
* SD card ║ ║ ║ ║ ║ ║ ║ ║ ║
* ESP32-S3 DevKit | 21 47 GND 39 3V3 GND 40 41 42 |
* ESP32-S3-USB-OTG | 38 37 GND 36 3V3 GND 35 34 33 |
* ESP32 | 4 2 GND 14 3V3 GND 15 13 12 |
* Pin name | D1 D0 VSS CLK VDD VSS CMD D3 D2 |
* SD pin number | 8 7 6 5 4 3 2 1 9 /
* | █/
* |__▍___▊___█___█___█___█___█___█___/
* WARNING: ALL data pins must be pulled up to 3.3V with external 10k Ohm resistor!
* Note to ESP32 pin 2 (D0) : add 1K pull up after flashing
*
* SD Card | ESP32
* D2 12
* D3 13
* CMD 15
* VSS GND
* VDD 3.3V
* CLK 14
* VSS GND
* D0 2 (add 1K pull up after flashing)
* D1 4
* For more info see file README.md in this library or on URL:
* https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no README.md file in the SDMMC library.

*/

#include "FS.h"
#include "SD_MMC.h"

// Default pins for ESP-S3
// Warning: ESP32-S3-WROOM-2 is using most of the default GPIOs (33-37) to interface with on-board OPI flash.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add SDMMC to avoid misunderstanding.
ESP32-S3-WROOM-2 is using most of the default SDMMC GPIOs (33-37).

// If the SD_MMC is initialized with default pins it will result in rebooting loop - please
// reassign the pins elsewhere using the mentioned command `setPins`.
// Note: ESP32-S3-WROOM-1 does not have GPIO 33 and 34 broken out.
// Note: The board SP32-S3-USB-OTG has predefined default pins and the following definitions with the setPins() call will not be compiled.
// Note: Pins in this definition block are ordered from top down in order in which they are on the full-sized SD card
// from left to right when facing the pins down (when connected to a breadboard)

#if defined(SOC_SDMMC_USE_GPIO_MATRIX) && not defined(BOARD_HAS_SDMMC)
int d1 = 21; // SD pin 8 - add 10k Pullup to 3.3V if using 4-bit mode (use_1_bit_mode = false)
int d0 = 47; // SD pin 7 - add 10k Pullup
// GND pin - SD pin 6
int clk = 39; // SD pin 5 - add 10k Pullup
// 3.3V pin - SD pin 4
// GND pin - SD pin 3
int cmd = 40; // SD pin 2 - add 10k Pullup
int d3 = 41; // SD pin 1 - add 10k Pullup to card's pin even when using 1-bit mode
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this tested? That it is necessary to pull up this pin when you won't use it? Just to be sure :)

int d2 = 42; // SD pin 9 - add 10k Pullup to 3.3V if using 4-bit mode (use_1_bit_mode = false)
#endif

bool use_1_bit_mode = false; // Change the value to `true` to use 1-bit mode instead of the 4-bit mode

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

Expand Down Expand Up @@ -172,8 +210,34 @@ void testFileIO(fs::FS &fs, const char * path){

void setup(){
Serial.begin(115200);
if(!SD_MMC.begin()){
Serial.println("Card Mount Failed");
while(!Serial) { delay(10); }
Serial.println("SDMMC_Test.ino starting!");

// If you are using any other ESP32-S3 board than ESP32-S3-USB-OTG which has preset default pins, you will
// need to specify the pins with the following example of SD_MMC.setPins()
// If you want to use only 1-bit mode, you can use the line with only one data pin (d0) begin changed.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... one data pin (d0) being changed.

// Please note that ESP32 does not allow pin change and will always fail.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As its not that true that the setPins() will always fail, because if you use the right pins its not gonna fail, but it don't make sense to call it as it won't make any difference. I would rather write that ESP32 has dedicated pins for SDMMC so there is no need to call setPin as it won't have any effect. Something like that :)

#if defined(SOC_SDMMC_USE_GPIO_MATRIX) && not defined(BOARD_HAS_SDMMC)
//if(! SD_MMC.setPins(clk, cmd, d0)){ // 1-bit line version
if(! SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)){ // 4-bit line version
Serial.println("Pin change failed!");
return;
}
Comment on lines +221 to +225
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not to use use_1_bit_mode so no need for user to comment/uncomment code :)

if(use_1_bit_mode) {
    if(!SD_MMC.setPins(clk, cmd, d0)) { 
         Serial.println("Pin change failed!");
         return;
    }
}
else {
    if(!SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)) { 
         Serial.println("Pin change failed!");
         return;
    }
}

#endif

if(use_1_bit_mode){
Serial.printf("Begin in 1-bit mode; pins: CLK=%d, CMD=%d, D0=%d\n", SD_MMC.getClkPin(), SD_MMC.getCmdPin(), SD_MMC.getD0Pin());
}else{
Serial.printf("Begin in 4-bit mode; pins: CLK=%d, CMD=%d, D0=%d, D1=%d, D2=%d, D3=%d\n", SD_MMC.getClkPin(), SD_MMC.getCmdPin(), SD_MMC.getD0Pin(), SD_MMC.getD1Pin(), SD_MMC.getD2Pin(), SD_MMC.getD3Pin());
}

if(!SD_MMC.begin("/sdcard", use_1_bit_mode)){
Serial.println("Card Mount Failed.");
Serial.println("Increase log level to see more info: Tools > Core Debug Level > Verbose");
Serial.println("Make sure that all data pins have 10 kOhm pull-up resistor");
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
Serial.println("Make sure that when using generic ESP32-S3 board the pins are setup using SD_MMC.setPins()");
#endif
return;
}
uint8_t cardType = SD_MMC.cardType();
Expand Down
99 changes: 80 additions & 19 deletions libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
/*
* Connect the SD card to the following pins:
* pin 1 - D2 | Micro SD card |
* pin 2 - D3 | /
* pin 3 - CMD | |__
* pin 4 - VDD (3.3V) | |
* pin 5 - CLK | 8 7 6 5 4 3 2 1 /
* pin 6 - VSS (GND) | ▄ ▄ ▄ ▄ ▄ ▄ ▄ ▄ /
* pin 7 - D0 | ▀ ▀ █ ▀ █ ▀ ▀ ▀ |
* pin 8 - D1 |_________________|
* ║ ║ ║ ║ ║ ║ ║ ║
* ╔═══════╝ ║ ║ ║ ║ ║ ║ ╚═════════╗
* ║ ║ ║ ║ ║ ║ ╚══════╗ ║
* ║ ╔═════╝ ║ ║ ║ ╚═════╗ ║ ║
* Connections for ║ ║ ╔═══╩═║═║═══╗ ║ ║ ║
* full-sized ║ ║ ║ ╔═╝ ║ ║ ║ ║ ║
* SD card ║ ║ ║ ║ ║ ║ ║ ║ ║
* ESP32-S3 DevKit | 21 47 GND 39 3V3 GND 40 41 42 |
* ESP32-S3-USB-OTG | 38 37 GND 36 3V3 GND 35 34 33 |
* ESP32 | 4 2 GND 14 3V3 GND 15 13 12 |
* Pin name | D1 D0 VSS CLK VDD VSS CMD D3 D2 |
* SD pin number | 8 7 6 5 4 3 2 1 9 /
* | █/
* |__▍___▊___█___█___█___█___█___█___/
* WARNING: ALL data pins must be pulled up to 3.3V with external 10k Ohm resistor!
* Note to ESP32 pin 2 (D0) : add 1K pull up after flashing
*
* SD Card | ESP32
* D2 -
* D3 SS
* CMD MOSI
* VSS GND
* VDD 3.3V
* CLK SCK
* VSS GND
* D0 MISO
* D1 -
* For more info see file README.md in this library or on URL:
* https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC
Comment on lines +27 to +28
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The same, there is no README.md file in the SDMMC library.

Copy link
Contributor Author

@PilnyTomas PilnyTomas Jun 8, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There will be

*/

#include "FS.h"
Expand All @@ -19,12 +34,35 @@
#include <time.h>
#include <WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";
const char* ssid = "Viks";
const char* password = "Mordornumber1";
Comment on lines +37 to +38
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should replace the Wifi ssid and password with the place-holders.


long timezone = 1;
byte daysavetime = 1;

// Default pins for ESP-S3
// Warning: ESP32-S3-WROOM-2 is using most of the default GPIOs (33-37) to interface with on-board OPI flash.
// If the SD_MMC is initialized with default pins it will result in rebooting loop - please
// reassign the pins elsewhere using the mentioned command `setPins`.
// Note: ESP32-S3-WROOM-1 does not have GPIO 33 and 34 broken out.
// Note: The board SP32-S3-USB-OTG has predefined default pins and the following definitions with the setPins() call will not be compiled.
// Note: Pins in this definition block are ordered from top down in order in which they are on the full-sized SD card
// from left to right when facing the pins down (when connected to a breadboard)

#if defined(SOC_SDMMC_USE_GPIO_MATRIX) && not defined(BOARD_HAS_SDMMC)
int d1 = 21; // SD pin 8 - add 10k Pullup to 3.3V if using 4-bit mode (use_1_bit_mode = false)
int d0 = 47; // SD pin 7 - add 10k Pullup
// GND pin - SD pin 6
int clk = 39; // SD pin 5 - add 10k Pullup
// 3.3V pin - SD pin 4
// GND pin - SD pin 3
int cmd = 40; // SD pin 2 - add 10k Pullup
int d3 = 41; // SD pin 1 - add 10k Pullup to card's pin even when using 1-bit mode
int d2 = 42; // SD pin 9 - add 10k Pullup to 3.3V if using 4-bit mode (use_1_bit_mode = false)
#endif

bool use_1_bit_mode = false; // Change the value to `true` to use 1-bit mode instead of the 4-bit mode

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

Expand Down Expand Up @@ -164,16 +202,39 @@ void setup(){
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Contacting Time Server");
configTime(3600*timezone, daysavetime*3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
struct tm tmstruct ;
configTime(3600*timezone, daysavetime*3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
struct tm tmstruct ;
delay(2000);
tmstruct.tm_year = 0;
getLocalTime(&tmstruct, 5000);
Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct.tm_year)+1900,( tmstruct.tm_mon)+1, tmstruct.tm_mday,tmstruct.tm_hour , tmstruct.tm_min, tmstruct.tm_sec);
Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct.tm_year)+1900,( tmstruct.tm_mon)+1, tmstruct.tm_mday,tmstruct.tm_hour , tmstruct.tm_min, tmstruct.tm_sec);
Serial.println("");

if(!SD_MMC.begin()){
Serial.println("Card Mount Failed");
// If you are using any other ESP32-S3 board than ESP32-S3-USB-OTG which has preset default pins, you will
// need to specify the pins with the following example of SD_MMC.setPins()
// If you want to use only 1-bit mode, you can use the line with only one data pin (d0) begin changed.
// Please note that ESP32 does not allow pin change and will always fail.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As its not that true that the setPins() will always fail, because if you use the right pins its not gonna fail, but it don't make sense to call it as it won't make any difference. I would rather write that ESP32 has dedicated pins for SDMMC so there is no need to call setPin as it won't have any effect. Something like that :)

#if defined(SOC_SDMMC_USE_GPIO_MATRIX) && not defined(BOARD_HAS_SDMMC)
//if(! SD_MMC.setPins(clk, cmd, d0)){ // 1-bit line version
if(! SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)){ // 4-bit line version
Serial.println("Pin change failed!");
return;
}
Comment on lines +218 to +222
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as previous, if(use_1_bit_mode) can be used there.

#endif

if(use_1_bit_mode){
Serial.printf("Begin in 1-bit mode; pins: CLK=%d, CMD=%d, D0=%d\n", SD_MMC.getClkPin(), SD_MMC.getCmdPin(), SD_MMC.getD0Pin());
}else{
Serial.printf("Begin in 4-bit mode; pins: CLK=%d, CMD=%d, D0=%d, D1=%d, D2=%d, D3=%d\n", SD_MMC.getClkPin(), SD_MMC.getCmdPin(), SD_MMC.getD0Pin(), SD_MMC.getD1Pin(), SD_MMC.getD2Pin(), SD_MMC.getD3Pin());
}

if(!SD_MMC.begin("/sdcard", use_1_bit_mode)){
Serial.println("Card Mount Failed.");
Serial.println("Increase log level to see more info: Tools > Core Debug Level > Verbose");
Serial.println("Make sure that all data pins have 10 kOhm pull-up resistor");
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
Serial.println("Make sure that when using generic ESP32-S3 board the pins are setup using SD_MMC.setPins()");
#endif
return;
}
uint8_t cardType = SD_MMC.cardType();
Expand Down Expand Up @@ -203,7 +264,7 @@ void setup(){
deleteFile(SD_MMC, "/hello.txt");
writeFile(SD_MMC, "/hello.txt", "Hello ");
appendFile(SD_MMC, "/hello.txt", "World!\n");
listDir(SD_MMC, "/", 0);
listDir(SD_MMC, "/", 0);
}

void loop(){
Expand Down
54 changes: 54 additions & 0 deletions libraries/SD_MMC/src/SD_MMC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,60 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3)
#endif
}

int SDMMCFS::getClkPin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_clk;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_CLK;
#endif
}

int SDMMCFS::getCmdPin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_cmd;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_CMD;
#endif
}

int SDMMCFS::getD0Pin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_d0;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_D0;
#endif
}

int SDMMCFS::getD1Pin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_d1;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_D1;
#endif
}

int SDMMCFS::getD2Pin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_d2;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_D2;
#endif
}

int SDMMCFS::getD3Pin()
{
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
return _pin_d3;
#elif CONFIG_IDF_TARGET_ESP32
return SDMMC_SLOT1_IOMUX_PIN_NUM_D3;
#endif
}

bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency, uint8_t maxOpenFiles)
{
if(_card) {
Expand Down
6 changes: 6 additions & 0 deletions libraries/SD_MMC/src/SD_MMC.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ class SDMMCFS : public FS
SDMMCFS(FSImplPtr impl);
bool setPins(int clk, int cmd, int d0);
bool setPins(int clk, int cmd, int d0, int d1, int d2, int d3);
int getClkPin();
int getCmdPin();
int getD0Pin();
int getD1Pin();
int getD2Pin();
int getD3Pin();
bool begin(const char * mountpoint="/sdcard", bool mode1bit=false, bool format_if_mount_failed=false, int sdmmc_frequency=BOARD_MAX_SDMMC_FREQ, uint8_t maxOpenFiles = 5);
void end();
sdcard_type_t cardType();
Expand Down