LPC1768 SPI模式下SD卡FatFs文件系统移植

发布者:温柔心情最新更新时间:2021-10-14 来源: eefocus关键字: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

关键字:LPC1768  SPI模式  SD卡  FatFs文件  系统移植 引用地址:LPC1768 SPI模式下SD卡FatFs文件系统移植

上一篇:LPC17XX之SSP0/1接口
下一篇:通过SPI方式实现LPC17xx的远程升级设计

推荐阅读最新更新时间:2024-11-16 23:45

SD卡在单片机上的应用
(1)SD卡的引脚定义: iframe id="iframe_0.24805428786203265" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://img.blog.163.com/photo/Jv7hvK3nIEAhhJ8LVOdm-g==/3700551518815716507.jpg?_=3335000%22%20style=%22border:none;max-width:1333px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%
[单片机]
AM335X的SD卡更新系统学习记录
一般利用一张SD卡就能进行系统的更新,以前一直不知是什么原理,最近了解了下,对了解到的内容做个记录。使用的是AM335X平台,系统是Linux,文件系统是EXT3: 1、首先需要一张分好分区的SD卡(分区方法这里不做详细介绍,一般可使用TI官方提供的create-sdcard.sh脚本可以进行分区)。其中分区1(FAT32)存放MLO、u-boot.img、uImage三个文件;分区2(EXT3)存放需要从SD卡启动的Linux文件系统。 2、AM335X上电后,根据Boot Sequence启动配置(LCD0-LCD15引脚,具体可参考TI官方的335X参考手册),从相应的存储设备启动,这里配置的是从SD卡启动。 3
[单片机]
LPCXpresso LPC1114 SSP多扇区读写SD卡
为了更加清楚的说明多扇区与单扇区读写的不同,单独开一贴进行详细的说明。 在FatFs文件系统时,发现为了提高SD卡的读写速度,需要一个多扇区读写的函数。当然很多人都会第一反应为,用循环调用单扇区读写函数不就能实现吗?如: uint8 i; for (i=0; i count; i++) { MMCWriteSingleBlock(); // 单扇区写 MMCReadSingleBolck(); // 单扇区读 } 事实上的确可以这样实现,但是,如果是按照这样的方式实现就没有多扇区读写的优势了。速度是没有任何提升的。于是我们查阅SD卡技术可以得到如下时序: 先看看SD卡的单
[单片机]
LPCXpresso LPC1114 SSP多扇区读写<font color='red'>SD卡</font>
基于MSP430F5438A的SPI通信来进行SD卡初始化
最近需要做一个数据存储,发现SD卡这一块还不太好弄 现在的单片机有相当一部分还不支持SDIO,比如MSP430(据我所知,如果有支持的型号了还请及时告诉我~),所以只好用SPI通信来进行SD卡的操作,虽然后续涉及到更为复杂的FAT等等,但是首先需要解决的仍然是建立通信的问题。 采用的单片机型号为MSP430F5438A,用了一个开发板。 SPI通信基本例程 例程及解释如下: 鉴于CSDN的Markdown代码高亮做的实在是……唉,这里贴一个容易看的吧: SPI通信代码 SD卡通信方式 以上是给出的例程,SD卡有自己的一套通信方法: 这里引述了: http://elm-chan.org/docs/mmc/mmc_
[单片机]
基于MSP430F5438A的<font color='red'>SPI</font>通信来进行<font color='red'>SD卡</font>初始化
STM32使用FATS文件系统读取SD卡没有有效的FAT卷
开发环境: uVision : V5.12.0.0 STM32F103V8T6 库版本 : STM32F10x_StdPeriph_Lib_V3.5.0 FATSF : ff13a 下载地址:http://elm-chan.org/fsw/ff/00index_e.html 问题: 在使用STM32的FATS文件系统,对SD卡进行文件读写时候,往往会碰到“FR_NO_FILESYSTEM:没有有效的FAT卷”的问题。 原因:SD卡在格式化的时候,格式化的格式不对。 解决办法:使用读卡器,在电脑找到SD卡,进行格式化,文件系统一定要选择“FAT(默认)”,分配单元大小,推荐选择32KB(任意选择均可),如下图:
[单片机]
STM32使用FATS<font color='red'>文件</font>系统读取<font color='red'>SD卡</font>没有有效的FAT卷
SPI 的主模式和从模式
主机写 从机读 主机读 从机写 数据输出是将数据送到那两根线上,数据采样是将数据从总线上读取到主从机中。 以下内容来源于《51单片机轻松入门—基于STC15W4K系列》第5章 第5章SPI通信 5.1SPI总线数据传输格式 5.1.1 接口定义 SPI是高速、全双向、同步、四线或三线制串行外围设备接口,采用主从模式结构,支持多从机模式应用,一般仅支持单主机,在主机的移位时钟脉冲下,数据按位传输,可以是高位在前(MSB first),低位在后,也可以低位在前,高位在后的顺序发送,目前应用中的数据速率可达5Mbps以上的水平,SPI接口唯一的一个缺点是没有应答机制确认是否接收到数据,但一般的SPI从器件设计都很完善,只
[单片机]
<font color='red'>SPI</font> 的主<font color='red'>模式</font>和从<font color='red'>模式</font>
米尔瑞米派Remi Pi Ubuntu系统移植指南
概述 Linux系统平台上有许多开源的系统构建框架,这些框架方便了开发者进行嵌入式系统的构建和定制化开发,目前比较常见的有Buildroot, Yocto, OpenEmbedded等等。 同时更多的传统的桌面系统也加入到嵌入式环境体系中,如Ubuntu,debian等,为嵌入式提供更方便实用的系统。本文主要介绍基于ubuntu22.04 core和米尔核心板定制一个完整的嵌入式ubuntu22.04系统的完整流程,其中包括开发环境的准备,ubuntu22.04系统的获取与移植, LXDE轻量级桌面管理等。 本文档并不包含Linux BSP系统相关基础知识的介绍,将直接使用米尔发布的myir-image-fu
[嵌入式]
米尔瑞米派Remi Pi Ubuntu<font color='red'>系统移植</font>指南
ATmega128L单片机的Micro SD卡读写
引言 随着工业控制系统功能的增强,系统对于存储介质的安全、容量、性能的要求越来越高。Micro SD卡是在SD卡和Mini SD卡基础上发展起来的一种多功能存储卡,具备串行和随机存取能力,可以通过专用优化速度的串行接口访问,数据传输可靠,安全性好,传输速度快,存储容量大,体积小,被列为目前全球最小的迷你存储卡。Micro SD卡支持SD模式和SPI模式。随着高性能单片机的性能不断提高,利用高性能、低功耗的AVR 8位ATmegal28L单片机的串行外设接口SPI与Micro SD卡之间进行高速同步数据传输,设计开发了一种嵌入式文件系统。 1 硬件电路设计 MicrO SD卡的接口可以支持两种操作模式:SD模式和SPI模式。主机
[单片机]
ATmega128L单片机的Micro <font color='red'>SD卡</font>读写

推荐帖子

电路在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 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved