8605|11

978

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

LM3S8962学习笔记3——SD卡读写例程解析 [复制链接]

看了下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 编辑 ]

最新回复

mmc-ek-lm3s8962.c里面的函数都没有调用,现在这个问题解决了吗?   详情 回复 发表于 2017-10-27 10:37
 
点赞 关注(2)

回复
举报

826

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

LZ给个工程文件可以吗

LZ给个工程文件可以吗
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

板凳
 
不错,写得很好。。。
 
个人签名我的博客
 
 

回复

1412

帖子

15

TA的资源

版主

4
 
https://bbs.eeworld.com.cn/thread-225051-1-3.html

可以看看这个帖子,里面又写数据到TF卡的代码
 
个人签名https://bbs.eeworld.com.cn/thread-471646-1-1.html
欢迎加入我的团队
 
 

回复

210

帖子

0

TA的资源

一粒金砂(高级)

5
 
不错,写得很好的。
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

6
 
非常值得学习的东西,感谢楼主!!!
 
 
 

回复

419

帖子

9

TA的资源

纯净的硅(初级)

7
 
谢谢了.我这几天调式半天.都没调通.原来是串口调试软件出问题.另外请教一下.根据FATFS官方介绍,要执行disk_initialize ();函数,这个例程怎么都没看到FATFS初始化函数.
 
 
 

回复

978

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 7楼 boming 的帖子

这段代码只是部分。。不是全部
 
 
 

回复

978

帖子

0

TA的资源

一粒金砂(高级)

9
 

回复 7楼 boming 的帖子

建议你看下TI的完整例程版本
 
 
 

回复

419

帖子

9

TA的资源

纯净的硅(初级)

10
 

回复 9楼 drjloveyou 的帖子

明白你这个是主函数部分代码.我也看了全部代码,都没看到调用disk_initialize ();这个函数.能否指点一下.?
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

11
 

学习啦 谢谢

 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

12
 
boming 发表于 2012-5-17 23:59
明白你这个是主函数部分代码.我也看了全部代码,都没看到调用disk_initialize ();这个函数.能否指点一下.?

mmc-ek-lm3s8962.c里面的函数都没有调用,现在这个问题解决了吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表