Skip to content

Cannot run SD / SDMMC example on Olimex Esp32 EVB #495

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

Closed
pbecchi opened this issue Jul 9, 2017 · 40 comments
Closed

Cannot run SD / SDMMC example on Olimex Esp32 EVB #495

pbecchi opened this issue Jul 9, 2017 · 40 comments

Comments

@pbecchi
Copy link
Contributor

pbecchi commented Jul 9, 2017

I have just downloaded last commit and I am trying to run SD example and / or SDMMC example on Olimex EVB board (I am unsure witch one is applicable).
Build is OK but I get "Card Mount Failed" message at run time.
Do I need to change any #define for Olimex EVB board?

@williamesp2015
Copy link

I have Maple ESP32 R1 and I had your problem but II could use SD Card after initializing customized SPI Pins
SPI.begin(14,2,15,13);//SCK,MISO,MOSI,ss
delay(10);
if (!SD.begin(13, SPI, 40000000, "/sd")) {
Serial.println("Card Mount Failed");
return;
}

@pbecchi
Copy link
Contributor Author

pbecchi commented Jul 9, 2017

Thanks but I have tried your suggested SPi configuration but it doesn't work....I think that Maple and Olimex EVB have different SD connections.
Since EVB board is supported I was thinking that SD example could run with no modifications.

@melvinpmathew
Copy link

Did you get this to work?

@pbecchi
Copy link
Contributor Author

pbecchi commented Jul 13, 2017

Finally with the help of Olimex this has been sorted out!
They have added one example onhttps://github.com/OLIMEX/ESP32-EVB/tree/master/SOFTWARE
This example is similar to SdMMc core example with following patch SD_MMC.cpp
Modifiing line 45 46

  | host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
  | //host.flags = SDMMC_HOST_FLAG_1BIT; //use 1-line SD mode

To

host.max_freq_khz = SDMMC_FREQ_PROBING;
  | host.flags = SDMMC_HOST_FLAG_1BIT; //use 1-line SD

Can this be done without changing library code?

@fesch
Copy link

fesch commented Jul 16, 2017

I also have the Olimex board and as far as I was able to test, only decommenting the "host.flags" line was enough to make the example run.

@pbecchi
Copy link
Contributor Author

pbecchi commented Jul 18, 2017

You have to change both lines

@melvinpmathew
Copy link

I got it to work only with host.flags = SDMMC_HOST_FLAG_1BIT: The code is as follows:

sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
host.flags = SDMMC_HOST_FLAG_1BIT; 

esp_vfs_fat_sdmmc_mount_config_t mount_config = {
    .format_if_mount_failed = false,
    .max_files = 5
};

@Staubgeborener
Copy link

Staubgeborener commented Jul 31, 2017

i try to get this to work for over a month now. Still no success. I think my wiring is incorrect (especially the pull ups). Can someone please post a "real" picture of his wiring? @melvinpmathew ?
Everytime when my pull ups (alls pins of my sd card have pull ups, except VCC and both GND) are connected to 3.3V i'll get error messages

waiting of rpacket handler).

When i uncouple vcc from pull ups, i'll get the "normal"

Failed to initialize the card (264). Make sure SD card lines have pull-up resistors in place.

message. So something has to be wrong with my circuit. But like i said, a "real" picture would help me a lot. Which I think of my construction is strange, is the fact, that i cable this way: 3.3VCC -> 10k pull up -> wiring to esp32 gpio's -> sd card adapter on a breadboard. So the datas can be transmitted between esp32 and sd card, but also the gpio's of the esp32 get voltage of the 3.3V + 10k resistors. Hope its clear what i mean. You can see it here.

@fesch
Copy link

fesch commented Jul 31, 2017

The "real picture" of my board (Olimex ESP32-EVB) would not help you much. But maybe the circuit will, doesn't it?

image

@Staubgeborener
Copy link

Staubgeborener commented Jul 31, 2017

Yeah, i also found this example. But thats no really help me. Is this only for 1 bit? Only IO15, IO2 and IO14 are connected. DAT1, DAT2 and DAT3 are only with 10k pull ups at 3.3V? Actual i'm a little deperate after weeks of a not well working sd card. So here you can see my setup. Not very beauty, but it shows perfectly my circuit. May you see at first attempt the issue.

Edit: Just tried again this setup. Internal blue LED is glowing timeout waiting for paket handler. I almost think it has something to do with IO12

