最近在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
上一篇:LPC17XX之SSP0/1接口
下一篇:通过SPI方式实现LPC17xx的远程升级设计
推荐阅读最新更新时间:2024-11-16 23:45
推荐帖子
- 电路在protuse中仿真可以的,焊接后却不能显示重量
- 我做的简易电子秤,已经仿真了显示电路,可以实现测重和基本课题要求。用的是51,adc0804结果焊接后用稳压信号源模拟信号,没有出现重量显示,电路连接和仿真图一样不会错,真心不知道问题出在哪里,求指教。电路在protuse中仿真可以的,焊接后却不能显示重量有没有人看见啊,在线等连图都没有让别人怎么给你检查,也不能凭空想吧可能出问题的地方太多了:称重的电桥、供电、芯片的供电、单片机的程序烧录、单片机的程序错误、显示部分的供电…… adc的连接电路就是这样 :Cry:显示和仿
- 明明电子 电子竞赛
- AD8603放大芯片 单电源双电源问题
- AD8603采用1.8V至5.0V单电源或±0.9V至±2.5V双电源供电。我这里的仿真采用的是5V双电源供电电压放大20倍没失真可是当我采用5V单电源供电或者是±2.5V双电源供电都有失真这个是怎么回事啊?恳请大神指点迷津!AD8603放大芯片单电源双电源问题请问可以用双电源5V吗?回复楼主joy6130的帖子不是写着1.8-5V吗?双电源就是±0.9V至±2.5V,应该不可以+-5V供电的。
- joy6130 ADI参考电路
- 大家手写输入是怎么做的?
- 用手写芯片?还说买商用sdk?大家手写输入是怎么做的?是软件做的吧
- 306228 嵌入式系统
- MicroTCA功率互连设计经验之谈
- 在电信和商业行业迅速发展的MicroTCA架构可能成为电信产业的电子设计的转折点。以前,许多电信设计都是高度定制的,并且受所有权的保护。相比之下,MicroTCA中的互连应用是标准化的,这可能是类似于计算机产业中普及的开放式架构兴起的一个信号。 虽然标准化连接器设计可能看起来很基础,但是从MicroTCA功率连接器提案中获得的经验与电源和其它行业以及商业电力电子系统的设计工程师相关。MicroTCA连接器要求高功率密度、热插拔能力、高可靠性和低成本。在通过接触件和机架设计满足这些要求时所采
- lianshum 电源技术
- 求大佬帮忙分析一个运放电路
- 请大家帮忙看一下这个运放电路感觉电路结构有点像差分检测电路,不知道能不能将框选的部分当作一个运放整体分析。通过multisim仿真得到的结果是输入电压10V输出电压是1.526V求大佬帮忙分析一个运放电路就是差分放大器,红框内可以看作运放整体,即忽略+-输入端电阻。计算一下:47k/91k*(10*3k(3k+8.2k)-3.3V)=1.537V与仿真结果一致此电路就是差分放大器。LM358偏置电流典型值50~100nA,在9
- Top丿翼 模拟电子
- 液晶128*64疑问
- 我用MSP430F149控制12864的显示,当程序写进去后,只有背光亮,就是不显示要显示内容,有没有谁遇到过类似的问题,给我帮帮忙,在这里谢过了!液晶128*64疑问我刚接触单片机的时候遇到过,那时候是没给IO口加上拉电阻导致的应该是I/O初始化错误。找个例程比较一下正确的I/O初始化应该不是那些问题,找到了TI所给的例程,有完整的程序,但是还是不行,不知道是什么问题!如果不是程序的问题就是硬件电路的问题了看看IO口设置是不是正确的,MSP430F149是不是工作正常如果
- lenggu 嵌入式系统