0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍AWorksLP基于FatFs的SD卡的基本用法

AGk5_ZLG_zhiyua 来源:ZLG致远电子 2023-05-08 16:23 次阅读

AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP基于FatFs的SD卡的基本用法。

e54a9c88-ec47-11ed-90ce-dac502259ad0.jpg  简介

SD卡(Secure Digital Card)即安全数字卡。是一种基于半导体快闪记忆器的新一代记忆设备,从MMC的基础上发展而来。由于它的体积小、数据传输速度快、可热拔插等优点,被广泛的运用于便携式和嵌入式设备上。 FatFs是一种面向小型嵌入式系统的通用的FAT文件系统。它完全是由ANSIC语言编写并且完全独立于底层I/O。

因此它可以很容易的移植到不同且资源有限的微控制器中。
由此可见在嵌入式开发中对SD卡中的文件进行管理时,FatFs是使用的最多的文件系统。 在AWorksLP中已经集成了FatFs文件系统,并支持使用该文件系统对SD卡的文件进行管理。

e5627cf4-ec47-11ed-90ce-dac502259ad0.jpg  相关API

在SD卡例程中,是通过文件接口实现对SD卡中文件进行操作的。在本文中仅介绍用到的文件接口,其他文件接口,请参考SDK中《AWorksLP OS 标准API参考手册(html)》。

AWorksLP函数列表:

e56ff78a-ec47-11ed-90ce-dac502259ad0.png

部分接口参数属性表:

e5c45596-ec47-11ed-90ce-dac502259ad0.png

e5627cf4-ec47-11ed-90ce-dac502259ad0.jpg  工程编译

环境的搭建、Eclipse工程的编译与配置、开发板的仿真与调试、请参考《AWorksLPSDK快速入门(MR6450)——开箱体验》

e5627cf4-ec47-11ed-90ce-dac502259ad0.jpg  例程介绍

本文介绍例程在{SDK}demosperipheralsdcard目录下。

在src目录下的demo_sdcard_fs.c例程代码中的第149行到第157行使用了while循环如代码1示,在循环中每隔500ms打开一次SD卡设备,通过检查返回值来检测是否有SD卡插入。如检测到返回值大于等于0则表明有SD卡插入。需要注意的是打开SD卡的设备名(“__BLK_NAME”在demo_sdcard_fs.c的第67行中默认被宏定义为“/dev/sdcardB0”)需要与实际检测到的SD卡设备名一致。

在AWorksLP中SD卡默认是动态监测,在SD卡插入时会在串口打印设备信息如图1示,串口显示SD卡设备名为“sdcardA0”,所以我们需要修改“__BLK_NAME”的宏定义为“/dev/sdcardA0”。

