目錄标題
- 簡介
-
- FAT檔案系統
- BD設計
- 軟體設計
簡介
SD 卡的英文全稱是 Secure Digital Card,即安全數字卡(又叫安全數位卡),是在 MMC (MultimediaCard,多媒體卡)的基礎上發展而來,主要增加了兩個特色:更高的安全性和更快的讀寫速度。SD 卡和 MMC卡的長度和寬度都是 32mm x 24mm,不同的是,SD 卡的厚度為 2.1mm,而 MMC 卡的厚度為 1.4mm,SD卡比 MMC 卡略厚,以容納更大容量的存貯單元,同時 SD 卡比 MMC 卡觸點引腳要多,且在側面多了一個寫保護開關。SD 卡與 MMC 卡保持着向上相容,也就是說,MMC 卡可以被新的 SD 裝置存取,相容性則取決于應用軟體,但 SD 卡卻不可以被 MMC 裝置存取。SD 卡和 MMC 卡可通過卡片上面的标注進行區分,如下圖左側圖檔上面标注為“MultiMediaCard”字母樣式的為 MMC 卡,右側圖檔上面标注為“SD”字母樣式的為 SD 卡。
上圖中右側圖檔的 SD 卡實際上為 SDHC 卡,SD 卡從存儲容量上分為 3 個級别,分别為:SD 卡、SDHC卡(Secure Digital High Capacity,高容量安全數字卡)和 SDXC 卡(SD eXtended Capacity,容量擴大化的安全存儲卡)。SD 卡在 MMC 卡的基礎上發展而來,使用 FAT12/FAT16 檔案系統,SD 卡采用 SD1.0 協定規範,該協定規定了 SD 卡的最大存儲容量為 2GB;SDHC 卡是大容量存儲 SD 卡,使用 FAT32 檔案系統,SDHC 卡采用 SD2.0 協定規範,該協定規定了 SDHC 卡的存儲容量範圍為 2GB 至 32GB;SDXC 卡是新提出的标準,不同于 SD 卡和 SDHC 卡使用的 FAT 檔案系統,SDXC 卡使用 exFAT 檔案系統,即擴充 FAT 檔案系統。SDXC 卡采用 SD3.0 協定規範,該協定規定了 SDXC 卡的存儲容量範圍為 32GB 至 2TB(2048GB),一般用于中高端單反相機和高清錄影機。
下表為不同類型的 SD 卡采用的協定規範、容量等級及支援的檔案系統。
不同協定規範的 SD 卡有着不同速度等級的表示方法。在 SD1.0 協定規範中(現在用的較少),使用
“X”表示不同的速度等級;在 SD2.0 協定規範中,使用 SpeedClass 表示不同的速度等級;SD3.0 協定規範使用 UHS (Ultra High Speed)表示不同的速度等級。SD2.0 規範中對 SD 卡的速度等級劃分為普通卡(Class2、Class4、Class6)和高速卡(Class10);SD3.0 規範對 SD 卡的速度等級劃分為 UHS 速度等級 1 和 3。
FAT檔案系統
FATFS 是一個完全開源免費的 FAT 檔案系統子產品,專門為小型的嵌入式系統而設計。它完全用标準 C
語言編寫,是以具有良好的硬體平台獨立性,可以很友善的移植到各種嵌入式處理器中。Xilinx SDK 的
standalone 已經移植好了 FATFS 檔案系統,是以在 SDK 中添加 xilffs 庫後,就可以在程式中使用 FATFS 中
的 API 函數來操作 SD 卡。
FATFS 的特點如下:
1、 結構清晰,代碼量少,檔案系統和 IO 底層分開,特别适合新手入門學習;
2、 支援最多 10 個邏輯盤符和兩級檔案夾;
3、 支援 FAT12/FAT16 和 FAT32 檔案系統;
4、 支援長檔案名稱。
FATFS 的這些特點,加上開源、免費的原則,使得 FATFS 的應用非常廣泛。FATFS 子產品的層次結構如
圖 所示:
最頂層是應用層,使用者無需理會 FATFS 的内部結構和複雜的 FAT 協定,隻需要調用 FATFS 子產品提
供給使用者的一系列應用接口函數,如 f_open,f_read,f_write 和 f_close 等,就可以像在 PC 上讀/寫檔案那樣簡單。
中間層 FATFS 子產品,實作了 FAT 檔案讀/寫協定。FATFS 子產品提供的是 ff.c 和 ff.h。除非有必要,使
用者一般不用修改,使用時将頭檔案直接包含進去即可。
FATFS 子產品提供的底層接口,它包括存儲媒介讀/寫接口(disk I/O)和供給檔案建立修改時間的實時
時鐘。關于 FATFS 源碼以及 API 函數的介紹,大家可以在:http://elm-chan.org/fsw/ff/00index_e.html
BD設計
把zynq核裡面的sd卡配置好就可以了。
軟體設計
#include <stdio.h>
#include "xparameters.h"
#include "xsdps.h"
#include "xil_printf.h"
#include "ff.h"
static FATFS SD_Dev; // File System instance
char *SD_Path = "0:/"; // string pointer to the logical drive number
static char FileName[32] = "vest.txt"; // name of the log
u8 WR_Buf[16*1024*1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)
u8 RD_Buf[16*1024*1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)
char s[] = "hello world!";
int SD_init()
{
FRESULT result;
//-----------------------mount dev-----------------------------------------------
result =f_mount(&SD_Dev,SD_Path, 0);
if (result != 0) {
return XST_FAILURE;
}
return XST_SUCCESS;
}
int SD_read(char *FileName,u8 *DestinationAddress,u32 ByteLength)
{
FIL file;
FRESULT result;
UINT BytesRd;
result = f_open(&file,FileName,FA_READ);
if(result)
{
return XST_FAILURE;
}
result = f_lseek(&file, 0);
if(result)
{
return XST_FAILURE;
}
result = f_read(&file, (void*)DestinationAddress,ByteLength,&BytesRd);
if(result)
{
return XST_FAILURE;
}
result = f_close(&file);
if(result)
{
return XST_FAILURE;
}
return XST_SUCCESS;
}
int SD_write(char *FileName,u8 *SourceAddress,u32 ByteLength)
{
FIL file;
FRESULT result;
UINT BytesWr;
result = f_open(&file,FileName,FA_CREATE_ALWAYS | FA_WRITE);
if(result)
{
return XST_FAILURE;
}
result = f_lseek(&file, 0);
if(result)
{
return XST_FAILURE;
}
result = f_write(&file,(void*) s,strlen(s),&BytesWr);
if(result)
{
return XST_FAILURE;
}
result = f_close(&file);
if(result){
return XST_FAILURE;
}
return XST_SUCCESS;
}
int main()
{
int i;
FRESULT result;
u8 SD_ERROR=0;
u32 Buffer_size=1024*1024;
SD_init();
for(i=0;i<Buffer_size;i++)
{
WR_Buf[i]=i;
}
//-----------------------write test data to file-----------------------------------
result=SD_write(FileName, WR_Buf, strlen(s));
if (result!=0)
{
return XST_FAILURE;
}
xil_printf("SD CARD written Successfully\r\n");
//-----------------------read test data ------------------------------------------
result=SD_read(FileName, RD_Buf, strlen(s));
if (result!=0)
{
return XST_FAILURE;
}
xil_printf("SD CARD Data read Successfully\r\n");
//-----------------------check data-----------------------------------------------
for(i=0; i<strlen(s);i++)
{
xil_printf("%c\n",RD_Buf[i]);
// if(WR_Buf[i]!=RD_Buf[i])
// {
// SD_ERROR=1;
// break;
// }
}
if(SD_ERROR)
xil_printf("SD CARD Data checked Error\r\n");
else
xil_printf("SD CARD Data checked Successfully\r\n");
return 0;
}