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

你可能感兴趣的:(C)