64 /* sd卡设备分区名,是由sd卡设备分区注册为字符型设备
65 * sd卡设备分区名一般是由SD卡设备名加上part number
66 */
67 #define __BLK_NAME   "/dev/sdcardB0"
149 do{
150   fd = aw_open(__BLK_NAME, AW_O_RDWR, 0);
151   if (fd < 0) {
152         aw_kprintf("open device failed
");
153         aw_mdelay(500);
154     } 
155 }while(fd < 0);
156 
157    aw_close(fd);
代码1SD卡设备检测流程

e608814e-ec47-11ed-90ce-dac502259ad0.png

图1串口打印SD卡设备名 代码2中第159行到172行的功能为使用aw_make_fs函数接口将SD卡格式化为FatFs文件系统。第159行的宏定义默认为#if 0,本次例程为了演示该步骤将宏改为#if 1。需要注意的是格式化会把卡内的数据清除,在执行格式化之前需要确保卡内没有重要数据。

159 #if 1  /* 格式化一次即可  */
160 
161     /* 卷名为"awdisk", 卷大小为4k  */
162     struct aw_fs_format_arg fmt = {"awdisk", 1024 * 4, 0};
163 
164     /* 制作文件系统 ,将存储器名为 "/dev/sd0"制作为"vfat"类型的文件系统  */
165     ret = aw_make_fs(__BLK_NAME, "vfat", &fmt);
166     if (ret != AW_OK) {
167         AW_ERRF(("failed: %d
", ret));
168         return;
169     }
170     AW_INFOF(("make fs OK
"));
171 
172 #endif

代码2SD卡格式化

格式化完成后,代码3中第174行通过aw_mkdir函数创建一个名为“/sd”的目录,以该目录为SD卡的挂载点。创建目录的文件模式为文件所有者、用户组和其他用户都可以对该目录进行读写。第181行通过aw_mount函数将SD卡挂载在“/sd”目录中。需要注意的挂载前需要确保目录存在,如果将SD卡挂载在不存在的目录上,挂载会失败。挂载的文件系统也需要与SD卡格式化的文件系统格式一致,否则挂载同样会失败。

173 /* 创建挂载节点 */
174 ret = aw_mkdir("/sd", AW_S_IRWXU | AW_S_IRWXG | AW_S_IRWXO);
175 if (ret != AW_OK) {
176   AW_ERRF(("/sd create error: %d!
", ret));
177   return;
178 }
179 
180 /* 文件系统挂载到"/sd"节点 */
181 ret = aw_mount("/sd", __BLK_NAME, "vfat", 0, NULL);
182 if (ret != AW_OK) {
183   AW_ERRF(("/sd mount FATFS error: %d!
", ret));
184   return;
185 }
186 AW_INFOF(("mount OK
"));
187 
188 /* SD 卡读写测试 */
189 __fs_file_rw();

代码3挂载SD卡

最终例程会在第189行调用__fs_file_rw函数,函数体如代码4所示。在该函数中会在“/sd”目录下创建一个名为“aworks_sd_test.txt”的测试文件,通过对该文件进行读写测试,读写完成后对数据进行效验,效验通过则表明SD卡读写测试成功。至此SD卡例程执行完毕,整个过程会有串口信息打印如图2所示。

69 aw_local void __fs_file_rw (void)
70 {
71     int         i = 0;
72     int         handle;
73     char       *p_file_name = "/sd/aworks_sd_test.txt";
74     uint8_t     str_buf[256] = {0};
75     int         len;
76 
77     /*
78     * 写文件测试(包括创建,文件写操作,关闭操作)
79     */
80     /* 创建新文件 */
81     handle = aw_open(p_file_name, AW_O_RDWR | AW_O_CREAT, 0777);
82     if (handle < 0) {
83         AW_ERRF(("creat file error: %d
", handle));
84         return;
85     }
86     AW_INFOF(("creat file %s ok
", p_file_name));
87 
88     len = sizeof(str_buf);
89     for (i = 0; i < len; i++) {
90         str_buf[i] = (uint8_t)i;
91     }
92 
93     /* 写文件 */
94     if (aw_write(handle, str_buf, sizeof(str_buf)) != sizeof(str_buf)) {
95         aw_close(handle);
96         AW_ERRF(("write file error
"));
97         return;
98     }
99     AW_INFOF(("write file %s ok
", p_file_name));
100 
101     /* 关闭文件 */
102     aw_close(handle);
103     AW_INFOF(("close file %s ok
", p_file_name));
104 
105     /*
106     * 读文件测试(包括打开,文件读操作,关闭操作)
107     */
108     /* 打开文件 */
109     handle = aw_open(p_file_name, AW_O_RDONLY, 0777);
110     if (handle < 0) {
111         AW_ERRF(("open file error: %d
", handle));
112         return;
113     }
114     AW_INFOF(("open file %s ok
", p_file_name));
115 
116     memset(str_buf, 0, sizeof(str_buf));
117 
118     /* 读取文件 */
119     len = sizeof(str_buf);
120     if (aw_read(handle, str_buf, sizeof(str_buf)) != sizeof(str_buf)) {
121         aw_close(handle);
122         AW_ERRF(("read file error!
"));
123         return;
124     }
125     AW_INFOF(("read file %s ok
", p_file_name));
126 
127     /* 检验数据是否正确 */
128     for (i = 0; i < len; i++) {
129         if ((uint8_t)i != str_buf[i]) {
130             AW_ERRF(("file data error!
"));
131             aw_close(handle);
132             return;
133         }
134     }
135 
136     AW_INFOF(("file %s data check ok
", p_file_name));
137 }

代码4__fs_file_rw读写测试函数

e61a3a10-ec47-11ed-90ce-dac502259ad0.png

图2SD卡例程执行成功的串口信息

e5627cf4-ec47-11ed-90ce-dac502259ad0.jpg  扩展介绍

在上节中有提到AWorksLP SD卡默认是动态检测设备,即支持热拔插,这是通过一个检测引脚实现的。在实际应用中,可能出于节约I/O资源的考虑,需要将检测引脚复用为其他功能。在这种情况下可以将SD卡定义为静态设备,这样检测引脚就能复用作其他功能了。

在AWorksLP中SD卡的动态设备在图形化配置界面中没有SD卡设备可供使用,只需将对应的SDIO控制器选上即可。上文例程中SD卡是通过sdio1设备来控制的,所以仅需保证sdio1设备使能即可,如图3所示。

e63ad0cc-ec47-11ed-90ce-dac502259ad0.png

图3 动态设备下确认控制器被选上

将SD卡设备以静态方式注册时,则需要进行如下操作:

将pins.dts({board}dtspins.dts)文件中CD引脚配置注释,修改完成后如代码5所示;

在board.dts文件中添加SD卡设备,如代码5所示。

/*  cd-pins = <&pin1 PIN_PD28
(IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) 
(IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) 
(IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) >; */
代码5 注释引脚
 &sdio1 {
   sdio_mem_card0:sdio_mem_card0 {
     compatible = "general,sdio_mem_card";
     label = "sdcardA";
     status = "disabled";
   };
 };
代码6添加SD卡设备

完成修改后,重新打开例程编译图形化配置界面,即可在Board EPC6450-AWI/Devices/External Memories选项下看到板卡下新增sdcardA设备如图4所示,使能该项并保存退出,再次编译工程并执行固件,例程现象与上节中所描述完全一致。

e659d97c-ec47-11ed-90ce-dac502259ad0.png

图4 选择SD卡设备

注意:例程在静态SD卡设备下执行需要在固件运行前将SD卡插入。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6813

    浏览量

    147673
  • 嵌入式
    +关注

    关注

    4984

    文章

    18300

    浏览量

    288718
  • SD卡
    +关注

    关注

    2

    文章

    530

    浏览量

    63029
  • FatFS文件系统

    关注

    0

    文章

    12

    浏览量

    7475

原文标题:【产品应用】AWorksLP例程介绍(MR6450)—— SD卡

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    cc3200+fatfs+sd 文件删除

    TI工程师你好!       我使用SDK1.1.0 Fatfs Rv0.10C,在使用fatfs文件系统的时候,我下载一个40M大文件到SD,下载完场之后调用f_unlink删除此
    发表于 05-14 07:22

    可以使用FatFSSD上创建Excel文件吗

    大家好,你们中有人试图在SD上创建有或没有FATFS代码的Excel文件吗?是否可以在SD上创建Excel文件而不是.text文件?
    发表于 01-30 10:33

    stmF103rct6使用fatfsSD

    stmF103rct6使用fatfsSD,我现在是把需要的数据从SD读出来,然后发送到IO口,发完再回来读
    发表于 06-29 20:29

    32的sdFATFS文件系统是什么

    最近看了32的sdFATFS文件系统,现在就自己的理解总结一下。一、SD模块SD
    发表于 07-13 06:57

    基于SPI模式的SD驱动和FatFS的移植

    本文实现了基于STM32F107VC的金牛开发板的基于SPI模式的SD驱动和FatFS的移植,以及利用minini库对ini配置信息文件进行读取。
    发表于 08-05 07:16

    如何在Fatfs软件上去读写SD下文件呢

    读写SD是指什么?SD/TF有哪些硬件接口?如何在Fatfs软件上去读写SD
    发表于 11-01 06:16

    探讨一下SDFATFS文件系统

    SD模块支持哪几种操作模式呢?如何对SD进行初始化呢?FATFS是什么意思?FATFS文件系
    发表于 12-17 06:35

    使用spi驱动sd并挂载fatfs文件系统

    FatFs 文件系统读写(SD )本 demo 主要演示使用 spi 驱动 sd 并挂载 fatfs
    发表于 07-11 16:47

    FATFS的LPC546xx SD应用手册

    LPC546xx 带有FATFS文件系统的SD接口应用手册
    发表于 12-07 07:08

    关于SD使用FATFS的问题求解

    尊敬的先生/女士,我对 STM32 的世界还很陌生,尽管我每天都在探索关于它们的新事物。我必须使用 MCU 的 SDMMC 的(内部)DMA,将大容量字节从 SD 传输到 micro 的内部 RAM。为此,是否真的有必要使用 FATF
    发表于 02-03 08:25

    stm32 CubeMx 实现SD/sd nand FATFS读写测试

    文章目录 stm32 CubeMx 实现SD/SD nand FATFS读写测试 1. 前言 2. 环境介绍 2.1 软硬件说明 2.2
    发表于 06-02 17:01

    DSP+FPGA+FATFS+SD

    项目背景,在DSP上挂Fatfs文件系统,而SD是挂在FPGA上的,DSP需要通过FPGA与SD交互,大概就是会把数据存到FPGA的DD
    发表于 11-14 09:30

    基于SD卡的FATFS文件系统的研究与应用_崔鹏伟

    基于SD卡的FATFS文件系统的研究与应用_崔鹏伟。
    发表于 04-14 16:46 40次下载

    【产品应用】AWorksLP例程介绍(MR6450)—— SD

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP基于FatFs
    的头像 发表于 05-10 09:42 373次阅读
    【产品应用】<b class='flag-5'>AWorksLP</b>例程<b class='flag-5'>介绍</b>(MR6450)—— <b class='flag-5'>SD</b>卡

    如何移植FatFs文件系统到SD卡内

    SD卡的FatFs文件管理系统
    的头像 发表于 09-19 09:11 904次阅读
    如何移植<b class='flag-5'>FatFs</b>文件系统到<b class='flag-5'>SD</b>卡内