尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

《ESP32-S3使用指南—IDF版 V1.6》第四十六章 SD卡模拟U盘实验

《ESP32-S3使用指南—IDF版 V1.6》第四十六章 SD卡模拟U盘实验
📅 发布时间:2026/6/20 19:45:44

第四十六章 SD卡模拟U盘实验

1)实验平台:正点原子DNESP32S3开发板

2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6

3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子DNESP32S3开发板技术交流群:132780729

155537c2odj87vz1z9vj6l

155537nfqovl2gg9faaol9

本章我们介绍ESP32S3的USB HOST应用,即通过USB HOST功能,将某个分区表实现模拟U盘/读卡器等大容量USB存储设备。
本章分为如下几个小节:
46.1 SD卡模拟U盘简介
46.2 硬件设计
46.3 程序设计
46.4 下载验证

46.1 SD卡模拟U盘简介
当USB数据线插入ESP32-S3开发板的USB端口后,系统会将SD卡模拟成U盘。本实验利用ESP32自带的USB功能,通过USB连接电脑后,SD卡会在电脑上进行加载,并显示该SD卡的容量,我们可测试SD卡数据的读写了。
LED闪烁,提示程序运行。USB和电脑连接成功后。

46.2 硬件设计
46.2.1例程功能
本实验利用ESP32自带的USB功能,通过USB连接电脑后,子分区会在电脑上进行加载,并显示该子分区的容量,我们可测试子分区数据的读写了。
LED闪烁,提示程序运行,USB和电脑连接成功。

46.2.2硬件资源

  1. LED灯
    LED -IO0
    2.独立按键
    KEY0(XL9555) - IO1_7
    KEY1(XL9555) - IO1_6
    KEY2(XL9555) - IO1_5
    KEY3(XL9555) - IO1_4
  2. XL9555
    IIC_SDA-IO41
    IIC_SCL-IO42
  3. SPILCD
    CS-IO21
    SCK-IO12
    SDA-IO11
    DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
    PWR- IO1_3(XL9555)
    RST- IO1_2(XL9555)
  4. SD
    CS-IO2
    SCK-IO12
    MOSI-IO11
    MISO-IO13
  5. UART_NUM_0(U0TX、U0RX连接至板载USB转串口芯片上)
    U0TXD-IO43
    U0RXD-IO44
  6. USB

46.2.3原理图
本章实验使用USB接口与PC进行连接,开发板板载了一个USB接口,用于连接其他USB设备,USB接口与MCU的连接原理图,如下图所示:

image001

图46.2.3.1USB接口与MCU的连接原理图

46.3 程序设计
46.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

image004

图46.3.1.1SD卡模拟U盘实验程序流程图

46.3.2 SD卡模拟U盘函数解析
ESP-IDF提供了一套API来配置Flash。要使用此功能,需要导入必要的头文件:

#include"ff.h"
#include"diskio.h"
#include"esp_vfs_fat.h"
#include"tinyusb.h"

接下来,作者将介绍一些常用的ESP32-S3中的Flash函数,这些函数的描述及其作用如下:
1,挂载分区函数
该函数用给定的配置,来挂载分区,该函数原型如下所示:

esp_err_t esp_vfs_fat_spiflash_mount_rw_wl(const char*base_path,const char*partition_label,constesp_vfs_fat_mount_config_t* mount_config,wl_handle_t* wl_handle);

该函数的形参描述如下表所示:

QQ截图20251103112858

表46.3.2.1esp_vfs_fat_spiflash_mount_rw_wl ()函数形参描述
该函数的返回值描述,如下表所示:

QQ截图20251103112911

表46.3.2.2函数esp_vfs_fat_spiflash_mount_rw_wl()返回值描述
该函数使用esp_vfs_fat_mount_config_t类型的结构体变量传入,该结构体的定义如下所示:

QQ截图20251103112922

表46.3.2.3esp_vfs_fat_mount_config_t结构体参数值描述
完成上述结构体参数配置之后,可以将结构传递给 esp_vfs_fat_spiflash_mount_rw_wl () 函数,用以挂载分区。
更多有关USB函数的介绍,请读者们回顾上一章节的内容。

46.3.3 SD卡模拟U盘驱动解析
在IDF版的35_usb_sd_u例程中,作者在35_usb_sd_u\components路径下新增了Flash驱动文件。
这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。
本实验,我们将相TinyUSB库文件拷贝到components文件夹下,在APP文件夹下的文件则是我们基于TinyUSB自行编写的代码。最终得到如图46.3.3.1所示的工程:

image005

图46.3.3.1 SD卡模拟U盘工程分组
上图中位于components文件夹下的是我们自己编写的一些外设驱动,main文件夹下包含了一个APP文件与一个后缀为.yml的文件。APP文件夹下包含的是SD卡模拟U盘(USB)代码,而后缀为.yml的文件其主要作用是将项目中各组件的依赖项定义在单独的清单文件中,并以上图所示的方式进行命名。在我们的例程中提现出的作用就是简化了整个工程结构。我们在编译的过程中,系统便会帮我们自动生成USB外设所需要的依赖库:espressif_esp_tinyusb以及espressif_tinyusb。做到了即能简化项目工程,又能有效规避了在编译中遇到的错误,但前提是运行时得确保个人的电脑处于联网状态。
46.3.4 CMakeLists.txt文件
打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:

