sd卡驅動+FAT文件系統(三)

 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。
    
    整理之後,會把相關源代碼上傳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章