SD卡扇区读写程序 经测试通过

合集下载

SD卡读写操作 SD卡电路

SD卡读写操作  SD卡电路

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。

在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。

SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。

既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。

这就要求对SD卡的硬件与读写时序进行研究。

对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。

要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。

下面先来讲解SD卡的读写时序。

(1)SD卡的引脚定义:SD卡引脚功能详述:SD卡SPI模式下与单片机的连接图:SD卡支持两种总线方式:SD方式与SPI方式。

其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。

而SPI 方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。

SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。

采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。

这里只对其SPI方式进行介绍。

(2) SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。

从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。

然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。

SPI接口的选用是在上电初始时向其写入第一个命令时进行的。

以下介绍SD卡的驱动方法,只实现简单的扇区读写。

1)命令与数据传输1. 命令传输SD卡自身有完备的命令系统,以实现各项操作。

命令格式如下:命令的传输过程采用发送应答机制,过程如下:每一个命令都有自己命令应答格式。

SD卡文件系统读写

SD卡文件系统读写

SD 文件系统SD文件系统SD卡概述1122SD卡通信协议文件系统的实现3344DE2实例55总结一、SD卡概述1、SD卡简介(1)SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆设备。

SD卡数据传送和物理规范由MMC发展而来一、SD卡概述1、SD卡简介(2)特点:大容量、高性能、安全性高。

用途:可用在MP3、移动电话、PDA、数码相机、数码摄像机、电子图书、微型电脑、AV器材等领域。

数据传输速率:SD卡读写速度比MMC卡要快四倍,最大速率可达到10MB/秒。

几种SD卡的区分:普通SD,高速SD,SDHC。

一、 SD 卡概述2、SD 卡内部结构SD 卡由9线接口控制,数写 保 护据线包括:CMD,CLK,DAT0-DAT3。

包括6个寄存器写保护一、SD卡概述3、SD通信模式一个主机一般情况下可以挂多张SD卡,最大10个堆叠的卡。

主机访问模式:SD模式;SPI模式一、SD卡概述4、SD卡通信主机和SD卡之间的通信是通过命令和数据流实现的,如下图所示:命令发送/数据传输二、SD卡通信协议1、SD卡接口可以支持两种操作模式1、SD卡模式2、SPI模式主机系统可以选择以上其中任一模式,SD卡模式允许4线的高速数据传输。

SPI模式允许简单通用的SPI通道接口,这种模式相对于SD模式的不足之处是丧失了速度。

二、SD卡通信协议SD模式(1)SD模式总线连接图二、SD卡通信协议SD模式(2)SD模式针脚定义SD总线允许1线和4线数据信号设置。

二、SD卡通信协议SPI模式(1)SPI模式连接图二、SD卡通信协议SPI模式(2)SPI模式针脚定义注意:SPI模式时,数据信号需要在主机端用10- 100K欧的上拉电阻。

二、SD卡通信协议2、SD模式介绍SD模式下的命令和数据都有一个开始位和结束位。

数据传输格式主要有命令、响应和数据格式。

命令格式命令: 在CMD上传输的用于启动一个操作的比特流由主机发往从机, 可以是点对点也可以是广播的。

STM32的SD卡读取

STM32的SD卡读取

连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第四十四章SD卡实验2013-04-04 23:07第四十四章 SD卡实验很多单片机系统都需要大容量存储设备,以存储数据。

目前常用的有U盘,FLASH芯片,SD卡等。

他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32Gb以上),而且支持SPI接口,方便移动,并且有几种体积的尺寸可供选择(标准的SD卡尺寸,以及TF卡尺寸等),能满足不同应用的要求。

只需要4个IO口即可外扩一个最大达32GB以上的外部存储器,容量从几十M到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

ALIENTKE 战舰STM32开发板自带了标准的SD卡接口,可使用STM32自带的SPI/S DIO接口驱动(通过跳线帽选择驱动方式),本章我们使用SPI驱动,最高通信速度可达18Mbps,每秒可传输数据2M字节以上,对于一般应用足够了。

在本章中,我们将向大家介绍,如何在ALIENTEK战舰STM32开发板上实现SD卡的读取。

本章分为如下几个部分:44.1 SD卡简介44.2 硬件设计44.3 软件设计44.4 下载验证44.1 SD卡简介SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。

SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。

大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。

按容量分类,可以将SD卡分为3类:SD卡、SDHC卡、SDXC卡。

如表44.1.1所示:容量命名简称0~2G Standard Capacity SD Memory Card SDSC或SD2G~32G High Capacity SD Memory Card SDHC32G~2T Extended Capacity SD Memory Card SDXC表44.1.1 SD卡按容量分类SD卡和SDHC卡协议基本兼容,但是SDXC卡,同这两者区别就比较大了,本章我们讨论的主要是SD/SDHC卡(简称SD卡)。

SD卡读写操作

SD卡读写操作

SD卡操作一、概述1、简介SD卡是基于flash的存储卡。

SD卡和MMC卡的区别在于初始化过程不同。

SD卡的通信协议包括SD和SPI两类。

SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。

2、功能介绍2.1 特点1)主机无关的FLASH内存擦除和编程读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。

当采用新型的FLASH时,主机代码无需更新。

2)缺陷管理3)错误恢复4)电源管理Flash每个扇区有大约10万次的写寿命,读没有限制。

擦除操作可以加速写操作,因为在写之前会进行擦除。

3 SD总线模式3.1 Negotiating Operation Conditions当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。

要退出非活动状态唯一的方法就是重新上电。

3.2 SD卡获取和识别SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。

主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。

主机通过READ_CID命令读取CID寄存器。

CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。

DAT3线上内置的上拉电阻用来侦测卡。

在数据传输时电阻断开(使用ACMD42)。

3.3 卡状态卡状态分别存放在下面两个区域:卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。

SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。

SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。

3.4 内存组织数据读写的基本单元是一个字节,可以按要求组织成不同的块。

Block:块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD寄存器。

sd卡数据读写流程

sd卡数据读写流程

sd卡数据读写流程一、概述SD卡是一种常用的存储设备,应用广泛。

在进行SD卡数据读写操作时,需要了解其基本流程及相关细节。

本文将详细介绍SD卡数据读写流程。

二、准备工作1. 确认SD卡类型:根据需求选择合适的SD卡类型,如标准SD卡、Mini SD卡、Micro SD卡等。

