天天看點

ZYNQ學習之旅--PS_SDCARD(PS讀寫SD卡)簡介BD設計軟體設計

目錄标題

  • 簡介
    • 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 卡。

ZYNQ學習之旅--PS_SDCARD(PS讀寫SD卡)簡介BD設計軟體設計

上圖中右側圖檔的 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 卡采用的協定規範、容量等級及支援的檔案系統。

ZYNQ學習之旅--PS_SDCARD(PS讀寫SD卡)簡介BD設計軟體設計

不同協定規範的 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 子產品的層次結構如

圖 所示:

ZYNQ學習之旅--PS_SDCARD(PS讀寫SD卡)簡介BD設計軟體設計

最頂層是應用層,使用者無需理會 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學習之旅--PS_SDCARD(PS讀寫SD卡)簡介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;
}