@fesch
Copy link

fesch commented Jul 31, 2017

No. I suppose there are reference to other GPIO's. I also found this:
image

@Staubgeborener
Copy link

Staubgeborener commented Jul 31, 2017

Maybe my pinout is not the same in this case. I've got an esp32 from doit.am. Can not imagine it, but i just wrote doit.am to send me the pinout. I use everytime this one and its also works everytime like a charm. But maybe not in this case...?

Where did you found this picture, @fesch ?

@fesch
Copy link

fesch commented Aug 1, 2017

@fesch
Copy link

fesch commented Aug 1, 2017

You own this board, right?

https://github.com/SmartArduino/SZDOITWiKi/wiki/ESP8266---ESP32

@me-no-dev
Copy link
Member

Done ;)

void mountSdMmcCard(){
    if(!SD_MMC.begin()){
        Serial.println("Card Mount Failed");
        return;
    }
    uint8_t cardType = SD_MMC.cardType();

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

    Serial.print("SD_MMC 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_MMC.cardSize() / (1024 * 1024);

    Serial.printf("SD_MMC Card Size: %lluMB\n", cardSize);
}

@me-no-dev
Copy link
Member

well make sure you select the proper board from the menu

@me-no-dev
Copy link
Member

oh... and no SPI while using MMC... unfortunately Olimex did not attach SS pin for the card (looking at schematic), so we can not use it with SPI

@Staubgeborener
Copy link

Well, it worked. I also have to add
host.max_freq_khz = SDMMC_FREQ_PROBING;
and also to connect IO0 to IO2. 1 line mode is working, 4 line mode not. It's a start.

@melvinpmathew
Copy link

melvinpmathew commented Aug 2, 2017

@Staubgeborener Just saw this now. Were you able to make this work? The connection were exactly the same as you have shown, Just that I had a 1k pullup on my IO2 line(10k pullup should also not matter in this case), rest all were 10k pullups. Also only the 1 line mode works, the 4 line mode has some issues coming from the driver level and hence I don't think it worth investigating that now. Incase you find that its working share here too.Let me know if you still need help.

Raienryu97 pushed a commit to Raienryu97/arduino-esp32 that referenced this issue Aug 2, 2017
@Staubgeborener
Copy link

Still only 1 line is working here. I have the issue, that i'll get a brownout error when using sdmmc example together with esp_start_wifi.

In my case: 10k pull ups for: D3, CMD, CLK, D0, D1 + Jumper between IO0 and IO2.
Normaly i shouldn't need to connect IO0 to IO2 for my board. But i have to - when i don't, the example won't work. Also tried to pull down IO2 while flashing and disconnect the jumper after/while flashing, also no success.

@me-no-dev
Copy link
Member

Guys I did no modification to my board! EVB board + sdcard + ethernet (did not test WiFi). Selected the appropriate board in the menu and gave it a go. All worked fine (with the latest commits to this repo). No modification or pin jumping was necessary.

@pbecchi
Copy link
Contributor Author

pbecchi commented Aug 2, 2017

@me-no-dev
Can you tell us the examples or the code you have used?
Thanks

@me-no-dev
Copy link
Member

@pbecchi a few comments above: #495 (comment)

@pbecchi
Copy link
Contributor Author

pbecchi commented Aug 2, 2017

I know that there is a problem of bad contact between the holder and the SD card in the EVB board

@me-no-dev
Copy link
Member

I did not experience those (yet), but anyway :) issues like that are out of the scope of Arduino ;) should be handled by the manufacturer :)

@pbecchi
Copy link
Contributor Author

pbecchi commented Aug 2, 2017

My EVB, after moving the SD , worked!

@melvinpmathew
Copy link

melvinpmathew commented Aug 2, 2017

@pbecchi when you say worked, do you mean on the 4-line MMC mode? or just 1?

@melvinpmathew
Copy link

melvinpmathew commented Aug 2, 2017

@Staubgeborener thats correct. I have IO2 pulled HIGH on normal operation with a 1k\10k pullup. And when we need to flash the firmware, IO2 is pulled LOW. Just to be clear, you still have it working on 1-line mode correct. Its only the 4-line mode which is not working.

@pbecchi
Copy link
Contributor Author

pbecchi commented Aug 2, 2017

Yes 1 linea MMC mode, no other way!

