Problem writing to card in SPI mode
Posted: Sat Nov 18, 2017 9:49 am
Hi
We have problem writing file to SD card, small files up to 1MB usually writes well, bigger files up to 10MB sometimes fails during fwrite.
I have seen this issues: https://github.com/espressif/esp-idf/issues/1089 and https://github.com/espressif/esp-idf/issues/1093 and I have new esp-idf with write timeout for SD card set to:
We receive the file from tcp connection and write it to SD card with a code:
I have tested card initialization with different options:
Card is recognized as:
card is: GOODRAM microSD 8GB cl4 lifetime warranty. We were using this card with esp8266 in earlier project and no problem.
Our GPIO setup is:
for testing we are using https://www.dfrobot.com/product-1590.html with http://www.geeetech.com/wiki/index.php/ ... ard_Module also with additional 10nF 100nF 1uF on input 3.3V
We were also adding different pull up resistors between MISO MOSI
It looks like ESP32 is very picky about writing into microSD card in SPI mode.
What should be the correct setup ? I mean software SD card initialization parameters and also resistors and capacitors for SD card module?
Below are a few errors from multiple testes. At the moment files about 6,3MB sometimes writes well, sometimes they fail at the end.
I can provide more data if needed.
Best Regards
Marek
We have problem writing file to SD card, small files up to 1MB usually writes well, bigger files up to 10MB sometimes fails during fwrite.
I have seen this issues: https://github.com/espressif/esp-idf/issues/1089 and https://github.com/espressif/esp-idf/issues/1093 and I have new esp-idf with write timeout for SD card set to:
Code: Select all
#define SDMMC_DEFAULT_CMD_TIMEOUT_MS 1000 // Max timeout of ordinary commands
#define SDMMC_WRITE_CMD_TIMEOUT_MS 5000 // Max timeout of write commands
Code: Select all
int total = 10*1024;
char *data = malloc(total);
while(1) {
bzero(data,total);
ssize_t sizeRead = recv(clientSock, data , 1024, 0);
if (sizeRead < 0) {
break;
}
sd_write_file(data,sizeRead);
}
bool sd_write_file(char *buff,int size) {
int ret=fwrite(buff,1,size,sd_file);
if(ret!=size) {
ESP_LOGE(sd_tag,"Write error:%d ret:%d size:%d",ferror(sd_file),ret,size);
return false;
}
else {
ESP_LOGI(sd_tag,"File write size:%d\n",size);
return true;
}
fflush(sd_file);
}
Code: Select all
host.max_freq_khz=SDMMC_FREQ_PROBING;
host.max_freq_khz=SDMMC_FREQ_DEFAULT;
Code: Select all
I (49) gpio: GPIO[5]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
Name: SA08G
Type: SDHC/SDXC
Speed: default speed
Size: 7386MB
CSD: ver=1, sector_size=512, capacity=15126528 read_bl_len=9
SCR: sd_spec=2, bus_width=5
Our GPIO setup is:
Code: Select all
#define PIN_NUM_MISO 19
#define PIN_NUM_MOSI 23
#define PIN_NUM_CLK 18
#define PIN_NUM_CS 5
We were also adding different pull up resistors between MISO MOSI
It looks like ESP32 is very picky about writing into microSD card in SPI mode.
What should be the correct setup ? I mean software SD card initialization parameters and also resistors and capacitors for SD card module?
Below are a few errors from multiple testes. At the moment files about 6,3MB sometimes writes well, sometimes they fail at the end.
I can provide more data if needed.
Best Regards
Marek
Code: Select all
I (18689) socket_server: Total bytes:463872 left file_size:5868594
E (18769) sdspi_host: sdspi_host_start_command: cmd=24 error=0x107
E (18769) sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
E (18769) diskio_sdmmc: sdmmc_write_blocks failed (263)
E (18779) sd_card:: Write error:1 ret:0 size:512
I (18779) socket_server: Total bytes:464384 left file_size:5868082
I (167149) socket_server: Total bytes:6259344 left file_size:73122
E (167219) sdspi_host: sdspi_host_start_command: cmd=24 error=0x107
E (167219) sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
E (167229) diskio_sdmmc: sdmmc_write_blocks failed (263)
E (167229) sd_card:: Write error:1 ret:368 size:512
I (167239) socket_server: Total bytes:6259856 left file_size:72610
I (92199) socket_server: Total bytes:6258712 left file_size:74266
E (92349) sdspi_host: sdspi_host_start_command: cmd=24 error=0x107
E (92349) sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
E (92359) diskio_sdmmc: sdmmc_write_blocks failed (263)
E (92359) sd_card:: Write error:1 ret:488 size:1024
I (92369) socket_server: Total bytes:6259736 left file_size:73242
E (92369) sd_card:: Write error:1 ret:0 size:1024
I (19919) socket_server: Total bytes:1198080 left file_size:5134898
E (19989) sdspi_host: sdspi_host_start_command: cmd=25 error=0x107
E (19999) sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
E (19999) diskio_sdmmc: sdmmc_write_blocks failed (263)
E (19999) sd_card:: Write error:1 ret:0 size:1024
I (94569) socket_server: Total bytes:6259636 left file_size:73342
E (94639) sdspi_host: sdspi_host_start_command: cmd=24 error=0x107
E (94639) sdmmc_cmd: sdmmc_write_sectors_dma: sdmmc_send_cmd returned 0x107
E (94649) diskio_sdmmc: sdmmc_write_blocks failed (263)
E (94649) sd_card:: Write error:1 ret:76 size:1024