1. 程式人生 > >LPC1768 SPI模式下SD卡FatFs檔案系統移植

LPC1768 SPI模式下SD卡FatFs檔案系統移植

最近在LPC1768 SPI模式下移植SD卡FatFs(版本R0.09a)檔案系統成功,總結一下移植過程。

一、      底層驅動

使用的SSP0的SPI模式驅動,SSP時鐘開始使用的25M。SD卡驅動測試完成,可讀寫擦除測試沒有問題之後開始檔案系統移植。

要用到的底層驅動函式有:

MMCSD_TYPE MMCSD_Init(void)

BOOL MMCSD_EraseBlocks(uint32_tblkStart,uint32_t blkEnd)

BOOL MMCSD_ReadSingleBlock(uint32_tblkIndex,uint8_t *pBytes)

uint32_t MMCSD_ReadMultipleBlocks(uint32_tblkIndex,uint32_t blkCnt,uint8_t *pBytes)

BOOL MMCSD_WriteSingleBlock(uint32_tblkIndex,uint8_t *pBytes)

uint32_tMMCSD_WriteMultipleBlocks(uint32_t blkIndex,uint32_t blkCnt,uint8_t *pBytes)

除此之外需要讀取卡的基本資訊,存在CSD暫存器中的,根據讀取到的CSD暫存器來得到卡扇區大小,扇區數量等,具體可參考SD卡資料中CSD暫存器說明,對於不同的卡CSD的版本不同。一般SDSC為V1.0版本,SDHC或SDXC為V2.0版本

二、      FatFs移植

1、            disk_initialize

磁碟初始化,呼叫底層SD卡驅動(這裡用的MMCSD_Init),如果初始化成功返回RES_OK。

2、            disk_status

獲取磁碟狀態,可直接返回RES_OK.

3、            disk_read

讀磁碟操作,根據couter引數來判斷是讀單扇區還是多扇區

4、            disk_write

寫磁碟操作,根據couter引數來判斷是寫單扇區還是多扇區

5、            disk_ioctl 

控制裝置特定的功能以及磁碟讀寫以外的其它功能。

n      GET_SECTOR_SIZE

扇區大小,跟SD協議中的Block是同一個概念,返回值以

WORD形式存入Buffer中。一般情況是以512位元組為單位,直接返回512即可。

n      GET_SECTOR_COUNT

獲取扇區數量,該功能與格式化(f_mkfs)時有關,返回值以DWORD形式存入Buffer中,若返回值錯誤將導致格式化後容量錯誤。如果不需要格式化可以直接返回RES_OK;

n      GET_BLOCK_SIZE

以扇區為單位的儲存陣列的擦除塊大小,返回值以DWORD形式存入Buffer中,當擦除塊大小未知或是磁碟裝置時可以直接返回RES_OK,僅在格式化時使用。

可以直接返回RES_OK,也可以根據CSD暫存器中的SECTOR_SIZE來確定。

n      CTRL_ERASE_SECTOR

當要往SD卡寫資料時就需要使用該功能,即寫之前的擦除扇區。引數以DWORD形式存在Buffer中。

DWORD  *pDWORD = (DWORD *)buff;

pDWORD[0]表示要擦除的起始扇區

pDWORD[1]表示要擦除的截止扇區

如果SD卡為只讀的話可以直接返回RES_OK;

6、            get_fattime 

獲取當前時間   

DWORD get_fattime (void); 

返回的當前時間為 DWORD 數值。各位域定義如下:  

bit31:25  年,從 1980 年開始算起 (0..127)  

bit24:21  月 (1..12)  

bit20:16  日 (1..31)  

bit15:11  時 (0..23)  

bit10:5  分 (0..59)  

bit4:0  秒 /2(0..29) 

7、            配置引數

_USE_MKFS:為1時允許格式化,為0時不允許。

_MAX_SS:最大操作扇區大小,大的值可以提前檔案系統效率。

_USE_ERASE:為1時可以使用CTRL_ERASE_SECTOR功能

測試檔案wmv視訊檔案,大小:7375.689 KB(7552706Bytes)

SPI時鐘 50MHz

其中寫入速度是根據拷貝時間和讀取時間來計算出寫入時間而得到的。

速度測試結果如下:

檔案系統  SD卡型別     讀取時間   讀取速度     拷貝時間    拷貝速度      寫入速度

FAT     金士頓TF1G    10秒    737.569KB/S    27秒    273.174KB/S    433.864KB/S

FAT32    金士頓TF1G    10秒    737.569KB/S    123秒   59.965KB/S     65.272KB/S

FAT32    閃迪SD4G      21秒    351.223KB/S    34秒    216.932KB/S    567.361KB/S

FAT32    金士頓SD8G    11秒    670.517KB/S    29秒    254.334KB/S    409.761KB/S

FAT32    金士頓SD16G   12秒     614.641KB/S    29秒    254.334KB/S    433.864KB/S

FAT32    金士頓SD32G   11秒    670.517KB/S    29秒    254.334KB/S    409.761KB/S

底層驅動使用SSP0,加上DMA功能後的速度測試結果如下:

檔案系統  SD卡型別     讀取時間   讀取速度     拷貝時間    拷貝速度       寫入速度

FAT      金士頓TF1G    5秒     1.441MB/S      17秒      433.864KB/S    614.641KB/S

FAT32    金士頓TF1G    5秒     1.441MB/S      111秒     66.448KB/S    69.582KB/S

FAT32    閃迪SD4G     16秒     460.981KB/S    32秒      230.490KB/S    460.981KB/S

FAT32    金士頓SD8G    6秒     1.200MB/S      20秒     368.784KB/S     526.835KB/S

FAT32    金士頓SD16G   6秒     1.200MB/S      20秒     368.784KB/S     526.835KB/S

FAT32    金士頓SD32G   6秒     1.200MB/S      22秒     335.259KB/S     460.981KB/S