《ESP32-S3使用指南—IDF版 V1.6》第四十五章 Flash模擬U盤實驗
第四十五章 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盤模擬。

浙公網安備 33010602011771號