马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
第四十五章 Flash模仿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
本章我们先容ESP32S3的USB HOST应用,即通过USB HOST功能,将某个分区表实现模仿U盘/读卡器等大容量USB存储装备。
本章分为如下几个末节:
45.1 Flash模仿U盘简介
45.2 硬件操持
45.3 步调操持
45.4 下载验证
45.1 Flash模仿U盘简介
所谓Flash模仿U盘,就雷同于我们寻常使用的U盘,我们只不外是将单片机与电脑通过USB数据线举行毗连,从而举行数据传输。电脑可以大概辨认出单片机通过外部Flash模仿出的U盘,在电脑上可以大概对该U盘举行文件的相互拷贝,而且重新上电后数据不丢失。通过对USB的相识,USB分装备(Device)模式和主机(Host)模式,使用单片机模仿U盘是让USB工作在装备(Device)模式下。
我们可以使用ESP32自带的USB功能,来实现一个Flash模仿U盘,从而通过USB,实现电脑与ESP32的数据互传。上位机无需编写专门的USB步调,只须要一个串口调试助手即可调试,非常实用。
45.2 硬件操持
45.2.1例程功能
本实利用用ESP32自带的USB功能,通过USB毗连电脑后,子分区会在电脑上举行加载,并表现该子分区的容量,我们可测试子分区数据的读写了。
LED闪灼,提示步调运行,USB和电脑毗连乐成。
45.2.2硬件资源
1.LED灯
LED -IO0
2.独立按键
KEY0(XL9555) - IO1_7
KEY1(XL9555) - IO1_6
KEY2(XL9555) - IO1_5
KEY3(XL9555) - IO1_4
3.XL9555
IIC_SDA-IO41
IIC_SCL-IO42
4.SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
5.UART_NUM_0(U0TX、U0RX毗连至板载USB转串口芯片上)
U0TXD-IO43
U0RXD-IO45
6.USB
45.2.3原理图
本章实利用用USB接口与PC举行毗连,开辟板板载了一个USB接口,用于毗连其他USB装备,USB接口与MCU的毗连原理图,如下图所示:
图45.2.3.1 USB接口与MCU的毗连原理图
45.3 步调操持
45.3.1 步调流程图
步调流程图能资助我们更好的明确一个工程的功能和实现的过程,对学习和操持工程有很好的主导作用。下面看看本实行的步调流程图:
图45.3.1.1Flash模仿U盘实行步调流程图
45.3.2 Flash模仿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_tesp_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);
复制代码 该函数的形参形貌如下表所示:
表45.3.2.1esp_vfs_fat_spiflash_mount_rw_wl ()函数形参形貌
该函数的返回值形貌,如下表所示:
表45.3.2.2函数esp_vfs_fat_spiflash_mount_rw_wl()返回值形貌
该函数使用esp_vfs_fat_mount_config_t范例的结构体变量传入,该结构体的界说如下所示:
表45.3.2.3esp_vfs_fat_mount_config_t结构体参数值形貌
完成上述结构体参数设置之后,可以将结构通报给 esp_vfs_fat_spiflash_mount_rw_wl () 函数,用以挂载分区。
更多有关USB函数的先容,请读者们回首上一章节的内容。
45.3.3 Flash模仿U盘驱动分析
在IDF版的34_usb_flash_u例程中,作者在34_usb_flash_u\components路径下新增了Flash驱动文件。
这里我们只教学核心代码,详细的源码请各人参考光盘本实行对应源码。
本实行,我们将相TinyUSB库文件拷贝到components文件夹下,在APP文件夹下的文件则是我们基于TinyUSB自行编写的代码。终极得到如图45.3.3.1所示的工程:
图45.3.3.1 Flash模仿U盘工程分组
上图中位于components文件夹下的是我们自己编写的一些外设驱动,main文件夹下包罗了一个APP文件与一个后缀为.yml的文件。APP文件夹下包罗的是FLASH模仿U盘(USB)代码,而后缀为.yml的文件其紧张作用是将项目中各组件的依赖项界说在单独的清单文件中,并以上图所示的方式举行定名。在我们的例程中提现出的作用就是简化了整个工程结构。我们在编译的过程中,体系便会帮我们自动天生USB外设所须要的依赖库:espressif_esp_tinyusb以及espressif_tinyusb。做到了即能简化项目工程,又能有用规避了在编译中遇到的错误,但条件是运行时得确保个人的电脑处于联网状态。
45.3.4 CMakeLists.txt文件
打开本实行BSP下的CMakeLists.txt文件,其内容如下所示:- set(src_dirs
- IIC
- LCD
- LED
- SPI
- XL9555)
- set(include_dirs
- IIC
- LCD
- LED
- SPI
- XL9555)
- set(requires
- driver)
- 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驱动的正确性和可用性,为后续的开辟工作提供了坚固的根本。
45.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, "USBFLASH TEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
- lcd_show_string(30, 110, 200, 16, 16, "status:", RED);
- tud_usb_flash(); /* 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_flash()等函数初始化USB。由于该实行例程须要体系将storage分区模仿成U盘,以是在该函数中须要初始化SPIFFS分区,其次是用USB装备安装函数,用以USB装备登记。同时,LCD表现实行信息,LED闪灼以示步调正在运行。
45.4下载验证
将步调下载到开辟板后(注意:USB数据线,要插在USB端口!而不是UART端口!),我们打开装备管理器(我用的是WIN10),在端口(COM和LPT)内里可以发现多出了一个COM25的装备,这就是USB假造的串口装备端口,如下图所示:
图45.4.1 通过装备管理器查察USB假造的串口装备端口
如图45.4.1,ESP32通过Flash模仿U盘,被电脑辨认了,通用串行总线控制器表现的是:USB大容量存储装备(着实也不算大,也就差不多4MB...)。此时,开辟板的LED在闪灼,提示步调运行。开辟板的LCD表现“connect success.....”,如下图所示:
图45.4.2 USB假造串口毗连乐成
然后我们打开“我的电脑”,可以望见界面表现了通过Flash模仿U盘后的容量巨细,如下图所示:
图45.4.3 ESP32 Flash模仿U盘测试
至此,Flash模仿U盘实行就完成了,通过本实行,我们就可以使用ESP32的Flash举行U盘模仿。
|