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文件系统(三)
最新推荐文章于 2023-02-21 20:10:01 发布