I have tested this problem on 6 micro-SDHC cards of 3 different types. 3 are 32-GB Sandisk, 2 are 16-GB Kingston, and 1 is 16-GB Samsung. These cards are used in data loggers and typically contain hundreds or thousands of 5-MB text files whose names are formatted like FILE1234.TXT.
The problem is that when a logger containing such a card (containing data) is started, the first write takes a long time--from 7 to 30 seconds. Opening the file (the smallest available filename) doesn't take too long. Subsequent writes don't take long. Just the first write.
Now, the plot thickens: this delay can be eliminated by first opening FILE0000.TXT and immediately closing it. Further, once this is done, that disk is never affected by this delay again. This has happened with each of the disks.
Here is some minimal code demonstrating the issue:
#include <SdFat.h>
SdFat sd;
SdFile file;
void setup(){
Serial.begin(57600);
sd.begin();
int m = millis(); // just to time everything
// critical line that prevents delays
file.open("FILE0000.TXT", O_WRITE | O_TRUNC | O_CREAT); file.close();
// file we actually want to write to
file.open("FILE6005.TXT", O_WRITE | O_TRUNC | O_CREAT);
Serial.println(millis()-m); // print how long it took to open
file.println(F("test"));
Serial.println(millis()-m); // print how long it took to write
file.close();
}
void loop(){
}
When the "critical line" in the code is commented out, I get a big delay in the first write to the file. When it's uncommented, there's no delay, and I never get a delay on that disk again even with the line commented. I saw this on all six disks.
One further bit of mystery: at first, this did not work on one of the cards. I checked and found that this card alone had a hidden ".Trash-1000" directory. I removed that directory and tried again, and this fix did work that time.
Does anyone have any idea what's going on here?
3/6/FILE3672.TXT