以下是我最近一次使用这个家伙的代码参考。
在diskio里面,我其实只关心读,所以写函数我就空着了。
初始化的时候,原本是在disk_initialize里初始化SD卡,后来由于种种原因,我在别处另外初始化了,所以这里关于SD的初始化就注释掉啦,相当于也是个空的。
读的时候,由于pfatfs是内存节约型,所以可能会反复读取同一扇区,所以我加了一个全局静态数组,它试图反复读同一扇区的时候,我就直接从数组里反给它
实际使用的时候,按照说明里的,这样做就可以了
FATFS fs;//定义一个工作用的内存结构
if(sdcard_init() == 0)//这就是我的手工处理SD卡初始化,如果你写在了disk_initialize里,这就不需要初始化了,直接初始化文件系统即可
{
printf("Sdcard OK.\n");
}
else
{
printf("Sdcard NG!\n");
return;
}
t = pf_mount(&fs);//这就是初始化文件系统啦,这个函数将会去调用你的disk_initialize,还会调用读扇区以识别sd卡中的文件系统,pfatfs只支持单个分区
if(t == FR_OK)
{
printf("FS OK.\n");
}
else
{
printf("FS NG!\n");
return;
}
t = pf_open("/mp3/test1.mp3");//我没有使用opendir的功能,我当时知道固定读取哪个文件,所以直接写了以根开始的全路径
if(t == FR_OK)
{
printf("file open OK.\n");
addr_buf = 0x10000000;
while(pf_read((void*)(addr_buf), 0x2000, &ret_size) == FR_OK)//同样的,没有使用测量文件长度的功能,就读啊读,一直读到文件结束
{
addr_buf += ret_size;
if(ret_size < 0x2000)
{
break;
}
}
printf("file read OK.\n");//其实严格意义上讲,这里就判断读取完成是不正确的。我就是偷懒啦
}
else
{
printf("file open NG.\n");
return;
}
然后继续后续处理吧。
下面是diskio里面的主要内容有:
==============================================================
static u8 sector_buf[0x200];
static DWORD sector_num = 0xFFFFFFFF;
/*-----------------------------------------------------------------------*/
/* Initialize Disk Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (void)
{
DSTATUS stat;
// Put your code here
sector_num = 0xFFFFFFFF;
// if(sdcard_init() == 0)
// {
// dbg_puts("Init sdcard complete!\n");
// stat = RES_OK;
// }
// else
// {
// dbg_puts("Init sdcard failed!\n");
// stat = RES_ERROR;
// }
stat = RES_OK;
return stat;
}
/*-----------------------------------------------------------------------*/
/* Read Partial Sector */
/*-----------------------------------------------------------------------*/
DRESULT disk_readp (
BYTE* dest, /* Pointer to the destination object */
DWORD sector, /* Sector number (LBA) */
WORD sofs, /* Offset in the sector */
WORD count /* Byte count (bit15:destination) */
)
{
DRESULT res;
// Put your code here
if(sector != sector_num)
{
sector_num = sector;
sdcard_read(sector_num, sector_buf);
}
memcpy(dest, §or_buf[sofs], count);
res = RES_OK;
return res;
}
/*-----------------------------------------------------------------------*/
/* Write Partial Sector */
/*-----------------------------------------------------------------------*/
DRESULT disk_writep (
const BYTE* buff, /* Pointer to the data to be written, NULL:Initiate/Finalize write operation */
DWORD sc /* Sector number (LBA) or Number of bytes to send */
)
{
DRESULT res = RES_ERROR;
if (!buff) {
if (sc) {
// Initiate write process
} else {
// Finalize write process
}
} else {
// Send data to the disk
}
return res;
}