@melvinpmathew
Copy link

@pbecchi Ok thanks.
@pbecchi @Staubgeborener We need to keep an eye on anyone who has 4-line MMC mode working :)

@Staubgeborener
Copy link

@melvinpmathew It's weird on my setup. I have the whole time IO0 connected to IO2 to flash AND to run SDMMC (1 line). When i try to pull IO2 low when flashing and after that high its not working. So to be clear: I have to connect IO0 to IO2 and IO2 to SD (with 10k pull up). Sure, with this setup my blue led is always glowing, but no other setup worked here.

@Staubgeborener
Copy link

Staubgeborener commented Aug 2, 2017

It's a never ending "love"story. It's not working here anymore.Without doing anything (nothing at code nor circuit), i'll get brownout detection errors while IO0 is connected to IO2. I use alls of the guides i found (connect IO2 to GND while flashing and after flashing disconnect this jumper, etc) but i'll get only E (11518) sdmmc_cmd: sdmmc_card_init: send_scr returned 0x109 Do you use a simple jumper for IO2 > GND or a resistor @melvinpmathew ? That would make no sense for me, but i'm believing now in everything.
It's so annoying.

@melvinpmathew
Copy link

@Staubgeborener The connection from IO2 goes to 3.3v with a jumber in between. I remove the jumper when flashing only. I have seen this error when connection is bad. Forgot what the exact issue was. I know its apain to get it working. I had to rewire and make sure the connections were proper multiple times to finally have it working.

@Staubgeborener
Copy link

Staubgeborener commented Aug 3, 2017

@melvinpmathew Wait. With a jumper cable between IO2 and 3.3V you mean the pull up resistor between or truly just a jumper?

is esp_start_wifi() working in the Main of the sdmmc example on your side? I'll get a brownout error. Everytime i try to use wifi + sdmmc there is brownout.

Edit: Ok, brownout disappeared (don't know why) but only SPI is working here. And instead of brownout i've got an Guru Meditation Error (in my own code, sdmmc example with spi works. But in my own code i use FreeRTOS to run some code on second core).
Next Edit: Hah. Guru Meditation Error instead of brownout, 'cause i deacitvate brownout. So the problem is the same.

No more 1-line anymore. But when flashing SPI mode on my ESP32 i don't have to pull down IO2. I left the circuit as it is and just flash.
Well, tomorrow should my new ESP32 arrive. I will test everything with a new one.

@Staubgeborener
Copy link

Can someone please try SDMMC + wifi + create a task on second core (for example with a while true loop and some calculations like increment an integer or so).
I will decompile the guru meditation error today to view what exactly happens here.

@melvinpmathew
Copy link

@Staubgeborener I mean a true jumper between IO2 and 3.3v. A pullup is just to achieve logic level!:

In electronic logic circuits, a pull-up resistor is a resistor connected between a signal conductor and a positive power supply voltage to ensure that the signal will be a valid logic level if external devices are disconnected or high-impedance is introduced.(Pull-up resistor - Wikipedia)

@Staubgeborener
Copy link

Staubgeborener commented Aug 3, 2017

@melvinpmathew So your circuit looks like this
pwyg6cq

When flashing you disconnect the jumper from IO2 -> 3.3V and after flashing (befor make monitor) you connect it?

If your setup looks different, please edit this and show. Thanks.
(Did you tried SDMCC + wifi + Task on second core?)

@fesch
Copy link

fesch commented Aug 3, 2017

@Staubgeborener I've written a program that lists every 10 seconds the root of the SD card add publishes a message to my MQTT broker over WiFi. Using xTaskCreate, a second task is running, which increments and prints every second a counter. Add this runs fine!

My SDMMC config in the library is this one, so only 1-bit mode:

host.max_freq_khz = SDMMC_FREQ_HIGHSPEED;
host.flags = SDMMC_HOST_FLAG_1BIT;

@Staubgeborener
Copy link

Nevermind, it's also working here now! Found out, that the writing intervals on my sd card where to short (some hundred times in a second, don't ask). This cause a guru meditation error.

@diskgokey
Copy link

much easier with latest update
use SD_MMC.begin("/sdcard", true) in setup step

blue-2357 pushed a commit to blue-2357/arduino-esp32 that referenced this issue Jul 17, 2024
dash0820 added a commit to dash0820/arduino-esp32-stripped that referenced this issue Mar 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants