4、測試和使用
移植好以後,經過測試,可以順利讀出sd卡中的文件,在使用過程中遇到兩個問題:
1>怎麼讀寫SD卡子目錄裏面的文件?
在FatFS文件系統中,文件目錄相關的函數有
FRESULT f_opendir (DIR*, const char*); /* Open an existing directory */
FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */
但是沒有提供切換當前目錄的函數。
在C語言中,轉換當前目錄的辦法有幾種:
1)使用庫函數中的chdir()函數,但是編譯器的庫不支持這個函數
2)fp=fopen("123",使用方式)。這種方式不知道在PC上能否這樣使用,在這裏也不可行
這個問題稍頭疼了一下,看過ff.c的源碼之後,纔算明白
FatFS文件系統沒有切換目錄的函數,也沒有此功能,但是可以使用絕對路徑進行文件讀寫。
要讀寫子目錄下面的文件,只需在文件名前加上路徑。如"/test/test.dat"
2>文件的寫入
根據FatFS網站提供的Document,測試了一個文件複製的函數:
static int copy_file(char *dst,char *src)
{
FATFS fs; // Work area (file system object) for logical drive
FIL fsrc, fdst; // file objects
BYTE buffer[4096]; // file copy buffer
FRESULT res; // FatFs function common result code
UINT br, bw; // File R/W count
// Register a work area for logical drive 0
f_mount(0, &fs);
// Open source file
res = f_open(&fsrc, src, FA_OPEN_EXISTING | FA_READ);
if (res)
return 1;
// Create destination file
res = f_open(&fdst, dst, FA_CREATE_ALWAYS | FA_WRITE);
if (res)
return 1;
// Copy source to destination
for (;;) {
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
if (res || br == 0) break; // error or eof
res = f_write(&fdst, buffer, br, &bw);
if (res || bw < br) break; // error or disk full
}
// Close all files
f_close(&fsrc);
f_close(&fdst);
// Unregister a work area before discard it
f_mount(0, NULL);
return 0;
}
運行結果,SD卡的文件讀出正確,但是寫入異常,可以正確建立文件,但是裏面沒有內容。經過單步跟蹤,發現是sd_raw.c文件的sd_raw_write()函數的問題。
在執行到
if(length == write_length)
return 1;
語句時,總會直接返回,而沒有發送後續的寫SD卡的命令。
問題找到了,解決起來就很容易,把這句話註釋掉,文件寫入就正常了。這應該是sd_raw.c文件的一個bug。
整理之後,會把相關源代碼上傳。
sd卡驅動+FAT文件系統(三)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.