日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

發(fā)布時間:2024/1/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1)實驗平臺:正點原子MPSoC開發(fā)板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/thread-340252-1-1.html

第十四章SD卡讀寫TXT文本實驗

SD存儲卡是一種基于半導(dǎo)體快閃記憶器的記憶設(shè)備。它具有體積小、傳輸速度快、支持熱插拔等優(yōu)點,在便攜式裝置領(lǐng)域得到了廣泛的應(yīng)用,如手機、多媒體播放器等。本章我們將使用MPSOC開發(fā)板學(xué)習(xí)如何對SD卡(這里特指Micro SD卡,即TF卡)進行TXT文本的讀寫操作。
本章包括以下幾個部分:
1414.1簡介
14.2實驗任務(wù)
14.3硬件設(shè)計
14.4軟件設(shè)計
14.5下載驗證
14.1簡介
我們開發(fā)板上的SD卡接口為小卡的設(shè)計,可以連接Micro SD卡(也叫TF卡),在介紹TF卡之前,我們先來介紹一下較大的一種存儲卡,即SD卡。
SD卡介紹
SD卡的英文全稱是Secure Digital Card,即安全數(shù)字卡(又叫安全數(shù)碼卡),是在MMC卡(Multimedia Card,多媒體卡)的基礎(chǔ)上發(fā)展而來,主要增加了兩個特色:更高的安全性和更快的讀寫速度。SD卡和MMC卡的長度和寬度都是32mm x 24mm,不同的是,SD卡的厚度為2.1mm,而MMC卡的厚度為1.4mm,SD卡比MMC卡略厚,以容納更大容量的存貯單元,同時SD卡比MMC卡觸點引腳要多,且在側(cè)面多了一個寫保護開關(guān)。SD卡與MMC卡保持著向上兼容,也就是說,MMC卡可以被新的SD設(shè)備存取,兼容性則取決于應(yīng)用軟件,但SD卡卻不可以被MMC設(shè)備存取。SD卡和MMC卡可通過卡片上面的標注進行區(qū)分,如下圖左側(cè)圖片上面標注為“MultiMediaCard”字母樣式的為MMC卡,右側(cè)圖片上面標注為“SD”字母樣式的為SD卡。

圖 14.1.1 MMC外觀圖(左)和SD卡外觀圖(右)
上圖中右側(cè)圖片的SD卡實際上為SDHC卡,SD卡從存儲容量上分為3個級別,分別為:SD卡、SDHC卡(Secure Digital High Capacity,高容量安全數(shù)字卡)和SDXC卡(SD eXtended Capacity,容量擴大化的安全存儲卡)。SD卡在MMC卡的基礎(chǔ)上發(fā)展而來,使用FAT12/FAT16文件系統(tǒng),SD卡采用SD1.0協(xié)議規(guī)范,該協(xié)議規(guī)定了SD卡的最大存儲容量為2GB;SDHC卡是大容量存儲SD卡,使用FAT32文件系統(tǒng),SDHC卡采用SD2.0協(xié)議規(guī)范,該協(xié)議規(guī)定了SDHC卡的存儲容量范圍為2GB至32GB;SDXC卡是新提出的標準,不同于SD卡和SDHC卡使用的FAT文件系統(tǒng),SDXC卡使用exFAT文件系統(tǒng),即擴展FAT文件系統(tǒng)。SDXC卡采用SD3.0協(xié)議規(guī)范,該協(xié)議規(guī)定了SDXC卡的存儲容量范圍為32GB至2TB(2048GB),一般用于中高端單反相機和高清攝像機。
下表為不同類型的SD卡采用的協(xié)議規(guī)范、容量等級及支持的文件系統(tǒng)。
表 14.1.1 SD卡的類型、協(xié)議規(guī)范、容量等級及支持的文件系統(tǒng)

不同協(xié)議規(guī)范的SD卡有著不同速度等級的表示方法。在SD1.0協(xié)議規(guī)范中(現(xiàn)在用的較少),使用“X”表示不同的速度等級;在SD2.0協(xié)議規(guī)范中,使用SpeedClass表示不同的速度等級;SD3.0協(xié)議規(guī)范使用UHS(Ultra High Speed)表示不同的速度等級。SD2.0規(guī)范中對SD卡的速度等級劃分為普通卡(Class2、Class4、Class6)和高速卡(Class10);SD3.0規(guī)范對SD卡的速度等級劃分為UHS速度等級1和3。不同等級的讀寫速度和應(yīng)用如下圖所示。

