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是同一個概念,返回值以
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