看了下lm3s8962给的例程和相关资料,感觉是使用的一个移植来的FatFs模块来实现SD卡的读写功能的。在TI给的例程资料里是这样写的,
大意是说“这是一个读SD文件系统的例程,它通过FatFs来实现的”接着又说“FatFs是一种FAT文件系统的驱动,它提供了使用命令控制台通过串口发送指令来查看SD卡上的文件系统的方式”。
在资料上给的一个网站“http://elm-chan.org/fsw/ff/00index_e.html”上看到了对FatFs内容的详细解释。给张图,我们来看一下FatFs驱动的系统构成,这网站很给力啊,哈哈:
可以看出来,FatFs驱动其实是一个中间层(废话了,都说是驱动了,肯定是中间层的),它连接顶层应用(Application)和底层的物理实现(Disk I/O、RTC等),并提供相关驱动函数。因此,总体上也很好理解,分了三层,
顶层:应用操作;
中间层:FatFs驱动;
底层:硬件配置、物理实现。
那么先大致来看一下它的Application & Low level disk I/O两个部分。
1,Application Interface
从Application层给出的接口函数上,就能看出来它的确是一个应用层,所有的函数都是对SD卡上文件系统的相关操作,如打开文件、读文件、写文件、关闭文件、重命名等等。
2,Disk I/O Interface
这里,可以看到诸如,初始化磁盘、获取磁盘状态、读或写扇区等等一些接口函数,可以明白这一层主要作用于底层物理实现上。
整个FatFs驱动包含四个文件,两个部分,所在路径为\ek-lm3s8962\DriverLib\third_party\fatfs\src
有:
1,ff.h和ff.c:应用层部分,里面包含了application interface中所列的所有函数和源码;
2,diskio.h和mmc-ek-lm3s8962.c:底层部分,里面包含了disk i/o interface中所列的所有底层驱动函数和移植到lm3s8962上的源码。
需要说明的是,ff.h和ff.c和diskio.h都是其作者写好的为我们提供的标准文件,mmc-ek-lm3s8962.c是移植的时候需要自己修改的文件。如果我们需要移植的时候,自己修改,并替换mmc-ek-lm3s8962.c中的相关功能函数。
来看例程的main()函数中做了些什么事情:
int
main(void)
{
int nStatus; //定义一个状态变量
FRESULT fresult; //定义了一个FRESULT的枚举变量,FRESULT枚举型用来描述读取SD返回的各种状态
//设置系统时钟,8MHz,系统时钟不分频,用外部晶振
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC |
SYSCTL_XTAL_8MHZ | SYSCTL_OSC_MAIN);
//使能各种用到的外设,UART0口,SSIO口,和GPIOA口
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//配置SysTick为100Hz中断
SysTickPeriodSet(SysCtlClockGet() / 100);
SysTickEnable();
SysTickIntEnable();
//使能中断
IntMasterEnable();
//设置GPIOA口的A0和A1作为UART输出口
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//初始化UART0作为控制台,默认设置115200,8,N,1
UARTStdioInit(0);
//打印初始化信息
UARTprintf("\n\nSD Card Example Program\n");
UARTprintf("Type \'help\' for help.\n");
//用逻辑磁盘0装载文件系统
fresult = f_mount(0, &g_sFatFs);
if(fresult != FR_OK)
{
UARTprintf("f_mount error: %s\n", StringFromFresult(fresult));
return(1);
}
//while就不用多解释了吧
while(1)
{
//换行打印输出”\ >”
UARTprintf("\n%s> ", g_cCwdBuf);
//获取用户输入的命令
UARTgets(g_cCmdBuf, sizeof(g_cCmdBuf));
//解析并执行输入命令
nStatus = CmdLineProcess(g_cCmdBuf);
//错误命令处理
if(nStatus == CMDLINE_BAD_CMD)
{
UARTprintf("Bad command!\n");
}
//输入过多处理
else if(nStatus == CMDLINE_TOO_MANY_ARGS)
{
UARTprintf("Too many arguments for command processor!\n");
}
//执行后返回错误处理
else if(nStatus != 0)
{
UARTprintf("Command returned error code %s\n",
StringFromFresult((FRESULT)nStatus));
}
}
//
// Close the program (never gets here).
//
return(0);
}
以下是我在虚拟串口上,得到的数据内容:
上电复位后:
输入help指令后:
输入ls显示SD卡内容得到:
呵呵,我这个卡里拷的都是片子,自己新建了一个abc的空文件夹。
[
本帖最后由 drjloveyou 于 2010-12-16 10:13 编辑 ]