2. 准备读写设备:需要使用支持SD卡的读写设备,如读卡器、手机、相机等。

3. 系统环境:根据不同操作系统选择相应的驱动程序和开发工具。

三、初始化SD卡1. 电源接口:将SD卡插入读写设备中,并接通电源。

2. 查找CMD线:通过CMD线查找到SD卡,并发送复位命令。

3. 发送初始化命令:发送初始化命令后,等待SD卡响应并返回状态码。

四、读取CID和CSD寄存器信息1. 发送CMD10命令:通过CMD10命令可以获取CID寄存器信息。

2. 发送CMD9命令:通过CMD9命令可以获取CSD寄存器信息。

五、设置Block长度1. 发送CMD16命令:通过CMD16命令设置Block长度,即每次读取或写入的字节数。

六、数据传输1. 读取数据:发送CMD17命令,指定读取的起始地址和读取的Block数量,等待SD卡响应并返回数据。

2. 写入数据:发送CMD24命令,指定写入的起始地址和写入的Block数量,等待SD卡响应并写入数据。

七、结束操作1. 发送CMD12命令:结束操作前需要发送CMD12命令,以停止多块传输。

2. 断开电源:操作完成后需要断开SD卡电源。

八、注意事项1. SD卡在进行读写操作时需要保持稳定的电压和供电。

2. 操作过程中需要注意各种状态码及其含义。

3. 合理选择Block长度可以提高读写速度。

以上就是SD卡数据读写流程的详细介绍。

在实际应用中,还需要根据具体情况进行合理调整和优化。

MCS51 MCU读写SD卡版(单片机论文)

MCS51 MCU读写SD卡版(单片机论文)

摘要摘要近年来, SD存储卡在嵌入式产品中的应用越来越广泛, 但SD卡接口一般仅集成在32位高端处理器中, 一般51单片机则由于资源限制没有该接口。

因此,如何解决51单片机应用系统存取SD卡大容量数据就显得很有实际意义。

本系统使用MXT8051F04A作为单片机与SD卡的接口芯片, 采用SPI串行方式对SD卡的扇区进行读写,读写过程和结果通过串口调试助手在主机上显示。

本论文的核心主要从硬件设计和软件编程两个大的方面介绍了系统的实现。

硬件电路设计主要包括MXT8051F04A最小系统电路、电源电路、串口电路、SD卡接口电路。

程序采用C语言在Keil软件下进行编写、调试,程序主要包括SD卡扇区读写程序、串口程序等软件模块。

系统实现了对SD卡扇区的读写,达到了设计的要求和目的。

关键字:MXT8051F04A,SD卡,KeilIABSTRACTABSTRACTIn recent years, SD memory card applications in the embedded products more widely, but generally only the integrated SD card interface in 32-bit high-end processor, microcontroller 51 is generally not the interface due to resource constraints. Therefore, how to solve the 51 SCM applications to access data on large-capacity SD cards seem very practical.The system uses MXT8051F04A as SCM and SD card interface chip, using SPI mode on the SD card serial read and write sectors, reading and writing process and results through the serial port on the host display debugging assistant. The core of this thesis, the main hardware and software design introduces two major aspects of the system implementation. Hardware design includes MXT8051F04A minimum system circuit, power circuit, the serial port circuitry, SD card interface circuit. Program using C language under the Keil software write, debug, the program includes reading and writing SD card sector program, serial procedures of software modules. System realizes the SD card read and write sectors, meets the design requirements and objectives.Keywords: MXT8051F04A,SD Card,KeilII目录第1章引言 (1)1.1 选题背景 (1)1.2 研究目标和意义 (1)1.3 本文要完成的工作 (1)第2章单片机读写SD卡的硬件电路设计 (3)2.1 系统硬件平台组成 (3)2.2 电源模块 (3)2.3 MXT8051F04A单片机最小系统电路设计 (4)2.3.1 MXT8051F04A简介 (4)2.3.2 晶振复位电路 (8)2.4 SD卡电路设计 (8)2.4.1 通讯模式 (9)2.4.2 电平匹配 (9)2.4.3 硬件接口设计 (10)2.5 串口电路设计 (12)2.6 PCB绘制 (13)2.7 本章小结 (14)第3章单片机读写SD卡的软件设计 (14)3.1 SD卡的扇区读写 (14)3.1.1 模拟SPI协议 (14)3.1.2 SD卡命令 (15)3.1.3 SD卡的初始化 (19)3.1.4 数据块的读写 (20)3.2 串口程序 (25)第4章调试 (26)4.1 系统硬件调试 (26)4.2 软件调试 (27)4.3 软硬件的联合调试 (27)III4.4 本章小结 (29)第5章结束语 (30)5.1 总结 (30)5.2 展望 (30)参考文献 (31)致谢 (32)附录 (33)附录一:单片机读写SD卡的完整原理图 (33)附录二:单片机读写SD卡的完整程序 (36)外文资料原文 (63)译文 (64)IV第1章引言第1章引言1.1选题背景SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如个人数码助理(PDA)、数码相机和多媒体播放器等。

单片机读写SD卡教程

单片机读写SD卡教程

重声明:本实验并不是对所有SD卡都能成功运行第一步:翻开winhe*软件,用读卡器读SD卡,在winhe*中查看SD卡点击查找〔ctrl+F〕Array输入FAT〔找到DBR处〕发现DBR起始于0*11200扇区地址,它必是512所以在程序中读一个扇区时一定要是5120*EB,本程序读一下这个地址的值看看是否正确。

