贴片SD卡移植FATFS文件系统

news2024/11/18 19:57:06

一、前言

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

拿到的贴片雷龙 SD 卡如下图:

二、贴片 SD 卡介绍

雷龙的 SD 卡 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! %d\r\n", ret);

            } else {

                shell_printf("mount init succ!\r\n");

            }

        } 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\n");

            } else {

                shell_printf("mount deinit succ!\r\n");

            }

        }

    }

    else

    {

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

    }

};

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\n ", &argv[argv[1]], ret);

        } else {

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

        }

    }

    else

    {

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

    }

};

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\n", &argv[argv[1]]);

        } else {

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

        }

    }

    else

    {

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

    }

};

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\n");

        } else {

            shell_printf("write file succ!\r\n");

        }

    }

    else

    {

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

    }

};

 

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! %d\r\n", ret);

        } else {

            shell_printf("read file succ!\r\n");

            shell_printf("read dat: %s, read num %d\r\n", read_buff, read_num);

        }

    }

    else

    {

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

    }

};

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

const static_cmd_st static_cmd[] = {

    {"ls", shell_ls_cmd},

    {"mount", mount},

    {"open", open},

    {"close", close},

    {"read", read},

    {"write", write},

    {"\0", NULL, NULL},

};

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RAD Studio 11.2 详细图文安装教程 (delphi 11.2)

准备 准备好安装镜像和嘿嘿工具 镜像可以到官网下载,工具百度搜一搜就能找到 系统环境:win11 专业版 开始安装 双击镜像文件,然后将里面的文件复制到一个地方 注意一定要把这两个文件复制出来再运行,否则会嘿嘿失败 右键点击红色…

前有农民歌唱家大衣哥,后有农民女歌手草帽姐,都给山东人增光了

山东自古以来是孔孟之乡礼仪之邦,也诞生了很多的好儿女,农民歌唱家大衣哥就是其中的一位。大衣哥是从《星光大道》走红,也是大山东人的骄傲,他出名十几年不忘本,扎根农村为老乡们做贡献的精神,也感动了无数…

从0到1完成一个Vue后台管理项目(五、登录页,mock,token,axios封装)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

两大js调试工具的安装

首先要确保已经安装nodejs,具体安装步骤可以百度。 node-inspect工具的安装和使用 对于node-inspect工具我们可以全局安装: npm install node-inspect -g由于安装过cnpm,所以几乎在1秒内将node-inspect安装完成。 cnpm的安装方法&#xff…

Multisim14.0仿真应用举例——OCL电路输出功率和效率的研究

安装教程:http://t.csdn.cn/qvvqA一、理论讲解OCL全称: Output Capacitorless,中文名称:无输出电容的功率放大电路。功率放大带电路最重要的技术指标是最大输出功率Pom和效率η 。若输入信号Ui为正弦信号sin(wt),负载上能得到的最大输出电压且…

你是真的“C”——详解C语言实现静态版通讯录

详解C语言实现静态版通讯录😎前言😃通讯录设计的关键思想点分析 🙌通讯录界面(meun)设计 🙌增加信息功能实现代码🙌删除信息功能实现代码🙌查询信息功能实现代码🙌修改信…

【强训】Day04

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 计算糖果2. 进制转换答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 下列与队列结构有关联的是() A 函数的递归调用 B 数组元素的引用 C 多重循环的执行…

【年终总结系列 2022】魔幻、疲惫、收获与成长

时光飞逝,转眼到了2022年的年末了。仿佛昨天还在看冬奥的开幕式,而第一次做核酸又似乎很遥远,生活像是一瞬间恢复了喧嚣,可能是三年之期已到吧。这一年于我们大众而言我愿称之为魔幻的一年,于我自己而言,则…

6.4 工具-RabbitMQ

目录 6.4.1 RabbitMQ概述 6.4.1.1 什么是RabbitMQ 6.4.1.2 Erlang和AMQP 6.4.1.3 RabbitMQ 6.4.1.3.1 RabbitMQ优点 6.4.1.3.2 应用解耦 6.4.1.3.3 异步处理 6.4.1.3.4 流量削峰 6.4.2 RabbitMQ安装 6.4.3 RabbitMQ架构 6.4.3.1 架构图 6.4.3.1.1 术语 6.4.3.1.…