set(src_dirsIICLCDLEDSPIXL9555)set(include_dirsIICLCDLEDSPIXL9555)set(requiresdriver)idf_component_register(SRC_DIRS${src_dirs}
INCLUDE_DIRS ${include_dirs}REQUIRES ${requires})component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)

该路径下的CmakeList文件并没有新增内容,主要变化在于main文件。
打开本实验main文件下的CMakeLists.txt文件,其内容如下所示:

idf_component_register(SRC_DIRS".""app"INCLUDE_DIRS".""app")

上述的红色app驱动需要由开发者自行添加,以确保USB驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了USB驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。

46.3.5 实验应用代码
打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。

i2c_obj_ti2c0_master;/**
* @brief      程序入口
* @param      无
* @retval     无
*/
voidapp_main(void)
{esp_err_t ret;ret =nvs_flash_init();                             /* 初始化NVS */if (ret ==ESP_ERR_NVS_NO_FREE_PAGES ||ret ==ESP_ERR_NVS_NEW_VERSION_FOUND){ESP_ERROR_CHECK(nvs_flash_erase());ret =nvs_flash_init();}ESP_ERROR_CHECK(ret);led_init();                                           /* 初始化LED */i2c0_master =iic_init(I2C_NUM_0);                    /* 初始化IIC0 */spi2_init();                                          /* 初始化SPI */xl9555_init(i2c0_master);                               /* 初始化IO扩展芯片 */  lcd_init();                                           /* 初始化LCD *//* 显示实验信息 */lcd_show_string(30, 50, 200, 16, 16, "ESP32-S3", RED);lcd_show_string(30, 70, 200, 16, 16, "USBSD TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "status:", RED);while (sd_spi_init())                                /* 检测不到SD卡 */{lcd_show_string(30, 110, 200, 16, 16, "SDCard Error!", RED);vTaskDelay(500);lcd_show_string(30, 130, 200, 16, 16, "PleaseCheck! ", RED);vTaskDelay(500);}tud_usb_sd();                                         /* USB初始化 */while(1){if ((g_usbdev.status& 0x0f) == 0x01){lcd_show_string(110,110,lcd_self.width,16,16,"connectsuccess.....",BLUE);}else if ((g_usbdev.status& 0x0f) == 0x00){lcd_show_string(110,110,lcd_self.width,16,16,"connectfail........",BLUE);}LED_TOGGLE();vTaskDelay(500);}
}

此部分代码比较简单,通过tud_usb_sd()等函数初始化USB。由于该实验例程需要系统将storage分区模拟成U盘,所以在该函数中需要初始化SPIFFS分区,其次是用USB设备安装函数,用以USB设备登记。同时,LCD显示实验信息,LED闪烁以示程序正在运行。

46.4下载验证
将程序下载到开发板后(注意:USB数据线,要插在USB端口!而不是UART端口!),我们打开设备管理器(我用的是WIN10),在端口(COM和LPT)里面可以发现多出了一个COM25的设备,这就是USB虚拟的串口设备端口,如下图所示:

image007

图46.4.1 通过设备管理器查看USB虚拟的串口设备端口
如图46.4.1,ESP32通过SD卡模拟U盘,被电脑识别了,通用串行总线控制器显示的是:USB大容量存储设备(其实也不算大,也就差不多4MB...)。此时,开发板的LED在闪烁,提示程序运行。开发板的LCD显示“connect success.....”,如下图所示:

image009

图46.4.2 USB虚拟串口连接成功
至此,SD卡模拟U盘实验就完成了,通过本实验,我们就可以利用ESP32的USB,直接和电脑进行数据互传了,具有广泛的应用前景。

相关新闻

  • 2025年打包箱房制造企业权威推荐榜单:隔离房/创意集装箱/彩钢房源头厂家精选
  • 2025年知名的冷拉型钢杭州老房装修
  • 2025年管母线厂家综合实力排行榜:全绝缘铜管母线/管型母线/全屏蔽绝缘铜管母线领先厂家精选

最新新闻

  • 论文AI写作网址有哪些?精选6款正规平台推荐 - 掌桥科研-AI论文写作
  • 2026武汉三新高级技工学校招生简章,23个热门专业覆盖理工、艺术、医学、教育等六个学科方向 - 资讯速览
  • 2026升级耐用的顶管千斤顶 - 资讯速览
  • 2026年6月最新爱彼中国官方售后服务电话网点及客服中心地址 - 亨得利官方服务中心
  • Scout企业级AI合规部署:私有化、可审计、零外联实践指南
  • 印刷经营许可证丢了登报怎么线上办理?正规登报步骤大全 - 资讯速览

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号