Коллеги, большое спасибо за продолжение обсуждения, пока меня небыло (командировка).
Нашими усилиями было выяснено, что сбой происходит тогда, когда СУММАРНЫЙ обьем файлов перезодит через границу 4Гб.
Было попробовано на другом железе, со старой и новой FatFs, и даже двумя компиляторми (Кейл и ИАР).
Пробовали даже писать не в корневой каталог, а также с синком и без (тормозит он конкретно, если после каждого f_write вызывать!)
Писали блоками, равными кластеру (32К) - так быстрее всего.
От входных данных отвязались, и стали просто писать в цикле с максимальной скоростью - ну не ждать же 5-6 часов!
Может быть, у кого есть какая-нибудь система с сд-карточкой, работающей через sdio, может у себя попробовать, вот процедура, которую сегодня пробовали:
CODE
#define block_size 32768
#define blocks_in_mb (1024L*1024/block_size)
#define mb_in_file 500
//---
#define start_file 0
#define file_num 10
//
char fn[13];
//
void TestLog(void){
u32 i,j,k, bw;
FRESULT res;
//
Font=fnt16x8lat;
if(IsSDReady()){ // это просто проверка контакта, что карточка вставлена
SDPowerOn();
delay_ms(100);
if(CheckSD()){ // check OK
// test ------------------
ClrScr();
//f_chdir("/as");
for(i=start_file;i<file_num+start_file;i++){
sprintf((char *)fn, "/as/fn.%d",i);
res = f_open(&fsrc, fn, FA_CREATE_ALWAYS | FA_WRITE);
if(res==FR_OK){
SDFileOpen=1; // simulate working file
Show_String((u8 *)fn,2,0);
// record
for(j=0; j<mb_in_file;j++){
sprintf((char *)txt, "Rec: %d MB ",j+1);
Show_String(txt,6,0);
for(k=0;k<blocks_in_mb;k++){
res=f_write(&fsrc, &SDBuffer[0], block_size, &bw);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Write Error:%d %d",j+1,k);
Show_String(txt,4,0);
while(1);
}
res=f_sync(&fsrc);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Sync Error:%d %d",j+1,k);
Show_String(txt,4,0);
while(1);
}
}
}
res=f_close(&fsrc);
if(res!=FR_OK){
f_close(&fsrc);
sprintf((char *)txt, "Close error:%d %d",j,k);
Show_String(txt,4,0);
while(1);
}
}
}
//---------------------------------
Show_String("Write Complete", 0,0);
SDPowerOff();
while(1);
//------------------------------
}else{ // check fails
SDPowerOff();
ClrScr();// return;
return;
}
} // no SD
Show_String(" No SD Card ",2,0);
WaitNoKey();
WaitKey();
WaitNoKey();
ClrScr();
return;
}
//--------------------
// функция инициализирует и монтирует карточку:
static u8 CheckSD(u8 a){
SD_Error SDInitResult;
FRESULT res;
ClrScr();
SDInitResult=SD_Init();
if(SDInitResult==SD_OK){
Show_String("SD Init OK ",2,0);
delay_ms(1000);
res=f_mount( 0, &MSD_fatfs );
if ( res!= FR_OK ){
sprintf((char *)txt,"FS Fail %02d ",res);
Show_String(txt,4,10);
delay_ms(1000);
WaitNoKey();
WaitKey();
WaitNoKey();
return 0;
} // FS OK
Show_String("FS Mount ",4,0);
delay_ms(1000);
WaitNoKey();
return 1;
}
// SD Init fails:
sprintf((char *)txt,"SD Init Fail %02d",SDInitResult);
Show_String(txt,2,0);
delay_ms(1000);
WaitNoKey();
WaitKey();
WaitNoKey();
return 0;
}
//------------------------
Функции вывода на дисплей или ожидания кнопок можно закомментировать, или свои подставить.
У нас результаты такие: если file_num =8, то эти 8 байлов пишутся без проблем. Если 9 и больше - все проходит до конца без сообщений об ошибках, но карточка на компе уже не читается, просит форматирования.
Т.е сбой происходит в 9-ми файле. именно там переход границы 4Гб.
Но даже если поставить писать 10 файлов, то программа дорабатывает до конца без ошибок, хот ошибка по идее, была еще в 9-м!
Можно попробовать не сразу 9-10 файло в писать, а сначала
#define start_file 0
#define file_num 8
записать 8 файлов,
потом поставить:
#define start_file 8
#define file_num 1 // или 2
и дописать еще 1-2.
Каждый файл 500мб.