MongoDB入门学习(二)GridFS、GridFS整合SpringBoot

文章目录GridFSGridFS简介GridFS存储原理GridFS整合SpringBoot新增store()查询与下载find()、findOne()删除delete()Demo案例GridFS GridFS简介 GridFS是MongoDB的一个用来存储/获取大型数据(图像、音频、视频等类型的文件)的规范。相当于一个存储文件…

Java中创建不可变集合、Stream流、异常体系、日志框架

创建不可变集合、Stream流、异常体系、日志框架创建不可变集合什么是不可变集合?为什么要创建不可变集合?如何创建不可变集合?不可变集合的特点?Stream流Stream流的概述Stream流的获取Stream流的常用API(中间操作方法&…

Index Tree(树状数组)

1、引入 线段树解决的是 区间查询 和 区间更新 的问题, O(logn)O(logn)O(logn) 复杂度。 人为规定:数组下标从 1 开始。 如果要计算数组某个范围 L 到 R 的累加和,那么可以准备一个前缀和数组 help,得到前缀和数组后&#xff0…

【寒假每日一题】洛谷 P6263 [COCI2014-2015#3] STROJOPIS

题目链接:P6263 [COCI2014-2015#3] STROJOPIS - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 正确的打字正成为文化的重要组成部分。如果你仍然没有使用所有的十根手指来打字,你必须重新学习打字——然后你会打字更快,感觉更舒适…

Web进阶:Day1 字体图标、平面转换、空间转换、动画

Web进阶:Day1 Date: October 3, 2022 Summary: 字体图标、平面转换、空间转换、动画 字体图标 字体图标 字体图标展示的是图标,本质是字体 处理简单的、颜色单一的图片 注:复杂的用CSS精灵,简单的用字体图标 字体图标的优点&…

Verilog语法笔记(夏宇闻第三版)-条件语句

目录 if_else语句: 五点说明: case语句: 真值表: ​例: ​由于使用条件语句不当在设计中生成了原本没想到有的锁存器: if_else语句: if语句是用来判定所给定的条件是否满足,…

(十四)面向对象的三大特征

目录 前言: 一、面向对象三大特征之一:封装 二、面向对象三大特征之二:继承 三、面向对象三大特征之三:多态 前言: 面向对象的三大特征:封装、继承、多态。 一、面向对象三大特征之一:封装 1.概述: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口…

使用Idea编码常用的28种技巧方式

一丶列表: 1丶查看代码历史版本 2丶调整idea的虚拟内存: 3丶idea设置成eclipse的快捷键 4丶设置提示词忽略大小写 5丶关闭代码检查 6丶设置文档注释模板 7丶显示方法分隔符 8丶设置多行tab 9丶快速匹配方法的大括号位置 10丶代码结尾补全 11丶模糊搜索方法 12丶预览…

用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

用 Python selenium爬取实时股票新闻并存入mysql数据库中1.分析需求2.创建表3.分析需要爬取的网页内容4.python里面selenium进行爬虫操作1.添加包2.连接数据库3.selenium爬虫前配置4.对股票新闻内容爬取并存入mysql中5.翻页功能6.运行程序首先我们先明确我们的主要目标就是要爬…

5、SySeVR复现——Data preprocess(上)

目录 1、环境 2、生成切片对应的hash 3、获取要删除的切片位置信息 4、对切片进行token化 1、环境 从数据预处理开始,操作系统:windows 10 ,软件:pycharm 注:对官方提供的文件,做了一些改动&#xff0c…

插槽 slot

文章目录一、什么是插槽二、插槽内容三、渲染作用域四、默认内容五、具名插槽六、作用域插槽一、什么是插槽 我们使用 <slot> 作为一个占位符&#xff0c;父组件就可以把要传递的内容显示到占位符所在位置上&#xff0c;提高组件使用的灵活性。 二、插槽内容 父组件向…