注意有的看看程序吧*include <reg52.h>*define uchar unsigned char*define uint unsigned int//=============================================================//定义SD卡需要的4根信号线sbit SD_CLK = P1^1;sbit SD_DI = P1^2;sbit SD_DO = P1^0;sbit SD_CS = P1^3;sbit Beep=P2^0;//用来调程序标志//===========================================================//===========================================================//定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char *data DATA[512];void delay(unsigned int z){unsigned int *,y;for(*=z;*>0;*--);for(y=110;y>0;y--);}//===========================================================//写一字节到SD卡,模拟SPI总线方式void SdWrite(unsigned char n){unsigned char i;for(i=8;i;i--){SD_CLK=0;SD_DI=(n&0*80);n<<=1;SD_CLK=1;}SD_DI=1;}//===========================================================//从SD卡读一字节,模拟SPI总线方式unsigned char SdRead(){unsigned char n,i;for(i=8;i;i--){SD_CLK=1;SD_CLK=0;n<<=1;if(SD_DO) n|=1;}return n;}//============================================================//检测SD卡的响应unsigned char SdResponse(){uchar i=0,response=0;while(i<=8){response = SdRead();if(response==0*00)break;if(response==0*01)break;i++;}return response;}//=============================================================== =//发命令到SD卡void Sdmand(unsigned char mand, unsigned long argument, unsigned char CRC) {SdWrite(mand|0*40);/*SdWrite(((unsigned char *)&argument)[0]);SdWrite(((unsigned char *)&argument)[1]);SdWrite(((unsigned char *)&argument)[2]);SdWrite(((unsigned char *)&argument)[3]);*/SdWrite(argument>>24);SdWrite(argument>>16);SdWrite(argument>>8);SdWrite(argument);SdWrite(CRC);}//=============================================================== =//初始化SD卡unsigned char SdInit(void){unsigned char i;unsigned char response=0*FF;P3=0*ff;SD_CS=1;for(i=0;i<=0*fe;i++)SdWrite(0*ff);SD_CS=0;Sdmand(0*00,0,0*95);SD_DI=1;response=SdResponse();if(response!=0*01){return 0;}if(response==0*01){ //不管什么SD卡都能进入这一步,同时也说明硬件没问题SD_CS=1;//Beep=0;//while(1);//用来查看程序能否运行到这一步,去掉//即可SdWrite(0*ff);SD_CS=0;while(1){Sdmand(0*01,0,0*ff);//Sdmand(0*01,0*00000000,0*ff);//进SPIresponse=0*ff;SD_DI=1;for(i=0;i<250;i++)//response!=0*00//等待回复{response=SdResponse(); //Beep=0;/if(response==0) break;}if(response==0) {break;}//回复0则通过SPI,只要通过SPI后面的指令才能继//续// Beep=0;}// Beep=0;//看程序能否跳出来,挑不出来则进不了SPISD_CS=1;SdWrite(0*ff);SD_CS=0;// Beep=0;return 1;}}//=============================================================== =//往SD卡指定地址写数据,一次最多512字节最好不要乱写否则fat系统被改掉SD卡打不开unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len){unsigned int count;unsigned char dataResp;SD_CS=0;Sdmand(0*18,address,0*ff);if(SdResponse()==00){SdWrite(0*ff);SdWrite(0*ff);SdWrite(0*ff);//mand was a success - now send data//start with DATA TOKEN = 0*FESdWrite(0*fe);//now send datafor(count=0;count<len;count++) SdWrite(*Block++);for(;count<512;count++) SdWrite(0);//data block sent - now send checksumSdWrite(0*ff); //两字节CRC校验, 为0*FFFF 表示不考虑CRCSdWrite(0*ff);//Now read in the DATA RESPONSE tokendataResp=SdRead();while(SdRead()==0);dataResp=dataResp&0*0f; //mask the high byte of the DATA RESPONSE token SD_CS=1;SdWrite(0*ff);if(dataResp==0*0b){return 0;}if(dataResp==0*05)return 1;return 0;}//printf("mand 0*18 (Write) was not received by the SD.\n");return 0;}//=============================================================== ========//从SD卡指定地址读取数据,一次最多512字节unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len) {unsigned int count,i;uchar response;SD_CS=0;// while(1)// {Sdmand(0*11,address,0*ff);// SD_DO=1;// P0=SdResponse();// P0=0*ff;// while(1);while(response!=0*fe && i<200) {response=SdRead();P0=response;i++;} // if(i>=200) Beep=0;// P0=0*f0;// }// Beep=0;for(count=0;count<512;count++) *Block++=SdRead();SdRead();SdRead();//Now read in the DATA RESPONSE tokenSD_CS=1;SdWrite(0*ff);return 1;}void main(){unsigned int mm;unsigned long AddTemp=0*11200;//70144;//SD卡地址第一个数据物理地址初始值70144是通过winhe*查看,对于你的SD卡肯定要改//可以用winhe*查看,一定要是512整数倍mm=SdInit();//SdReadBlock(DATA,AddTemp,1);delay(10);// Beep=0;if(DATA[0]==0*eb)Beep=0;// 看读的对不对while(1); }。

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解FAT(File Allocation Table)文件系统是一种常用的文件系统,被广泛应用于存储设备如SD卡上。

在单片机中使用SD卡进行读写操作时,需要使用FAT文件系统进行文件的管理和操作。

下面将详细介绍FAT文件系统的SD卡单片机读写方法。

1.SD卡初始化:在进行SD卡读写操作之前,首先需要初始化SD卡。

初始化SD卡的步骤如下:1.1硬件上电及等待稳定。

将SD卡模块供电,并等待SD卡电压稳定,通常需要几十毫秒的时间。

1.2发送复位命令。

向SD卡发送复位命令,命令的格式如下:CMD0:0x400x000x000x000x000x95发送这个命令后,SD卡会返回R1响应,其中bit 0为0表示复位成功。

1.3发送检测版本命令。

向SD卡发送检测版本命令,命令的格式如下:CMD8:0x480x000x000x010xAA0x87发送这个命令后,SD卡会返回R7响应,其中bit 0为0表示命令执行成功。

1.4判断SD卡类型。

根据R7响应中的数据,判断SD卡的类型,如果是SDHC卡或SDXC卡,需要进行额外的操作。

1.5发送初始化命令。

向SD卡发送初始化命令,命令的格式如下:CMD55:0x770x000x000x000x000xFFACMD41:0x690x400x000x000x000xFF循环发送这两个命令,直到SD卡返回R1响应的bit 0为0,表示初始化完成。

1.6发送读取OCR命令。

向SD卡发送读取OCR命令,命令的格式如下:CMD58:0x7A0x000x000x000x000xFF发送这个命令后,SD卡会返回R3响应,其中包含卡的OCR寄存器的内容。

2.FAT文件系统格式化:在SD卡上创建FAT文件系统之前,需要对SD卡进行格式化操作。

格式化操作会将SD卡分为引导扇区、FAT表、根目录区和数据区。

2.1创建引导扇区。

在SD卡的第一个扇区创建引导扇区,引导扇区包含引导记录和磁盘参数表。