圖 14.1.2 SD卡不同速度等級表示法
SD卡共有9個引腳線,可工作在SDIO模式或者SPI模式。在SDIO模式下,共用到CLK、CMD、DAT[3:0]六根信號線;在SPI模式下,共用到CS(SDIO_DAT[3])、CLK(SDIO_CLK)、MISO(SDIO_DAT[0])、MOSI(SDIO_CMD)四根信號線。SD卡接口定義以及各引腳功能說明如圖 14.1.3所示。

圖 14.1.3 SD卡接口定義以及各引腳功能說明
市面上除標準SD卡外,還有Micro SD卡(原名TF卡),是一種極細小的快閃存儲器卡,是由SanDisk(閃迪)公司發(fā)明,主要用于移動手機。MicroSD卡插入適配器(Adapter)可以轉(zhuǎn)換成SD卡,其操作時序和SD卡是一樣的。MicroSD卡接口定義以及各引腳功能說明如圖 14.1.4所示。

圖 14.1.4 MicroSD卡接口定義以及各引腳功能說明
標準SD卡2.0版本中,工作時鐘頻率可以達到50Mhz,在SDIO模式下采用4位數(shù)據(jù)位寬,理論上可以達到200Mbps(50Mx4bit)的傳輸速率;在SPI模式下采用1位數(shù)據(jù)位寬,理論上可以達到50Mbps的傳輸速率。因此SD卡在SDIO模式下的傳輸速率更快,同時其操作時序也更復(fù)雜。值得一提的是,MPSOC內(nèi)部集成了兩個SD卡控制器,并且Xilinx Vitis的standalone已經(jīng)移植好了FATFS(Vitis軟件中叫做xilffs)文件系統(tǒng),因此在Vitis中添加xilffs庫后,就可以在程序中使用FATFS中的API函數(shù)來操作SD卡。
SD控制器(SD/SDIO/eMMC Controller)
MPSOC中的SD控制器符合SD3.0協(xié)議規(guī)范,接口兼容eMMC4.51、MMC4.51、SDIO3.0、SD3.01。SD控制器通過AXI主端口和AXI從端口連接至系統(tǒng)總線上,其系統(tǒng)框圖如下圖所示:

圖 14.1.5 SD卡控制器內(nèi)部框圖
AXI從接口用于訪問SD控制器內(nèi)部的寄存器,除此之外,在PIO(Programmed I/O)模式下運行時,驅(qū)動程序可以通過該接口訪問SD數(shù)據(jù)端口寄存器。
AXI主接口用于訪問DMA控制器(當使用DMA模式或者ADMA2模式)。DMA控制器使用DMA主接口在內(nèi)部緩存和系統(tǒng)內(nèi)存之間傳輸數(shù)據(jù)。
SD控制器連接SD卡時,支持幾種不同的速度模式如下圖所示:

圖 14.1.6 SD卡速度模式
由上圖可知,在不同的速度模式下,SD_CLK能夠運行的最大時鐘頻率不一樣,且對SD卡IO電平也有要求。由于我們的MPSOC開發(fā)板,將TF卡連接至MPSOC芯片的BANK501,電平固定為3.3V,所以只支持默認模式和高速模式,在高速模式下,帶寬最大為25MB/s。
FATFS文件系統(tǒng)
FATFS是一個完全開源免費的FAT文件系統(tǒng)模塊,專門為小型的嵌入式系統(tǒng)而設(shè)計。它完全用標準C語言編寫,所以具有良好的硬件平臺獨立性,可以很方便的移植到各種嵌入式處理器中。Xilinx Vitis的standalone已經(jīng)移植好了FATFS文件系統(tǒng),因此在Vitis中添加xilffs庫后,就可以在程序中使用FATFS中的API函數(shù)來操作SD卡。
FATFS的特點如下:
1、結(jié)構(gòu)清晰,代碼量少,文件系統(tǒng)和IO底層分開,特別適合新手入門學(xué)習(xí);
2、支持最多10個邏輯盤符和兩級文件夾;
3、支持FAT12/FAT16和FAT32文件系統(tǒng);
4、支持長文件名稱。
FATFS的這些特點,加上開源、免費的原則,使得FATFS的應(yīng)用非常廣泛。FATFS模塊的層次結(jié)構(gòu)如圖 14.1.7所示:

