greiman / SdFat

Arduino FAT16/FAT32 exFAT Library
MIT License
1.07k stars 502 forks source link

Writing to two files fails after some time #373

Closed WMXZ-EU closed 2 years ago

WMXZ-EU commented 2 years ago

The following program

//https://forum.pjrc.com/threads/70100-exFAT-SD-card-append-write-fails-after-256-kb-when-writing-to-2-files

#include <SdFat.h>
#include <SdFatConfig.h>

#define WRITE_TO_SD_CHUNK_SIZE (8*1024)

SdFs sd;
uint8_t st[WRITE_TO_SD_CHUNK_SIZE];

void setup() {
// USB serial port
    Serial.begin(115200);
    int retry = 0;    // Serial is the USB port, but if no PC connected/active, then proceed anyway
    while ((!Serial) && (retry++ <100))
        delay(10);

    Serial.println("test exFAT logger");

    if (sd.begin(SdioConfig(FIFO_SDIO))) 
        Serial.println ("sd.begin() done");

// init char buffer with arbitrary readable data
    for (int i=0; i<WRITE_TO_SD_CHUNK_SIZE; i++)
        st[i] = ' ' + i & 0x3f;

}

void write_to_log_file (char *log_filename)
{
    FsFile F;
    int written;
    fspos_t pos;

    F = sd.open(log_filename, O_WRONLY | O_CREAT | O_APPEND);
    if (F)
    {
        written = F.write (st, WRITE_TO_SD_CHUNK_SIZE);
        F.fgetpos(&pos);
        Serial.printf ("file %s, ", log_filename);
        Serial.printf ("pos=%d, ", pos);
        Serial.printf ("adding %d bytes, written %d\n", WRITE_TO_SD_CHUNK_SIZE, written);
    }

    F.close();  
}

void loop ()
{
    char filename_A[40] = "FILE_A.txt";
    char filename_B[40] = "FILE_B.txt";

    write_to_log_file (filename_A);
    write_to_log_file (filename_B);

    delay(100);
}

generates the following output

test exFAT logger
sd.begin() done
file FILE_A.txt, pos=8192, adding 8192 bytes, written 8192
file FILE_B.txt, pos=8192, adding 8192 bytes, written 8192
file FILE_A.txt, pos=16384, adding 8192 bytes, written 8192
file FILE_B.txt, pos=16384, adding 8192 bytes, written 8192
file FILE_A.txt, pos=24576, adding 8192 bytes, written 8192
file FILE_B.txt, pos=24576, adding 8192 bytes, written 8192
file FILE_A.txt, pos=32768, adding 8192 bytes, written 8192
file FILE_B.txt, pos=32768, adding 8192 bytes, written 8192
file FILE_A.txt, pos=40960, adding 8192 bytes, written 8192
file FILE_B.txt, pos=40960, adding 8192 bytes, written 8192
file FILE_A.txt, pos=49152, adding 8192 bytes, written 8192
file FILE_B.txt, pos=49152, adding 8192 bytes, written 8192
file FILE_A.txt, pos=57344, adding 8192 bytes, written 8192
file FILE_B.txt, pos=57344, adding 8192 bytes, written 8192
file FILE_A.txt, pos=65536, adding 8192 bytes, written 8192
file FILE_B.txt, pos=65536, adding 8192 bytes, written 8192
file FILE_A.txt, pos=65536, adding 8192 bytes, written 0
file FILE_B.txt, pos=65536, adding 8192 bytes, written 0
file FILE_A.txt, pos=65536, adding 8192 bytes, written 0
file FILE_B.txt, pos=65536, adding 8192 bytes, written 0

More discussion can be found in the teensy forum (link at top of program) used latest SdFat without edits in SdConfig.h

greiman commented 2 years ago

I tested with SdFat 2.1.2 and 2.1.4-beta.3 I uses 32GB FAT, 64GB exFAT, 512GB exFAT on a Teensy 4.1

I used Teensyduino 1.56 with Arduino 1.8.19

Seems to work on all.

With 32GB FAT test exFAT logger 2.1.4-beta.3 sd.begin() done file FILE_A.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_B.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_A.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_B.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_A.txt, pos=24576, adding 8192 bytes, written 8192 file FILE_B.txt, pos=24576, adding 8192 bytes, written 8192 .... file FILE_B.txt, pos=7004160, adding 8192 bytes, written 8192 file FILE_A.txt, pos=7012352, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7012352, adding 8192 bytes, written 8192 file FILE_A.txt, pos=7020544, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7020544, adding 8192 bytes, written 8192 file FILE_A.txt, pos=7028736, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7028736, adding 8192 bytes, written 8192

With 64GB exFAT test exFAT logger 2.1.4-beta.3 sd.begin() done file FILE_A.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_B.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_A.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_B.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_A.txt, pos=24576, adding 8192 bytes, written 8192 file FILE_B.txt, pos=24576, adding 8192 bytes, written 8192 ... file FILE_A.txt, pos=6774784, adding 8192 bytes, written 8192 file FILE_B.txt, pos=6774784, adding 8192 bytes, written 8192 file FILE_A.txt, pos=6782976, adding 8192 bytes, written 8192 file FILE_B.txt, pos=6782976, adding 8192 bytes, written 8192 file FILE_A.txt, pos=6791168, adding 8192 bytes, written 8192

With 512GB exFAT est exFAT logger 2.1.4-beta.3 sd.begin() done file FILE_A.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_B.txt, pos=8192, adding 8192 bytes, written 8192 file FILE_A.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_B.txt, pos=16384, adding 8192 bytes, written 8192 file FILE_A.txt, pos=24576, adding 8192 bytes, written 8192 file FILE_B.txt, pos=24576, adding 8192 bytes, written 8192 ... file FILE_A.txt, pos=7315456, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7315456, adding 8192 bytes, written 8192 file FILE_A.txt, pos=7323648, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7323648, adding 8192 bytes, written 8192 file FILE_A.txt, pos=7331840, adding 8192 bytes, written 8192 file FILE_B.txt, pos=7331840, adding 8192 bytes, written 8192

WMXZ-EU commented 2 years ago

Got it working also