单片机读写SD卡教程

单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡点这点击查找(ctrl+F)输入FAT(找到DBR处)发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。

11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。

注意有的winhex编址是十进制看看程序吧#include <reg52.h>#define uchar unsigned char#define uint unsigned int//=============================================================//定义SD卡需要的4根信号线sbit SD_CLK = P1^1;sbit SD_DI = P1^2;sbit SD_DO = P1^0;sbit SD_CS = P1^3;sbit Beep=P2^0;//用来调程序标志//===========================================================//===========================================================//定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char xdata DATA[512];void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--);for(y=110;y>0;y--);}//=========================================================== //写一字节到SD卡,模拟SPI总线方式void SdWrite(unsigned char n){unsigned char i;for(i=8;i;i--){SD_CLK=0;SD_DI=(n&0x80);n<<=1;SD_CLK=1;}SD_DI=1;}//=========================================================== //从SD卡读一字节,模拟SPI总线方式unsigned char SdRead(){unsigned char n,i;for(i=8;i;i--){SD_CLK=1;SD_CLK=0;n<<=1;if(SD_DO) n|=1;}return n;}//============================================================ //检测SD卡的响应unsigned char SdResponse(){uchar i=0,response=0;while(i<=8){response = SdRead();if(response==0x00)break;if(response==0x01)break;i++;}return response;}//================================================================ //发命令到SD卡void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC) {SdWrite(command|0x40);/*SdWrite(((unsigned char *)&argument)[0]);SdWrite(((unsigned char *)&argument)[1]);SdWrite(((unsigned char *)&argument)[2]);SdWrite(((unsigned char *)&argument)[3]);*/SdWrite(argument>>24);SdWrite(argument>>16);SdWrite(argument>>8);SdWrite(argument);SdWrite(CRC);}//================================================================ //初始化SD卡unsigned char SdInit(void){unsigned char i;unsigned char response=0xFF;P3=0xff;SD_CS=1;for(i=0;i<=0xfe;i++)SdWrite(0xff);SD_CS=0;SdCommand(0x00,0,0x95);SD_DI=1;response=SdResponse();if(response!=0x01){return 0;}if(response==0x01){ //不管什么SD卡都能进入这一步,同时也说明硬件没问题SD_CS=1;//Beep=0;//while(1);//用来查看程序能否运行到这一步,去掉//即可SdWrite(0xff);SD_CS=0;while(1){SdCommand(0x01,0,0xff);//SdCommand(0x01,0x00000000,0xff);//进SPIresponse=0xff;SD_DI=1;for(i=0;i<250;i++)//response!=0x00//等待回复{response=SdResponse(); //Beep=0;/if(response==0) break;}if(response==0) {break;}//回复0则通过SPI,只要通过SPI后面的指令才能继//续// Beep=0;}// Beep=0;//看程序能否跳出来,挑不出来则进不了SPISD_CS=1;SdWrite(0xff);SD_CS=0;// Beep=0;return 1;}}//================================================================//往SD卡指定地址写数据,一次最多512字节最好不要乱写否则fat系统被改掉SD卡打不开unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len){unsigned int count;unsigned char dataResp;SD_CS=0;SdCommand(0x18,address,0xff);if(SdResponse()==00){SdWrite(0xff);SdWrite(0xff);SdWrite(0xff);//command was a success - now send data//start with DATA TOKEN = 0xFESdWrite(0xfe);//now send datafor(count=0;count<len;count++) SdWrite(*Block++);for(;count<512;count++) SdWrite(0);//data block sent - now send checksumSdWrite(0xff); //两字节CRC校验, 为0XFFFF 表示不考虑CRCSdWrite(0xff);//Now read in the DA TA RESPONSE tokendataResp=SdRead();while(SdRead()==0);dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE tokenSD_CS=1;SdWrite(0xff);if(dataResp==0x0b){return 0;}if(dataResp==0x05)return 1;return 0;}//printf("Command 0x18 (Write) was not received by the SD.\n");return 0;}//===================================================================== ==//从SD卡指定地址读取数据,一次最多512字节unsigned char SdReadBlock(unsigned char *Block, unsigned long address,int len){unsigned int count,i;uchar response;SD_CS=0;// while(1)// {SdCommand(0x11,address,0xff);// SD_DO=1;// P0=SdResponse();// P0=0xff;// while(1);while(response!=0xfe && i<200) {response=SdRead();P0=response;i++;} // if(i>=200) Beep=0;// P0=0xf0;// }// Beep=0;for(count=0;count<512;count++) *Block++=SdRead();SdRead();SdRead();//Now read in the DA TA RESPONSE tokenSD_CS=1;SdWrite(0xff);return 1;}void main(){unsigned int mm;unsigned long AddTemp=0x11200;//70144;//SD卡地址第一个数据物理地址初始值70144是通过winhex查看,对于你的SD卡肯定要改//可以用winhex查看,一定要是512整数倍mm=SdInit();//SdReadBlock(DATA,AddTemp,1);delay(10);// Beep=0;if(DATA[0]==0xeb) Beep=0;// 看读的对不对while(1);}。

单片机读写SD卡教程

单片机读写SD卡教程

单片机读写SD卡教程引言:SD卡(Secure Digital Card)是广泛应用于各类数字设备上的一种存储介质。

它小巧轻便,可靠性高,容量大,因此在各种嵌入式系统中都广泛使用。

本教程将介绍如何使用单片机读写SD卡,包括初始化SD卡、读写数据等基本操作。

一、硬件准备在开始之前,我们需要准备以下硬件设备:1.一个支持SPI协议的单片机开发板(例如STC89C51、STM32等);2.一个SD卡插槽,或者是一个带有SD卡插槽的扩展板;3.杜邦线、面包板等连接器。

二、软件准备除了硬件设备,我们还需要准备以下软件工具:1. Keil C51、IAR、Keil MDK等单片机编译工具;2. SD卡相关的库文件,例如FatFs;3.一个用于测试的程序(可以是一个简单的读写数据的程序)。

三、连接SD卡插槽将SD卡插入到对应的插槽中,并将插槽与单片机的硬件SPI接口连接。

根据不同的开发板,连接方式可能有所不同,一般SPI接口包括SCK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和CS(片选线)等。

四、编写读写SD卡的程序在开始编写程序之前,我们需要先了解SD卡的工作原理。

SD卡通过SPI总线与单片机进行通信,通过发送特定的命令和参数实现读写操作。

以下是一个简单的读写SD卡的流程:1.初始化SD卡a.发送CMD0命令,将SD卡设置为SPI模式;b.发送CMD8命令,验证SD卡是否支持高速SPI模式;c.发送ACMD41命令,等待SD卡初始化完成。

2.读写数据a.发送CMD17命令,指定要读取的扇区地址;b.等待SD卡回应,确认读取命令执行成功;c.读取数据;d.发送CMD18命令,继续读取下一个扇区;e.重复步骤c和d,直到读取完所有数据;f.发送CMD12命令,停止读取。

g.发送CMD24命令,指定要写入的扇区地址;h.等待SD卡回应,确认写入命令执行成功;i.写入数据;j.发送CMD25命令,继续写入下一个扇区;k.重复步骤i和j,直到写入完所有数据;l.发送CMD12命令,停止写入。

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解

FAT文件系统的SD卡单片机读写方法详解FAT(File Allocation Table)文件系统是一种用于存储和组织文件的文件系统。

SD卡是一种常见的存储设备,广泛应用于单片机系统中。

在单片机中,访问和读写SD卡上的文件需要特定的方法和步骤。

本篇文章将详细介绍FAT文件系统的SD卡在单片机中的读写方法。

1.硬件接口配置:在单片机系统中使用SD卡之前,需要进行硬件接口的配置。

SD卡使用SPI(Serial Peripheral Interface)进行数据传输,因此需要连接SD卡的CLK(时钟)、MISO(主从串行数据输入)、MOSI(主从串行数据输出)和CS(片选)引脚。

在单片机上使能SPI模块,并设置相关寄存器进行SPI传输的配置。

2.初始化SD卡:在开始使用SD卡之前,需要进行初始化操作。

初始化主要包括向SD 卡发送初始化命令和等待SD卡的响应。

初始化命令主要包括发送复位命令(CMD0)和发送初始化命令(CMD1)。

发送命令后,需要等待SD卡发回响应信号,即SD卡的操作完成,才能进行下一步的操作。

3.读取文件目录:在FAT文件系统中,文件目录存储了文件的相关信息,如文件名、文件大小、起始簇号等。

读取文件目录需要进行多次读取操作,以读取目录项的内容。

首先需要读取FAT表,获取根目录的起始簇号。

然后根据起始簇号,读取对应的目录项内容。

目录项的读取可以通过读取SD卡上的扇区数据进行,需要注意目录项的位置和格式。

4.读取文件数据:在FAT文件系统中,文件数据以簇(Cluster)为单位进行存储。

每个簇的大小一般为512字节。

首先需要根据文件目录项中的起始簇号,定位到对应的簇,并读取簇的数据内容。

读取文件数据就是按照簇的顺序进行读取,直到读取到文件结束符为止。

通过读取SD卡上的扇区数据,并根据FAT表中的簇号进行簇的链式读取。

5.写入文件数据:写入文件数据和读取文件数据类似,也是按照簇的顺序进行写入。

sd卡数据读写流程

sd卡数据读写流程

sd卡数据读写流程SD卡是一种常见的存储媒介,它具有轻便、易携带、容量大、存储速度快等优势。

SD卡数据读写流程是指将数据从SD卡中读取出来或将数据写入SD卡中的整个过程。

一、SD卡的物理结构SD卡主要由控制器、记忆芯片和接口组成。

控制器负责管理SD卡的读写操作;记忆芯片是存储数据的核心部件,它采用闪存技术,可存储数据并保持数据不易丢失;接口是SD卡与主控制器进行通信的桥梁,一般采用SPI(串行外设接口)或SDIO(SD输入输出)接口。

二、SD卡读写流程1.初始化SD卡当主控制器接通SD卡电源时,首先要进行初始化操作。

初始化操作主要包括向SD卡发送复位命令、读取SD卡的OCR(操作条件寄存器)以及设置SPI或SDIO接口的工作参数等操作。

2.读取SD卡信息在SD卡初始化成功后,主控制器通过SPI或SDIO接口向SD 卡发送命令,读取SD卡ID信息、SD卡容量、SD卡速度等重要参数。

这些信息将在数据读写时起到重要作用。

3.读取文件SD卡上的文件存储在文件系统中,主控制器需要先读取文件系统,找到要读取的文件所在的位置。

一般情况下,文件系统采用FAT32格式,主控制器需要读取文件系统启动区扇区信息,从而找到文件所在扇区及其起始地址。

4.读取数据在找到文件所在位置后,主控制器就可以根据文件系统的信息,向SD卡发送读操作指令,读取文件数据。

读取数据时,主控制器需要根据SD卡的速度、数据传输模式等参数设置接口波特率、时序等参数。

5.写入数据SD卡写数据流程与读数据基本相同,只是主控制器需要向SD卡发送写操作指令,将数据写入SD卡中。

写入数据时,主控制器需要根据SD卡的容量、速度等参数设置写入数据的起始位置、写入数据的长度、写入数据的校验和等参数。

6.关闭SD卡当读写操作完成后,主控制器需要向SD卡发送停止指令,将SD卡彻底关闭。

关闭SD卡可以避免SD卡数据丢失、损坏等问题。

三、SD卡的数据保护SD卡存储的数据非常重要,因此在SD卡的读写过程中,需要采取一定的措施保护数据。

AVRSD卡基础原理及读写经典c程序

AVRSD卡基础原理及读写经典c程序

1、简介:SD卡〔Secure Digital Memory Card〕是一种为满足平安性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。

本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD卡,可以参考相关资料。

SD 卡部构造及引脚如下列图所示2、SD卡管脚图:3、SPI模式下SD各管脚名称为:注:一般SD有两种模式:SD模式和SPI模式,管脚定义如下:〔A〕、SD MODE 1、CD/DATA3 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA08、DATA1 9、DATA2〔B〕、SPI MODE 1、CS 2、DI 3、VSS 4、VDD 5、SCLK 6、VSS2 7、DO 8、RSV 9、RSVSD 卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz 的频率;CMD:双向命令和回复线,命令是一次主机到从卡操作的开场,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的答复,回复可以来自单卡或所有卡;DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。

SD卡以命令形式来控制SD卡的读写等操作。

可根据命令对多块或单块进展读写操作。

在SPI模式下其命令由6个字节构成,其中高位在前。

SD卡命令的格式如表1所示,其中相关参数可以查阅SD卡规。

4、MicroSD卡管脚图:5、MicroSD卡管脚名称:SD 卡与MicroSD卡仅仅是封装上的不同,MicroSD卡更小,大小上和一个SIM 卡差不多,但是协议与SD卡一样。

一般我们用单片机操作SD 卡时,都不需要对FAT分区表信息做处理,原因如下:1〕、操作FAT分区表要增加程序代码量、增加SRAM的消耗,对于便携应用来说代码大小和占用SRAM的多少至关重要。

MicroSD卡读写时序及法度模范调试关键

MicroSD卡读写时序及法度模范调试关键

Micro SD卡读写时序及程序调试关键调试关键:1.上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,根据不同的卡设置不同的延时时间。

SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。

2.SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。

因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。

3.理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道了SD卡的工作电压,因此可省略这一步简化程序。

协议书上也建议尽量不要用这个命令。

4.SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写数据的问题。

我自己定义了一个计算公式:超时时间=(8/clk)*arg。

5.2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。

如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节操作将会出错。

6.对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大提高。

进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。

7.对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不能进行读写操作。

STM32的SD卡读取

STM32的SD卡读取

连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第四十四章SD卡实验2013-04-04 23:07第四十四章 SD卡实验很多单片机系统都需要大容量存储设备,以存储数据。

目前常用的有U盘,FLASH芯片,SD卡等。

他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32Gb以上),而且支持SPI接口,方便移动,并且有几种体积的尺寸可供选择(标准的SD卡尺寸,以及TF卡尺寸等),能满足不同应用的要求。

只需要4个IO口即可外扩一个最大达32GB以上的外部存储器,容量从几十M到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

ALIENTKE 战舰STM32开发板自带了标准的SD卡接口,可使用STM32自带的SPI/S DIO接口驱动(通过跳线帽选择驱动方式),本章我们使用SPI驱动,最高通信速度可达18Mbps,每秒可传输数据2M字节以上,对于一般应用足够了。

在本章中,我们将向大家介绍,如何在ALIENTEK战舰STM32开发板上实现SD卡的读取。

本章分为如下几个部分:44.1 SD卡简介44.2 硬件设计44.3 软件设计44.4 下载验证44.1 SD卡简介SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。

SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。

大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。

按容量分类,可以将SD卡分为3类:SD卡、SDHC卡、SDXC卡。

如表44.1.1所示:容量命名简称0~2G Standard Capacity SD Memory Card SDSC或SD2G~32G High Capacity SD Memory Card SDHC32G~2T Extended Capacity SD Memory Card SDXC表44.1.1 SD卡按容量分类SD卡和SDHC卡协议基本兼容,但是SDXC卡,同这两者区别就比较大了,本章我们讨论的主要是SD/SDHC卡(简称SD卡)。

SD卡读写操作详细说明

SD卡读写操作详细说明

SD卡读写操作详细说明SD卡(Secure Digital Card)是一种常见的存储设备,广泛应用于各种数码设备,如相机、手机、音乐播放器等。

SD卡读写操作是指对SD卡进行数据的读取和写入操作。

本文将详细介绍SD卡的读写操作流程和相关细节。

一、SD卡读写操作的基本原理SD卡采用了Flash存储技术,数据的读写是通过对存储芯片中的电荷进行控制实现的。

每个存储单元可以存储一个位(0或1),多个存储单元可以组成字节、块等不同大小的数据单元。

二、SD卡的初始化在进行SD卡的读写操作之前,首先需要对SD卡进行初始化。

SD卡的初始化包括以下几个步骤:1.插入SD卡:将SD卡插入到SD卡插槽中。

2.电源供给:给SD卡供电,使其可以正常工作。

3.寻卡:通过命令与SD卡进行通信,找到SD卡并识别其属性和参数。

三、SD卡的读操作SD卡的读操作是指从SD卡中读取数据。

SD卡的读操作流程如下:1.发送读命令:通过控制器向SD卡发送读命令,告知SD卡要读取的数据的起始地址和长度。

2.接收应答:SD卡接收到读命令后,会返回一个应答信号,确认是否接收到了读命令。

3.读取数据:当SD卡接收到读命令后,在指定的地址范围内读取数据,并将数据传输给控制器。

4.数据传输:控制器接收到SD卡传输的数据后,将数据转发给主机或其他设备进行处理。

四、SD卡的写操作SD卡的写操作是指向SD卡中写入数据。

SD卡的写操作流程如下:1.发送写命令:通过控制器向SD卡发送写命令,告知SD卡要写入的数据的起始地址和长度。

2.接收应答:SD卡接收到写命令后,会返回一个应答信号,确认是否接收到了写命令。

3.写入数据:当SD卡接收到写命令后,在指定的地址范围内写入数据。

4.数据传输:控制器向SD卡传输要写入的数据,SD卡接收到数据后进行存储。

五、SD卡的块操作SD卡的读写操作是以块为单位进行的,一个块的大小一般为512字节。

SD卡的块操作流程如下:1.发送块命令:通过控制器向SD卡发送块命令,告知SD卡要进行块操作的起始块号和块数。

LPC2138+SD卡Proteus虚拟平台(SD卡读写扇区测试)

LPC2138+SD卡Proteus虚拟平台(SD卡读写扇区测试)

LPC2138+SD卡Proteus虚拟平台(SD卡读写扇区测试)发表于2009-04-19 19:37经过几天的努力终于完成了SD卡读写扇区测试的proteus仿真,功能暂时只有读取和写入扇区数据,首先感谢古大哥的帮助。

我是新手,一边学习LPC2138和SD卡一边搭建虚拟平台,所以进度很慢,不过好在还是做出来了,希望像我这样的新手可以通过这个平台快速掌握SD卡,大家共同进步。

好了,下面总结一下:SD卡的驱动程序用的是Philips官方的参考驱动,官方驱动是用ssp作为spi口与SD卡通信的,但是我不管怎么调试,ssp仿真的时候写数据勉强能行,但是读数据总是出错,最后改动了几个函数换成了spi接口与SD卡通信。

Proteus及源代码程序中加入了串口程序,使得调试方便,在串口终端可以显示写入扇区的数据和读取扇区的数据,通过注释掉mmcmain.h中的#define Debug 可以使编译的时候不编译与串口相关的所有代码。

在改动程序时我尽量没有破坏原来程序的结构,spi_mmc.c中改动的函数有:void SPI_Init( void )void SPI_Send( BYTE *buf, DWORD Length )void SPI_Receive( BYTE *buf, DWORD Length )BYTE SPI_ReceiveByte( void )并加入了函数BYTE SPI_RW(BYTE data)函数。

加入此函数的目的是为了保留BYTE SPI_ReceiveByte( void )函数,其实这两个函数差不多,BYTE SPI_RW(BYTE data)完全可以实现BYTE SPI_ReceiveByte( void )的功能,但是在其他函数调用了BYTE SPI_ReceiveByte( void )函数,为了保持其他代码不变,所以加入了BYTE SPI_RW(BYTE data)函数。

SD卡读写

SD卡读写

SD卡读写(1)系统硬件文件系统只是数据的组织格式的统称,不涉及到硬件,所以系统的硬件与上篇日志中相同,不作修改。

(2)文件系统结构和读写原理带有文件系统的SD卡的内部结构一般如下表:256MSD卡的文件系统结构文件系统结构说明扇区起始号占用扇区数 Partiton Boot Sector 分区记录扇区 0 1 Reserved Sectors 保留扇区 0 4 FAT1 文件分配表1 4 242 FAT2 文件分配表2 246 242 DIR(FDT) 文件根目录区 488 32 User Data 数据区 520 493560 SD卡的保留扇区中一般不要写入数据,否则可能破坏其文件系统结构,导致操作系统不能识别。

在FAT文件系统中,BPB(Bios ParameterBlock)是一个很重要的参数表,该表通常位于0扇区(保留扇区中的第一个扇区)中的12-36字节,它记录了分区中的一些重要数据如总扇区数、每扇区的字节数、每簇的扇区数、保留扇区数、FAT表占用扇区数等,我这里的256M的SD卡中的BPB表如下:名称占用字节数内容说明BPB_BytesPerSec 2 0x0200 扇区大小为512字节 BPB_SecPerChus 1 0x08 每簇有8个扇区 BPB_RsvdSecCnt 2 0x0004 有4个保留扇区 BPB_NumFATs 1 0x02 有2个FAT表BPB_RootEntCnt 2 0x0200 根目录中可有512个登记项 BPB_TotSec16 20x0000 为0表示总扇区数大于65536BPB_MediaType 1 0xF8 磁盘介质为硬盘 BPB_FATSize16 2 0x00F2 每个FAT表占242个扇区 BPB_SecPerTrk 2 0x3F 每个磁道有63个扇区 BPB_NumHeads 2 0x00FF 磁头数为255BPB_HiddSec 4 0x00000000 有0个隐藏扇区 BPB_TotSec32 4 0x00078A00 共有494080个扇区保留扇区之后是文件分配表,FAT16文件系统有两份文件分配表(FAT),FAT的大小可以在BPB中查到。

SD卡读写开发文档

SD卡读写开发文档

SD卡读写关键是对SD的初始化、块扇区的读写、以及SD卡文件结构的掌握,初始化SD首先发送0x40 0x 00 0x00 0x00 0x00 0x59 应答0x01 进入空闲模式在发送0x41 0x 00 0x00 0x00 0x00 0x59 应答0x00 激活SD卡使用WinHex分析SD卡可以得到第一数据区即根目录区,在第520区,每扇区512字节,等等,分析后得结果用于,读数据的验证。

本SD卡为1G的金士顿卡,扇区宽度为512字节,根据WinHex和读SD卡的结论得出解读,可以得出表一:读本SD卡的第0块物理扇区512字节,即常说的引导扇区。

MBR(主引导的区)的长度为446字节(0x00~0x1BD),以后每16个字节代表一个分区,由上述分析得出本SD卡的逻辑地址的0扇区应该在隐藏扇区中,块的扇区地址为0x00000020,读扇区得到的内容:如下图所示:具体分析如下图所示:主引导区数(1个)+ 保留扇区数(0x04个)+ 隐藏数(0x20个)+2个FAT表宽度(0Xf2*2)=521,即从第521个扇区(扇区地址为520)开始的32个扇区中存放根目录。

读本SD卡的根目录的第一个扇区得出如图数据:本卡卷标名为UJNX,可见第一个32字节的文件为该根目录,但是他以文件夹的形式呈现,并且大小Size为0,在大多数正常情况下我们可以认为无后缀名的,大小为零的文件为文件夹(我知道这个并不科学,谁有好的建议?)。

可以看出32个扇区的根目录最多可以存储512个目录文件。

文件就简单了,直接根据FAT表簇的地址读数据就是了。

读FAT表:在FAT表中每两个字节的数据对应唯一的一个簇地址,每个簇有64个扇区,例如在第一个(地址为0x24)FAT表的第一个扇区中的数据如下:读文件1、根据32字节的目录获取文件名、类型、大小、起始簇的地址2、根据簇的地址高位和低位计算出簇的位置,并与对应的计算出该簇的起始扇区地址簇的起始扇区地址=根目录起始扇区+目录扇区宽度+(簇地址-2)*每个簇的扇区宽度。

sd卡读写最小单元

sd卡读写最小单元

sd卡读写最小单元SD卡是一种常用的存储设备,被广泛应用于数码相机、手机、平板电脑等设备中。

而在SD卡的存储中,最小的读写单元是什么呢?本文将深入探讨SD卡的读写最小单元,并分析其对存储性能的影响。

首先,我们需要了解SD卡的基本结构。

SD卡由控制器和存储芯片组成,其中存储芯片是存储数据的关键。

在存储芯片内部,数据是以一系列的存储单元(Cell)的形式存储的。

而存储单元的大小,也即SD卡的读写最小单元,对于SD卡的性能有着重要的影响。

在SD卡中,读写最小单元一般是一个扇区(Sector),它的大小通常为512字节。

这意味着SD卡在进行读写操作时,最小的单位是512字节的数据块。

当我们向SD卡写入数据时,系统将数据按照512字节的大小划分成一块一块的数据块,然后存储到SD卡的存储单元中。

而当我们读取SD卡的数据时,系统也是以512字节的数据块为单位进行读取的。

为什么SD卡的读写最小单元是512字节呢?这与SD卡的设计原理有关。

在SD卡的存储芯片中,每个存储单元的状态可以表示为0或1,即存储单元是一个二进制的存储单元。

而512字节正好可以被8整除,也就是说,512字节可以表示8个二进制位(也就是一个字节)。

这样设计的好处是,可以将一个字节的数据存储到一个存储单元中,从而实现数据的高效存储和读取。

SD卡的读写最小单元的大小对存储性能有着重要的影响。

首先,较小的读写最小单元可以提高SD卡的读写速度。

因为较小的读写最小单元意味着可以同时读写更多的数据块,从而加快数据的传输速度。

而如果读写最小单元较大,那么每次读写的数据量就会减少,从而导致读写速度的下降。

其次,较小的读写最小单元可以提高SD卡的存储效率。

因为较小的读写最小单元可以更好地利用存储芯片的空间,减少存储单元的浪费。

而如果读写最小单元较大,那么每个存储单元中可能只存储了一部分数据,从而导致存储空间的浪费。

此外,较小的读写最小单元也可以提高SD卡的可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delay(5);
}
return temp;
}
//-----------------------------------------------------------------------------------------------
// 向SD卡中写入命令,并返回回应的第二个字节
//-----------------------------------------------------------------------------------------------
unsigned char Write_Command_SD(unsigned char *CMD)
unsigned int i;
unsigned char pcmd[]={0x58,0x00,0x00,0x00,0x00,0xFF};
addr<<=9;
pcmd[1] = ((addr & 0xFF000000) >>24 );
pcmd[2] = ((addr & 0x00FF0000) >>16 );
else
CLR_SD_DI;
value <<=1;
}
}
unsigned char Read_Byte_SD()
{
unsigned char i=0,temp=0;
SET_SD_DO;
for(i=0;i<8;i++)
return(WRITE_BLOCK_ERROR); //Error!
}
//等到SD卡不忙为止
//因为数据被接受后,SD卡在向储存阵列中编程数据
while (Read_Byte_SD()!=0xff);
SET_SD_CS; //禁止SD卡片选
SET_SD_CS; //禁止SD卡片选
Write_Byte_SD(0xff);
return 0;
}
unsigned char SD_Init()
{
unsigned char tmp,time=0;
unsigned char pcmd[]={0x41,0x00,0x00,0x00,0x00,0xff};
unsigned char SD_Reset()
{
unsigned char tmp,time=0,i;
unsigned char pcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
SD_Port_Init(); //初始化驱动端口
Write_Byte_SD(0xff);
return 0;
}
unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)
{
unsigned char temp,time=0;
{
DO_DIR_IN; //设置为输入
CLR_SD_CLK;
SET_SD_CLK;
temp<<=1;
if(SD_DO) temp|=0x01;
// DO_DIR_OUT ;//设置为输出
{ //超过200次
return(INIT_CMD1_ERROR);//CMD0 Error!
}
}
while(tmp!=0); //回应00h,停止写入
Is_Init=0;
SET_SD_CS; //禁止SD卡片选
Write_Byte_SD(0xff);
return(0);//写入成功
}
uchar SD_read_sector(unsigned long addr,uchar *buffer)
{
uchar temp,time=0;
uint i=0;
uchar pcmd[]={0x51,0x00,0x00,0x00,0x00,0xff};
for (i=0;i<0x08;i++) //向SD卡发送6字节命令
{
Write_Byte_SD(*CMD++);
}
//获得16位的回应
Read_Byte_SD(); //read the first byte,ignore it.
}
CLR_SD_CS; //使能SD卡片选
time=0;
do
{ //为了能够成功写入CMD0,在这里写200次
tmp=Write_Command_SD(pcmd);
time++;
SET_SD_CS; //禁止SD卡片选
Is_Init=1; //将初始化标志置1
for (i=0;i<0x0f;i++)
{
Write_Byte_SD(0xff); //发送至少74个时钟信号
do
{ //读取后8位
tmp = Read_Byte_SD();
time++;
}
while((tmp==0xff)&&(time<100));
return(tmp);
}
#include<msp430x54x.h>
#include"SDcard.h"
char Is_Init=0;
void SD_Port_Init()
{
DO_DIR_OUT;
CS_DIR_OUT;
CLK_DIR_OUT;
SET_SD_CLK;
SET_SD_DO;
addr<<=9;
pcmd[1]=((addr&0xff000000)>>24);
pcmd[2]=((addr&0x00ff0000)>>16);
CLR_SD_CS; //使能SD卡片选
do
{
time++;
if(time==200)
{
CLR_SD_CS; //使能SD卡片选
time=0;
do
{ //为了可靠写入,写100次
time++;
if(time==100)
{
return(temp); //send commamd Error!
CLR_SD_CS; //使能SD卡片选
do
{ //为了能够成功写入CMD0,在这里写200次
tmp=Write_Command_SD(pcmd);
time++;
if(time==200)
Write_Byte_SD(0xFF); //CRC Code
temp=Read_Byte_SD();
if((temp & 0x1F)!=0x05) // 写入的512个字节是未被接受
{
SET_SD_CS; //禁止SD卡片选
Read_Byte_SD();
Read_Byte_SD();
SET_SD_CS; //禁止SD卡片选
Write_Byte_SD(0xff);
return 0;
}
Write_Byte_SD(0xFE);
//现在可以写入512个字节
for (i=0;i<512;i++)
{
Write_Byte_SD(*Buffer++);
}
//CRC-Byte
Write_Byte_SD(0xFF); //Dumm
//在写之前先产生100个时钟信号
for (i=0;i<100;i++)
{
Read_Byte_SD();
}
//写入开始字节
{
unsigned char tmp,time=0,i;
SET_SD_CS; //禁止SD卡片选
Write_Byte_SD(0xFF); //发送8个时钟信号
CLR_SD_CS; //使能SD卡片选
return (READ_BLOCK_ERROR);
}
}while(temp!=0);
while(Read_Byte_SD()!=0xfe);
for(i=0;i<512;i++)
{
buffer[i]=Read_Byte_SD();
}
SET_SD_CS;
}
void Write_Byte_SD(uchar value)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (value&0x80)
SET_SD_DI; //Send bit by bit(MSB First)
if(time==200)
{ //超过200次
return(INIT_CMD0_ERROR);//CMD0 Error!
}
}
while(tmp!=1); //回应01h,停止写入
相关文档
最新文档