圖 14.1.7 FATFS層次結(jié)構(gòu)圖
最頂層是應(yīng)用層,使用者無需理會FATFS的內(nèi)部結(jié)構(gòu)和復(fù)雜的FAT協(xié)議,只需要調(diào)用FATFS 模塊提供給用戶的一系列應(yīng)用接口函數(shù),如f_open,f_read,f_write和f_close等,就可以像在 PC上讀/寫文件那樣簡單。
中間層FATFS模塊,實現(xiàn)了FAT文件讀/寫協(xié)議。FATFS模塊提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用時將頭文件直接包含進去即可。
FATFS模塊提供的底層接口,它包括存儲媒介讀/寫接口(disk I/O)和供給文件創(chuàng)建修改時間的實時時鐘。
關(guān)于FATFS源碼以及API函數(shù)的介紹,大家可以在:http://elm-chan.org/fsw/ff/00index_e.html這個網(wǎng)站上查看。
14.2實驗任務(wù)
本章的實驗任務(wù)是通過Xilinx Vitis自帶的FATFS庫,完成對TF卡中TXT文本讀寫的功能,并將讀寫測試結(jié)果通過串口打印出來。
14.3硬件設(shè)計
我們的MPSOC開發(fā)板上面有一個SD卡接口,可以連接Micor SD卡(TF卡),原理圖如下圖所示:

圖 14.3.1 Micro SD卡原理圖
由上圖可知,SD卡共有四根數(shù)據(jù)線(SD_D0~D3),連接至MPSOC的引腳。值得注意的是,圖中SD_CD信號是TF卡檢測信號,用于標志開發(fā)板是否連接了TF卡。當開發(fā)板沒有連接TF卡時,SD_CD信號為高電平;而當開發(fā)板連接了TF卡之后,SD_CD信號為低電平,表示開發(fā)板已經(jīng)連接了TF卡。
從實驗任務(wù)我們可以畫出如下的系統(tǒng)框圖,DDR4中存放和運行程序、SD卡控制器驅(qū)動TF卡,UART實現(xiàn)串口通信。

圖 14.3.2 系統(tǒng)框圖
由系統(tǒng)框圖可知,本次實驗在MPSOC嵌入式最小系統(tǒng)的基礎(chǔ)上,添加了SD卡控制器,用于驅(qū)動TF卡。需要說明的是,TF卡連接的是PS的MIO端口,因此本次實驗沒有用到PL的資源。
我們直接在“Hello World實驗”的基礎(chǔ)上,將工程另存為“micro_sd_rw”工程。
這里簡單介紹下MPSOC PS的配置界面,配置界面選擇的是SD1 MIO46…MIO51、CD(MIO45),如下圖所示。

圖 14.3.3 外設(shè)IO配置界面
需要注意的是,TF卡的引腳連接到MPSOC的Bank 1端口(BANK501),Bank 1的IO電壓為3.3V,因此在MIO的配置界面將Bank1的電壓改為“LVCMOS 3.3V”。圖 14.3.3中勾選了CD信號,CD信號用于指示當前開發(fā)板有沒有連接TF卡,這里勾選中CD信號,并將引腳分配至MIO45。另外,由于本次實驗連接的是16GB的TF卡,所以Slot Type選擇SD2.0,而Data Transfer Mode選擇4Bit。
UART配置界面選擇UART0 MIO42…MIO43,如下圖所示。

圖 14.3.4 UART配置界面
嵌入式系統(tǒng)最終搭建的框圖如圖 14.3.5所示。

圖 14.3.5 嵌入式系統(tǒng)框圖界面
14.4軟件設(shè)計
在Vitis軟件中新建一個BSP工程和一個空的應(yīng)用工程,應(yīng)用工程名為“micro_sd_rw”。
接下來添加FATFS庫。點擊micro_sd_rw界面下的“Navigate to BSP Setting”,如下圖所示。

圖 14.4.1 關(guān)閉system.mss
如果不小心關(guān)閉該界面的話,可以直接雙擊圖中左側(cè)micro_sd_rw.prj即可。
接下來會彈出Board Support Package的界面,點擊“Modify BSP Settings…”,對應(yīng)用工程的板級支持包進行設(shè)置,如下圖所示:

圖 14.4.2 Board Support Package界面
在彈出的界面中勾選“xilffs”,xilffs即為FATFS庫,如下圖所示:

圖 14.4.3 勾選xilffs
勾選后,會在左側(cè)Overview的standalone一欄出現(xiàn)xilffs,點擊xilffs。可以看到use_lfn的默認設(shè)置為0,即不使能。use_lfn用于設(shè)置是否使能長文件名以及文件名的小寫字母,這里將use_lfn設(shè)置為1,點擊“OK”按鈕完成設(shè)置。如圖 14.4.4所示:

圖 14.4.4 使能use_lfn
設(shè)置完成后,在design_1_wrapper→psu_cortexa53_0→standalone_domain→bsp→psu_cortexa53_0→libsrc一欄下,會多出FATFS的庫函數(shù)。如圖 14.4.5所示:

圖 14.4.5 xilffs_v4_2庫函數(shù)
添加完FATFS庫之后,對TF卡的操作會簡單很多,我們只需要在程序中調(diào)用FATFS的庫函數(shù)即可。
接下來為應(yīng)用工程新建一個源文件“main.c”,我們在新建的main.c文件中輸入本次實驗的代碼。代碼的主體部分如下所示:
1 #include “xparameters.h”
2 #include “xil_printf.h”
3 #include “ff.h”
4 #include “xstatus.h”
5
6 #define FILE_NAME “ZDYZ.txt” //定義文件名
7
8 const char src_str[30] = “www.openedv.com”; //定義文本內(nèi)容
9 static FATFS fatfs; //文件系統(tǒng)
10
11 //初始化文件系統(tǒng)
12 int platform_init_fs()
13 {
14 FRESULT status;
15 TCHAR *Path = “0:/”;
16 BYTE work[FF_MAX_SS];
17
18 //注冊一個工作區(qū)(掛載分區(qū)文件系統(tǒng))
19 //在使用任何其它文件函數(shù)之前,必須使用f_mount函數(shù)為每個使用卷注冊一個工作區(qū)
20 status = f_mount(&fatfs, Path, 1); //掛載SD卡
21 if (status != FR_OK) {
22 xil_printf(“Volume is not FAT formated; formating FAT\r\n”);
23 //格式化SD卡
24 status = f_mkfs(Path, FM_FAT32, 0, work, sizeof work);
25 if (status != FR_OK) {
26 xil_printf(“Unable to format FATfs\r\n”);
27 return -1;
28 }
29 //格式化之后,重新掛載SD卡
30 status = f_mount(&fatfs, Path, 1);
31 if (status != FR_OK) {
32 xil_printf(“Unable to mount FATfs\r\n”);
33 return -1;
34 }
35 }
36 return 0;
37 }
38
39 //掛載SD(TF)卡
40 int sd_mount()
41 {
42 FRESULT status;
43 //初始化文件系統(tǒng)(掛載SD卡,如果掛載不成功,則格式化SD卡)
44 status = platform_init_fs();
45 if(status){
46 xil_printf(“ERROR: f_mount returned %d!\n”,status);
47 return XST_FAILURE;
48 }
49 return XST_SUCCESS;
50 }
51
52 //SD卡寫數(shù)據(jù)
53 int sd_write_data(char file_name,u32 src_addr,u32 byte_len)
54 {
55 FIL fil; //文件對象
56 UINT bw; //f_write函數(shù)返回已寫入的字節(jié)數(shù)
57
58 //打開一個文件,如果不存在,則創(chuàng)建一個文件
59 f_open(&fil,file_name,FA_CREATE_ALWAYS | FA_WRITE);
60 //移動打開的文件對象的文件讀/寫指針 0:指向文件開頭
61 f_lseek(&fil, 0);
62 //向文件中寫入數(shù)據(jù)
63 f_write(&fil,(void) src_addr,byte_len,&bw);
64 //關(guān)閉文件
65 f_close(&fil);
66 return 0;
67 }
68
69 //SD卡讀數(shù)據(jù)
70 int sd_read_data(char file_name,u32 src_addr,u32 byte_len)
71 {
72 FIL fil; //文件對象
73 UINT br; //f_read函數(shù)返回已讀出的字節(jié)數(shù)
74
75 //打開一個只讀的文件
76 f_open(&fil,file_name,FA_READ);
77 //移動打開的文件對象的文件讀/寫指針 0:指向文件開頭
78 f_lseek(&fil,0);
79 //從SD卡中讀出數(shù)據(jù)
80 f_read(&fil,(void)src_addr,byte_len,&br);
81 //關(guān)閉文件
82 f_close(&fil);
83 return 0;
84 }
85
86 //main函數(shù)
87 int main()
88 {
89 int status,len;
90 char dest_str[30] = “”;
91
92 status = sd_mount(); //掛載SD卡
93 if(status != XST_SUCCESS){
94 xil_printf(“Failed to open SD card!\n”);
95 return 0;
96 }
97 else
98 xil_printf(“Success to open SD card!\n”);
99
100 len = strlen(src_str); //計算字符串長度
101 //SD卡寫數(shù)據(jù)
102 sd_write_data(FILE_NAME,(u32)src_str,len);
103 //SD卡讀數(shù)據(jù)
104 sd_read_data(FILE_NAME,(u32)dest_str,len);
105
106 //比較寫入的字符串和讀出的字符串是否相等
107 if (strcmp(src_str, dest_str) == 0)
108 xil_printf(“src_str is equal to dest_str,SD card test success!\n”);
109 else
110 xil_printf(“src_str is not equal to dest_str,SD card test failed!\n”);
111
112 return 0;
113 }
在main函數(shù)中,實現(xiàn)的功能是向TF卡中讀寫TXT文本,并比較寫入的數(shù)據(jù)和讀出的數(shù)據(jù)是否一致。程序首先調(diào)用sd_mount()函數(shù)掛載TF卡,接下來根據(jù)待寫入字符串的長度,通過sd_write_data()函數(shù)和sd_read_data()函數(shù)對TF卡中的TXT文本進行寫入和讀出,然后比較寫入和讀出的值,并打印比較的結(jié)果值,如代碼中第86行至第113行所示。
sd_mount()函數(shù)實現(xiàn)的功能是掛載TF卡,并返回掛載的結(jié)果。sd_mount()函數(shù)里通過調(diào)用platform_init_fs()函數(shù)實現(xiàn)對TF卡的掛載,如果掛載不成功,則格式化TF卡,并重新掛載TF卡。在使用任何其它文件系統(tǒng)函數(shù)之前,必須先對TF卡進行掛載,sd_mount()函數(shù)如代碼中第39至第50行所示,platform_init_fs()函數(shù)如代碼中第12至第37行所示。需要注意的是,掛載函數(shù)同樣會對硬件進行檢查,如果未插入TF卡,會導(dǎo)致SD卡掛載失敗。
sd_write_data()函數(shù)在TF卡中打開一個文本,并寫入程序開頭定義的字符數(shù)組“www.openedv.com”。寫入之前,先通過f_open函數(shù)打開一個文件名為“ZDYZ.txt”的文件,如果不存在,則在TF卡中創(chuàng)建該文件。隨后通過f_lseek函數(shù)移動已打開文件對象的讀寫指針,為0則代表移動到文件的開頭位置。接下來通過f_write函數(shù)向打開的文件中寫入數(shù)據(jù),寫完之后則通過f_close函數(shù)關(guān)閉該文件。如代碼的第52行至67行代碼所示。
sd_read_data()函數(shù)從TF卡的TXT文本中讀出數(shù)據(jù)。TF卡的讀操作和寫操作類似,讀數(shù)據(jù)的函數(shù)為f_read函數(shù),如代碼中第69行至第84行代碼所示。
14.5下載驗證
首先我們將下載器與開發(fā)板的JTAG接口連接,下載器另外一端與電腦連接。然后使用USB連接線將開發(fā)板的PS_PORT(PS_UART)接口與電腦連接,用于串口通信。接下來插入TF卡(TF卡插槽位于開發(fā)板背面)。最后連接開發(fā)板的電源。開發(fā)板背面TF卡卡座如圖 14.5.1所示:

圖 14.5.1 開發(fā)板背面TF卡卡座
打開Vitis Terminal終端,設(shè)置并連接串口。然后下載本次實驗的程序,下載完成后,在下方的Terminal中可以看到應(yīng)用程序打印的信息,如下圖所示:

圖 14.5.2 打印SD卡讀寫測試結(jié)果
由上圖可知,顯示寫入的字符和讀出的字符一致,說明TF卡讀寫測試成功。
接下來從開發(fā)板的卡槽中取出TF卡,通過連接讀卡器來插入電腦的USB接口,此時可以看到TF中的文件內(nèi)容如所示。

圖 14.5.3 創(chuàng)建的TXT文本
打開“ZDYZ.txt”文本,可以看到文本的內(nèi)容,如下圖所示:

圖 14.5.4 TXT文本內(nèi)容
TXT文本的內(nèi)容為“www.openedv.com”字符串,和串口中打印的字符串一致,說明本次實驗在MPSOC開發(fā)板上面下載驗證成功。

總結(jié)

以上是生活随笔為你收集整理的【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。