贴片SD卡移植FATFS文件系统

一、前言

手头有一块深圳雷龙提供的贴片 CS 创世 SD NAND Flash,挂载个文件系统把玩一下。首先介绍一下使用的贴片 SD 卡,以前使用的都是拔插式的 SD 卡,下面这个样子:



深圳雷龙提供的CS创世 SD NAND Flash 如下图:



二、贴片 SD 卡介绍

深圳雷龙提供的 CS 创世 SD NAND 属于 LGA-8 封装,标准 SDIO 接口,兼容SPI/SD/eMMC接口,兼容各大MCU平台,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圆擦写寿命10万次,通过1万次随机调电测试耐高低温,支持工业级温度-40°~+85°,机贴手贴都非常方便,速度级别Class10(读取速度23.5MB/S写入速度12.3MB/S)标准的SD2.0协议普通的SD卡可直接驱动。


贴片 SD 卡的使用很简单,管脚的连接方式和普通拔插的 SD 卡一致,所以我们设计硬件时按照普通 SD 的接线方式设计就行,以小熊派开发板为例子,单线 SDIO 硬件接线如下:

我使用小熊派开发板来挂载 FATFS 到雷龙这块 SD 卡上


三、配置 CubeMX 底层接口

首先使用 CubeMX 配置底层 SD 卡接口,选择单线模式,分频设置高一点,其他参数保持默认


配置完 SD 卡后开启 FATFS 的文件系统,选择挂载到 SD 卡,文件名选择 US ,buff 放到 STACK 上(注意调大栈空间)



配置完成后生成代码,cubemx 主要是以下两个初始化函数:


四、编写命令行测试代码

使用我之前移植的命令行框架,编写测试函数


void mount(char argc, char *argv)


{


if (argc > 1)


{


if (!strcmp("init", &argv[argv[1]]))


{


FRESULT ret = FR_INT_ERR;


ret = f_mount(&SDFatFS, SDPath, 1);


if (ret != FR_OK) {


shell_printf("mount init failed! %dr ", ret);


} else {


shell_printf("mount init succ!r ");


}


} else if (!strcmp("deinit", &argv[argv[1]])) {


FRESULT ret = FR_INT_ERR;


ret = f_mount(NULL, "", 1);


if (ret != FR_OK) {


shell_printf("mount deinit failed!r ");


} else {


shell_printf("mount deinit succ!r ");


}


}


}


else


{


shell_printf("mount need more arguments!r ");


}


};


void open(char argc, char *argv)


{


if (argc > 1)


{


FRESULT ret = FR_INT_ERR;


ret = f_open(&SDFile, &argv[argv[1]], FA_READ | FA_WRITE | FA_CREATE_NEW);


if (ret != FR_OK) {


shell_printf("open %s failed! code: %d r ", &argv[argv[1]], ret);


} else {


shell_printf("open %s succ!r ", &argv[argv[1]]);


}


}


else


{


shell_printf("mount need more arguments!r ");


}


};


void close(char argc, char *argv)


{


if (argc > 1)


{


FRESULT ret = FR_INT_ERR;


ret = f_close(&SDFile);


if (ret != FR_OK) {


shell_printf("close %s failed!r ", &argv[argv[1]]);


} else {


shell_printf("close %s succ!r ", &argv[argv[1]]);


}


}


else


{


shell_printf("mount need more arguments!r ");


}


};


void write(char argc, char *argv)


{


if (argc > 1)


{


FRESULT ret = FR_INT_ERR;


uint32_t write_num = 0;


ret = f_write(&SDFile, &argv[argv[1]], strlen(&argv[argv[1]]), &write_num);


if (ret != FR_OK) {


shell_printf("write file failed!r ");


} else {


shell_printf("write file succ!r ");


}


}


else


{


shell_printf("mount need more arguments!r ");


}


};



void read(char argc, char *argv)


{


if (argc > 1)


{


FRESULT ret = FR_INT_ERR;


uint32_t read_num = 0;


uint8_t read_buff[100];


ret = f_read(&SDFile, read_buff, 50, &read_num);


if (ret != FR_OK) {


shell_printf("read file failed! %dr ", ret);


} else {


shell_printf("read file succ!r ");


shell_printf("read dat: %s, read num %dr ", read_buff, read_num);


}


}


else


{


shell_printf("mount need more arguments!r ");


}


};


将测试函数挂到命令行中:


const static_cmd_st static_cmd[] = {


{"ls", shell_ls_cmd},


{"mount", mount},


{"open", open},


{"close", close},


{"read", read},


{"write", write},


{"", NULL, NULL},


};


下载代码,在命令行测试挂载以及读写函数:

读的数据有些乱码,用读卡器读出来看看:



可以看到成功写入,SD 卡挂载 FATFS 成功,命令行操作文件系统功能正常

————————————————

【本文转载自CSDN,作者:Top嵌入式】

深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

展开阅读全文

页面更新:2024-05-13

标签:文件系统   单线   接线   深圳   底层   函数   接口   速度   代码   测试

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top