SD卡读写操作 SD卡电路
SD卡读写
SD卡读写前言长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。
特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。
当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。
在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD 作为存储媒质。
本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。
设计方案应用AT89C52读写SD卡有两点需要注意。
首先,需要寻找一个实现AT89C52单片机与SD卡通讯的解决方案;其次,SD卡所能接受的逻辑电平与AT89C52提供的逻辑电平不匹配,需要解决电平匹配问题。
通讯模式SD卡有两个可选的通讯协议:SD模式和SPI模式。
SD 模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD 卡控制器接口的MCU,或者必须加入额外的SD卡控制单元以支持SD卡的读写。
然而,AT89C52单片机没有集成SD卡控制器接口,若选用SD模式通讯就无形中增加了产品的硬件成本。
在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。
因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。
虽然AT89C52不带SD卡硬件控制器,也没有现成的SPI 接口模块,但是可以用软件模拟出SPI总线时序。
本文用SPI 总线模式读写SD卡。
电平匹配SD卡的逻辑电平相当于3.3V TTL电平标准,而控制芯片AT89C52的逻辑电平为5V CMOS电平标准。
因此,它们之间不能直接相连,否则会有烧毁SD卡的可能。
出于对安全工作的考虑,有必要解决电平匹配问题。
sd卡数据读写流程
SD卡数据读写流程引言SD卡(Secure Digital Card)是一种常用的存储设备,通常用于移动设备、相机等电子产品中。
在使用SD卡时,数据的读写是一个非常重要的过程。
本文将详细介绍SD卡的数据读写流程,包括初始化、文件操作和数据传输等环节。
初始化SD卡初始化SD卡是数据读写的第一步,确保SD卡可以被正确地识别和使用。
下面是SD卡数据读写的初始化流程:1.插入SD卡:将SD卡插入目标设备的SD卡插槽中。
2.电源供给:为SD卡提供稳定的电源,通常通过连接电源线或使用内置电池来实现。
3.延时等待:等待SD卡稳定,一般为几毫秒的时间。
4.发送命令:通过SPI或SDIO等接口向SD卡发送特定的命令,以初始化SD卡。
5.接收响应:SD卡将返回初始化成功与否的响应,如果初始化成功,则可以进行后续的数据读写操作。
SD卡文件系统在进行数据读写之前,需要先设置SD卡的文件系统。
常用的文件系统包括FAT16、FAT32和exFAT等。
下面是SD卡文件系统的设置流程:1.格式化SD卡:使用格式化工具对SD卡进行格式化,以清除原有的文件系统和数据。
2.创建分区:根据需求,可以将SD卡分为一个或多个分区,并设置每个分区的大小。
3.创建文件系统:选择合适的文件系统类型,在分区上创建文件系统,并分配文件系统的容量。
4.分配文件表:文件系统会维护一个文件表,记录文件的位置、大小等信息。
在创建文件系统时,会分配一块空间来存储文件表。
5.设置文件权限:根据需要,可以设置文件的读写、执行权限,以保证文件的安全性。
SD卡数据读写操作SD卡的数据读写操作包括文件的创建、打开、读取、写入和关闭等。
下面是SD卡数据读写操作的详细流程:1.创建文件:通过文件系统接口,调用相关函数创建一个新的文件,并指定文件的名称和路径。
2.打开文件:使用文件系统的函数打开已经存在的文件,以便后续的读取和写入操作。
3.读取文件:通过文件系统提供的函数,在已经打开的文件中进行读取操作。
4根线单片机读写SD卡
还记得刚才说的那 6 字节命令格式吗?【1 字节】(0x40+命令序号)+【4 字】节参 数+【1 字节】CRC 校验码。套用这命令的格式,我们得到如下 SD 卡比较常用的命令串。 读 SD 卡 0 扇区的命令串:{0x51,0x00,0x00,0x00,0x00,0xff};
写 SD 卡 1 扇区的命令串:{0x58,0x00,0x00,0x02,0x00,0xff};
七、 驱动程式
文末了,在本文的文件夹中,有我已经写好的 SD 卡读写驱动。供大家学习使用,程序 写的比较简单。
SD_MMC.C 的文件里有 3 个函数:1、初始化 SD 卡,2、读 SD 卡指定扇区,3、写 SD 卡指定扇区。
初始化 SD 卡函数 SD_INIT():它使 SD 卡进入 SPI 模式并复位。读 SD 卡指定扇区函数 sd_read(),函数的入口是 4 字节 SD 卡地址,用了 unsigned long 数据类型,如果函数返回 1 表示操作成 功,返回 0 则表示操作失败。写 SD 卡指定扇区函数 sd_write(),方式和读 SD 卡指定扇区一样。
SD 卡复位的命令串:{0x40,0x00,0x00,0x00,0x00,0x95};
SD 卡进入 SPI 模式的命令串:{0x41,0x00,0x00,0x00,0x00,0xff};
五、 数据传送
当 SD 卡接收到“读” 命令后,SD 卡会在 MISO 线上回应命令(0x00),其后 SD 卡再向单片机,发送 1 字节的起始字节(0xfe),紧接着发送连续的 512 字节数据。在发送 完这些数据后,还有 2 个字节的 CRC 校验码,也是紧接着发送的。同样,单片机通过 MOSI 线向 SD 卡发送“写 SD 卡” 命令后,单片机需要先读取 SD 卡向 MISO 线上传送的回应数 据(0x00)。当接收到回应后,单片机就可以先发送 1 个字节的起始字节(0xfe)。随后,单 片机再发送 512 字节的 RAM 数据。最后再加上 2 个字节的 CRC 校验码。不过,SD 卡默认 是不对数据进行校验的。也就是说,2 字节校验码可以是任意数据,但一定要发送的。发完 这 515 字节个数据后,SD 卡会又有一个 5 位的回应数据(二进制:XXX00101B)。表示数 据已经写入完毕。
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卡数据读写流程的详细介绍。
在实际应用中,还需要根据具体情况进行合理调整和优化。
SD卡的结构原理和基本读写操作方式
SD卡的结构原理和基本读写操作方式摘要:本文首先介绍了SD Memory Card ( Secure D ig ita l MemoryCard)的基本结构和原理,着重对SD 卡的命令字和操作流程进行介绍。
接着研究了三星32位嵌入式处理器S3C2410与SD 卡硬件接口电路及其对SD卡的基本读写操作方式。
1 引言SD卡( Secure DigitalMemory Card)是一种基于Flash的新一代存储器,它着重数据存储的安全、容量和性能,是许多便携式电子产品如数码相机、手提电话, PDA 等理想的外部存储介质。
2 SD的基本概念2. 1 SD的通信协议SD卡系统可以在两种通信协议下工作: SD协议和SP I协议。
用户可以在硬件初始化时自由选择SD卡系统的通信协议。
对于特定的硬件电路,用户只需使用一种通信协议即可。
本文根据笔者的硬件,仅讨论最常用的SD协议。
2. 2 SD数据传输方式SD支持两种数据传输方式: 1 - bit方式(标准总线)和4- bit方式(宽总线)。
在1 - bit方式下,数据仅仅在数据线0(DAT[ 0 ])上传输。
在4 - bit方式下,数据在4 根数据线(DAT[ 3: 0 ])上同时传输。
在4 - bit数据传输方式下,最高的数据传输速率可达100Mb / sec。
表1列出了在两种方式下SD接口信号的定义。
上电后,缺省状态下系统工作于1 - bit方式。
在SD卡处于传输状态时,用户可以自由地更改为1 - bit或4 - bit方式。
2. 3 SD 通信原理SD总线是一个星型的总线结构,系统中允许有一个主控器,最多可达十个从设备( SD卡)。
在系统初始化时,主控器分别为每一个设备分配一个设备地址,此后主控器就可以根据此设备地址独立操作该设备。
SD总线通信是基于命令和数据位流的,每一个数据流都包括一个起始位和一个结束位。
每一个SD命令表征一个卡操作的开始。
SD命令由命令线(CMD)进行传输。
SD卡的读取(SPI)
SPI模式下MCU对SD卡的控制及操作命令一、前言SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制单元以支持SD 卡的读写然而,大多数MCU都没有集成SD 卡控制器接口,若选用SD 模式通讯就无形中增加了产品的硬件成本。
在SD卡数据读写时间要求不是很严格的情况下,选用 SPI模式可以说是一种最佳的解决方案因为在 SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用 SPI模式对 SD卡进行读写操作可大大简化硬件电路的设计二、硬件电路实现以NXP的LPC2210 ARM7MCU为例,下图是周立功开发的实现板电路这里,将LPC2210MCU的SPI0用于SD卡的控制和数据读写。
对SPI0的两个数据线加了上拉电阻以便于MMC卡兼容。
卡供电采用了可控方式,通过GPIO口控制MOS管对其进行供电。
卡检测电路也使用GPIO口实现。
通过读GPIO口数据,检查卡是否写保护和完全插入。
具体内容可以参考周立功的说明书,百度文库里边有三、SD卡物理接口我们看到的SD卡一包如下所示,包含9个引脚和一个写保护开关:其引脚定义如下:注:1. S:电源;I:输入;O:推挽输出;PP:推挽I/O。
2. 扩展的DAT线(DAT1 ~ DAT3)在上电后处于输入状态。
它们在执行SET_BUS_WIDTH命令后作为DAT线操作。
当不使用DAT1 ~ DAT3 线时,主机应使自己的DAT1~DAT3线处于输入模式。
这样定义是为了与MMC卡保持兼容。
3. 上电后,这条线为带50KΩ上拉电阻的输入线(可以用于检测卡是否存在或选择 SPI 模式)。
用户可以在正常的数据传输中用 SET_CLR_CARD_DETECT(ACMD42)命令断开上拉电阻的连接。
单片机读写SD卡分析陈
单片机读写SD卡分析一、开篇二、硬件电路三、SPI操作1.初始化2.读3.写四、SD操作1.初始化2.读3.写五、FAT文件系统六、总结三、SPI操作1、SPI总线简介SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,20世纪80年代由Motorola 首先在其MC68HCXX系列处理器上定义的。
SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
其主要特点包括:可以同时发出和接受串行数据;可以作为主机或丛机工作;发送结束中断标志;写冲突保护;总线竞争保护。
图1是SPI总线架构示意图。
图1 SPI 总线架构基本特点:1.同步2.串行3.全双工4.非即插即用5.一主多从更多细节:1.同步时钟有主控芯片产生,每个时钟传输一位数据2.数据在传输前,首先要进行并转串,才能用一条线传输3.两条数据线,一条输入、一条输出4.主从双方有关于SPI传输的先验知识,如比特顺序、数据长度等5.数据传输有主控芯片发起,每次只与一个从芯片通讯SPI是一种同步全双工的通讯接口,每个时钟在两条数据线上各传输一比特数据。
SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。
工作模式:原理上讲,串行传输是按位传输方式,只利用一条信号线进行传输SPI由工作方式的不同,可分为两种模式:主模式和从模式 1).主模式将Master的数据传送给Slave,8位数据传送,传送完毕,申请中断2).从模式从控制器从SIMO引脚接收串行数据并把数据移入自身移位寄存器的最低位或最高位。
单片机读写SD卡电路设计
单片机读写SD卡电路设计单片机读写SD卡电路设计【摘要】本文设计了单片机读写SD卡电路,从硬件设计到软件实现的过程。
本文以STC32为例,描述了设计工作原理,并给出连接图和程序。
【关键字】SD卡单片机1引言安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写PDA)和多媒体播放器等。
2SD卡SD卡就是SecureDigitalCard--安全数码卡,是由日本松下公司,东芝公司和美国SANDISK公司1999年8月共同开发研制的,具有大容量,高性能,尤其是安全等多种特点的多功能存储卡。
3系统设计方案系统硬件组成本设计硬件电路采用的整体结构如图1所示。
RS232—HOST(单片机)—SD 卡。
其中单片机采用流行的stc32,降低生产成本,串行接口RS232为标准3线制。
由稳定电压器供给5V电压,单片机通过SPI总线:时钟、输入、输出、片选4个I/O接口控制SD卡的读写操作。
由于SD卡的供电电压为3.3V,所以我采用了LM317对SD卡提供3.3V的电压。
SD的输入输出电压电平是3.3V的,而单片机的4个I/O接是5V的TTL电平,所以采用了74LVX4245电平转换驱动芯片,对SD卡的数据传输进行驱动。
当上电后,直接给单片机提供5V工作电压,通过LM317电压转换给SD卡提供3.3V工作电压。
单片机通过复位键对SD卡进行读写控制,单片机对SD卡不断发出数据,同时SD卡的DataOutI/O接口把数据发送给单片机。
实现单片机对SD卡的一次读写操作。
4系统程序设计4.1SD卡模态选择SD卡在工作时有两种总线模式:SD总线模式和SPI总线模式。
两种模式下。
SD卡读写的方式(用SD模式)
SD卡读写的方式(用SD模式)大家读写SD卡怎么不用SD模式方式读取,是SPI方式读取简单?下面贴一段代码,是在FPGA上程序,只能用SD模式进行读,没有文件系统,没有用AVR硬件实现,电路图:电路说明,SD_DAT3一直给高电平程序:#ifndef __SD_Card_H__#define __SD_Card_H__#define High 1#define Low 0//-------------------------------------------------------------------------// SD Card Set I/O Direction#define SD_CMD_IN DDRX.1 = Low#define SD_CMD_OUT DDRX.1 = High#define SD_DAT_IN DDRX.2 = Low#define SD_DAT_OUT DDRX.2 = High#define SD_CLK_OUT DDRX.3 = High#define SD_DAT3_OUT DDRX.0 = High// SD Card Output High/Low#define SD_CMD_LOW PORTX.1 = Low#define SD_CMD_HIGH PORTX.1 = High#define SD_DAT_LOW PORTX.2 = Low#define SD_DAT_HIGH PORTX.2 = High#define SD_CLK_LOW PORTX.3 = Low#define SD_CLK_HIGH PORTX.3 = High#define SD_DAT3_HIGH PORTX.0 = High// SD Card Input Read#define SD_TEST_CMD PINX.1#define SD_TEST_DAT PINX.2//------------------------------------------------------------------------- #define BYTE unsigned char#define UINT16 unsigned int#define UINT32 unsigned long//------------------------------------------------------------------------- void Ncr(void);void Ncc(void);BYTE response_R(BYTE);BYTE send_cmd(BYTE *);BYTE SD_read_lba(BYTE *,UINT32,UINT32);BYTE SD_card_init(void);//------------------------------------------------------------------------- BYTE read_status;BYTE response_buffer[20];BYTE RCA[2];BYTE cmd_buffer[5];const BYTE cmd0[5] = {0x40,0x00,0x00,0x00,0x00};const BYTE cmd55[5] = {0x77,0x00,0x00,0x00,0x00};const BYTE cmd2[5] = {0x42,0x00,0x00,0x00,0x00};const BYTE cmd3[5] = {0x43,0x00,0x00,0x00,0x00};const BYTE cmd7[5] = {0x47,0x00,0x00,0x00,0x00};const BYTE cmd9[5] = {0x49,0x00,0x00,0x00,0x00};const BYTE cmd16[5] = {0x50,0x00,0x00,0x02,0x00};const BYTE cmd17[5] = {0x51,0x00,0x00,0x00,0x00};const BYTE acmd6[5] = {0x46,0x00,0x00,0x00,0x02};const BYTE acmd41[5] = {0x69,0x0f,0xf0,0x00,0x00};const BYTE acmd51[5] = {0x73,0x00,0x00,0x00,0x00};//------------------------------------------------------------------------- void Ncr(void){SD_CMD_IN;SD_CLK_LOW;SD_CLK_HIGH;SD_CLK_LOW;SD_CLK_HIGH;}//------------------------------------------------------------------------- void Ncc(void){int i;for(i=0;i<8;i++){SD_CLK_LOW;SD_CLK_HIGH;}}//------------------------------------------------------------------------- BYTE SD_card_init(void){BYTE x,y;SD_CMD_OUT;SD_DAT_IN;SD_CLK_HIGH;SD_CMD_HIGH;SD_DAT_LOW;read_status=0;for(x=0;x<40;x++)Ncr();for(x=0;x<5;x++)cmd_buffer[x]=cmd0[x];y = send_cmd(cmd_buffer);do{for(x=0;x<40;x++);Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd55[x];y = send_cmd(cmd_buffer);Ncr();if(response_R(1)>1) //response too long or crc errorreturn 1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=acmd41[x];y = send_cmd(cmd_buffer);Ncr();} while(response_R(3)==1); Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd2[x];y = send_cmd(cmd_buffer); Ncr();if(response_R(2)>1) return 1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd3[x];y = send_cmd(cmd_buffer); Ncr();if(response_R(6)>1) return 1;RCA[0]=response_buffer[1]; RCA[1]=response_buffer[2]; Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd9[x]; cmd_buffer[1] = RCA[0]; cmd_buffer[2] = RCA[1];y = send_cmd(cmd_buffer); Ncr();if(response_R(2)>1) return 1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd7[x]; cmd_buffer[1] = RCA[0];cmd_buffer[2] = RCA[1];y = send_cmd(cmd_buffer);Ncr();if(response_R(1)>1)return 1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd16[x];y = send_cmd(cmd_buffer);Ncr();if(response_R(1)>1)return 1;read_status =1; //sd card readyreturn 0;}//------------------------------------------------------------------------- BYTE SD_read_lba(BYTE *buff,UINT32 lba,UINT32 seccnt) {BYTE c=0;UINT32 i,j;lba+=101;for(j=0;j<seccnt;j++)< p="">{{Ncc();cmd_buffer[0] = cmd17[0];cmd_buffer[1] = (lba>>15)&0xff; cmd_buffer[2] = (lba>>7)&0xff; cmd_buffer[3] = (lba<<1)&0xff; cmd_buffer[4] = 0;lba++;send_cmd(cmd_buffer); Ncr();}while(1){SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_DAT)) break;}for(i=0;i<512;i++) {BYTE k;for(k=0;k<8;k++){SD_CLK_LOW;SD_CLK_HIGH;c <<= 1;if(SD_TEST_DAT)c |= 0x01;}*buff=c;buff++;}for(i=0; i<16; i++) {SD_CLK_LOW;SD_CLK_HIGH;}}read_status = 1; //SD data next inreturn 0;}//------------------------------------------------------------------------- BYTE response_R(BYTE s){BYTE a=0,b=0,c=0,r=0,crc=0;BYTE i,j=6,k;while(1){SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_CMD))break;if(crc++ >100)return 2;}crc =0;if(s == 2)j = 17;for(k=0; k<="" p="">{c = 0;if(k > 0) //for crc culcarb = response_buffer[k-1];for(i=0; i<8; i++){SD_CLK_LOW;if(a > 0)c <<= 1;elsei++;a++;SD_CLK_HIGH;if(SD_TEST_CMD)c |= 0x01;if(k > 0){crc <<= 1;if((crc ^ b) & 0x80)crc ^= 0x09;b <<= 1;crc &= 0x7f;}}if(s==3){if( k==1 &&(!(c&0x80)))r=1;}response_buffer[k] = c;}if(s==1 || s==6){if(c != ((crc<<1)+1))r=2;}return r;}//------------------------------------------------------------------------- BYTE send_cmd(BYTE *in) {int i,j;BYTE b,crc=0;SD_CMD_OUT;for(i=0; i < 5; i++){b = in[i];for(j=0; j<8; j++){SD_CLK_LOW;if(b&0x80)SD_CMD_HIGH;elseSD_CMD_LOW;crc <<= 1;SD_CLK_HIGH;if((crc ^ b) & 0x80)crc ^= 0x09;b<<=1;}crc &= 0x7f;}crc =((crc<<1)|0x01);b = crc;for(j=0; j<8; j++){SD_CLK_LOW;if(crc&0x80)SD_CMD_HIGH;elseSD_CMD_LOW;SD_CLK_HIGH;crc<<=1;}return b;}//-------------------------------------------------------------------------#endif这些程序有些我也不明白,贴出来希望大家一起探讨交流,打破网站SD卡用SPI方式读写的垄断局面,哈哈sd模式下应该有4各data吧,怎么你的只用一个?SPI模式是1Bit的SD模式是1Bit或4BitSD卡确实也像USB一样分为全速(FULL-SPEED)卡和低速卡(LOW-SPEED)。
内存卡的工作原理
内存卡的工作原理
内存卡是一种用于存储数据的电子设备,常见的有SD卡、TF 卡等。
它的工作原理可以简单描述如下:
1. 存储单元:内存卡的存储单元是由许多闪存芯片组成的。
这些闪存芯片内部有大量的存储单元,通常是由浮动栅电容或浮动栅电晕管来存储电荷。
每个存储单元可以存储一定的二进制信息(0或1)。
2. 控制电路:内存卡中还有一个控制电路,负责与主机(如相机、手机等)进行通信,并控制存储单元的读写操作。
3. 存储操作:当主机需要读取内存卡中的数据时,控制电路会通过总线将指令发送给内存芯片,告诉它要读取哪个地址的数据。
内存芯片会根据指令找到相应的存储单元,并将数据读取出来反馈给控制电路,再由控制电路传递给主机。
4. 写入操作:当主机需要向内存卡写入数据时,控制电路会将数据传递给内存芯片的指定存储单元,并通过一系列操作将数据写入。
5. 数据保持:内存卡的数据可以长时间保存,即使断电也不会丢失。
这是由于闪存芯片的存储单元使用特殊的物理结构来实现数据的长期保持,而不需要持续的电力支持。
总的来说,内存卡的工作原理是通过控制电路与存储单元进行读写操作,并利用闪存芯片的特殊结构来实现数据的存储和保
持。
它在各种电子设备中被广泛应用,如数码相机、手机、平板电脑等。
SD卡存储采集数据电路设计
SD卡存储采集数据电路设计引言:随着现代科技的发展,数据采集和存储变得越来越重要。
SD卡存储采集数据电路是一种常用的数据采集和存储解决方案。
本文将从硬件电路设计的角度,为大家介绍SD卡存储采集数据电路的设计原理与方法。
一、设计目标与需求分析1.设计目标:设计一个可靠、高效的SD卡存储采集数据电路,可以用于各种数据采集和存储应用场景。
2.需求分析:(1)采集数据的接口要与主控芯片兼容,能够稳定、准确地接收来自主控芯片的数据;(2)实现SD卡存储数据的读写功能,包括数据的写入和读取;(3)设计具备错误检测与纠正功能,确保数据的可靠性;(4)电路设计要尽量简洁,兼顾成本和性能。
二、设计原理与方法1.硬件接口设计将SD卡存储采集数据电路与主控芯片连接,需要根据SD卡的接口标准设计对应的硬件接口。
SD卡的接口标准包括SPI和SDIO两种,根据具体应用需求选择相应的接口。
2.数据采集与存储设计(1)数据采集:通过与主控芯片的接口通信,实现数据的采集。
根据采集数据的类型,选择相应的传感器或模拟电路设计采集电路。
(2)数据存储:将采集到的数据经过适当的处理后,通过硬件电路将数据写入SD卡中。
SD卡存储数据采用的是FAT文件系统,需要根据SD卡的文件系统规范进行数据的写入和读取操作。
3.错误检测与纠正设计为了保证数据的可靠性,需要设计错误检测与纠正的功能。
主要包括数据校验和ECC纠错码的设计。
数据校验可以采用CRC校验或其他校验算法,通过对数据进行校验,可以检测出数据传输过程中的错误。
而ECC纠错码可以在数据写入SD卡时对数据进行编码与解码,以纠正和恢复部分错误数据。
4.电路设计根据以上原理与需求分析,进行电路设计。
具体的设计包括SD卡接口电路的设计、数据采集电路的设计、数据存储电路的设计和错误检测与纠正电路的设计。
对于电路设计应尽量简练,兼顾成本和性能。
三、设计实现与测试验证1.实施设计根据上述设计原理与方法,进行电路设计。
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卡的读写过程中,需要采取一定的措施保护数据。
SD卡硬件原理图及其读写程序
SD卡硬件原理图及其读写程序2011-03-28 17:45转载自sail_007最终编辑sail_007 最近开始整理以前画过原理图和程序今天先整理出了SD卡的硬件和SPI方式的读写程序。
今后会陆续写把DS1302时钟芯片GPRS模块CAN总线通信PWM数控电压也整理出来。
一方面是想帮自己总结一下另外如果还能帮助到其他的单片机爱好者那也就更好了。
当然水平有限整理出来的东西可能也有许多错误的地方也请高手能指出不胜感激。
先发张SD卡的原理图。
说明我用的是5V单片机SD卡则是3.3v如果直接连接引脚长期使用会影响SD卡寿命。
我一开始选用了普通的光耦触发可能是导通速率不够快无法实现SPI通信后来我就改用9013就行了。
下图上US1是SD卡壳其实1到9引脚对应了SD卡的9个引脚10号引脚是卡插入标志也就是说当有SD卡插入时10号引脚会接3.3v的地这样单片机就可以查询是否有卡了。
在SPI总线模式下CS为主控制器向卡发送的片选信号SCLK为主控制器向卡发送的时钟信号INDataIn为主控制器向卡发送的单向数据信号MISODataOut为卡向主控制器发送的单向数据信号。
程序如下说明我用的是freescale的DP256单片机该单片机有SPI 设备接口只要将其初始化成功便可完成通信设置。
uchar CMD0RespCMD1RespCMD59RespCMD16RespCMD9RespC MD17RespCMD24RespCMD58Resp void SD_Initializevoiduchar csdbuf16TempValue ucharcmdparam4recbuf600resp4resptype uchar sendbuf600 ulong len ulong i ulong BlockAdd SD_InsertDetect Pim.pts.bit.pts70 //cs0 SD_SPIDelay25 Pim.pts.bit.pts71 //cs1 SD_SPIDelay2Pim.ddrs.bit.ddrs70 //pin cs direction Spi0.spicr1.bit.spe0 //spi enable Pim.ddrs.bit.ddrs71 //pin cs directionPim.pts.bit.pts70//cs0 Spi0.spibr.byte0x02 //8MHz31.25kHz0x07-0x00 Spi0.spicr1.bit.mstr1 //master modeSpi0.spicr1.bit.ssoe1 //ss output enable Spi0.spicr1.bit.cpol0//cpol0 //cpol1 070215 Spi0.spicr1.bit.cpha0 //cpha0Spi0.spicr2.byte0x18 //normal drive input pullup TempValueSpi0.spisr.byte//clear SPIF first step TempValueSpi0.spidr.byte//clear SPIF second stepSpi0.spicr1.bit.spe1 //spi enable CMD0RespSD_ResetSDCMD1RespSD_ActiveInit whileCMD1Resp0x01CMD1RespSD_ActiveInit 白开水易拉罐主页博客相册个人档案好友i贴吧看看Ta是谁吧页码1/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.htmlvoid SD_SPIDelayuint value uint i for i 0 i valuei SPI_SendByte0xFF // 发送0xFF clock out 0xFF uchar SD_ResetSDvoid uchar param4 0000respSD_SendCmdCMD0 param SD_R1 resp return resp / 函数名称:void SPI_SendByte Name: void SPI_SendByte 功能描述: 通过SPI接口发送一个字节Function: send a byte by SPI interface 输入: INT8U byte: 发送的字节Input: INT8U byte: the byte that will be send 输出: 无Output: NULL / voidSPI_SendByteuchar byte uchar TempValue Spi0.spidr.byte byte / 发送数据放入SPI数据寄存器/ while0 Spi0.spisr.byte 0x80 / 等待SPIF置位即等待数据发送完毕/ / wait for SPIF being set that is wait for finishing of data being send / TempValueSpi0.spidr.byte / 函数名称: INT8U SPI_RecByte Name:INT8U SPI_RecByte 功能描述: 从SPI接口接收一个字节Function: receive a byte from SPI interface 输入: 无Input: NULL 输出: 收到的字节Output: the byte that be received / uchar SPI_RecBytevoid uint ReadCounter ReadCounter0Spi0.spidr.byte 0xFF while0 Spi0.spisr.byte 0x80 / 等待SPIF 置位即等待收到数据/ ReadCounter ifReadCounter25 break / wait for SPIF being set that is wait for being received data / returnSpi0.spidr.byte / 读取收到的字节read the byte received / / 函数名称: //INT8U SD_SendCmd Name: INT8USD_SendCmd 功能描述: 向卡发送命令并取得响应Function: send command to the cardand get a response 输入: INT8U cmd : 命令字Input: INT8U cmd : command byteINT8U param : 命令参数长度为4字节INT8U param :command parameterlength is 4 bytes INT8U resptype : 响应类型INT8U resptype: response type INT8U resp : 响应长度为1-5字节INT8U resp : responselength is 1-5 bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / voidSD_SendCmduchar cmd uchar paramuchar resptype uchar resp long irlen uchar tmp Pim.pts.bit.pts70//cs0 SPI_SendBytecmd0x3F 0x40 / 发送命令头和命令字send command header and word / for i 3 i 0 i-- SPI_SendByteparami / 发送参数send parameters / SPI_SendByte0x95 / CRC校验码只用于第1个命令CRConly used for the first command / rlen 0 switch resptype / 根据不同的命令得到不同的响应长度/ / according various commandget the various response length / case 1: rlen 1 break case 2: rlen 2 break case 4: rlen 5 break default:SPI_SendByte0xFF Pim.pts.bit.pts71 break i 0 do / 等待响应响应的开始位为0 / / Wait for a responsea response is a start bitzero / tmp SPI_RecByte i while tmp 0x80 0 iSD_CMD_TIMEOUT for i rlen - 1 i 0 i-- respi tmp tmpSPI_RecByte / 循环的最后发送8clock at the last recycleclock out 8 clock / Pim.pts.bit.pts71//cs1 // return SD_NO_ERR //new statement 页码2/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html/ 函数名称: INT8U SD_ReadBlockName: INT8U SD_ReadBlock 功能描述: 从SD卡中读一个块Function: read a single block from sd card 输入: INT32U blockaddr: 块地址Input: INT32U blockaddr: address of block INT8U recbuf : 接收缓冲区长度512Bytes INT8U recbuf : the buffer of receivelength is 512Bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / uchar SD_ReadBlockulong blockaddr uchar recbuf uchar param4resp // if blockaddrsds.block_num // return SD_ERR_OVER_CARDRANGE / 操作超出卡容量范围operate over the card range /SD_PackParamparam blockaddr / 将参数转化为字节形式change the parameter to bytes form / SD_SendCmdCMD17 param SD_R1 resp SD_ReadBlockDataSD_BLOCKSIZE recbuf/ 读出数据read data from sd card / return resp / 函数名称: INT8U SD_ReadBlockData Name: INT8USD_ReadBlockData 功能描述: 从SD卡中读取数据块Function: read block data from sd card 输入: INT32U len : 长度Input: INT32U len : length INT8U recbuf : 接收缓冲区INT8U recbuf : the buffer of receive 输出: 0: 正确0: 错误码Output: 0: right 0: error code / voidSD_ReadBlockDataulong len uchar recbuf uchar tmp ulong i 0 Pim.pts.bit.pts70//cs0 do / 等待接收数据开始令牌0xFE wait for receiving data start token 0xFE / tmp SPI_RecByte iwhiletmp 0xFF i SD_CMD_TIMEOUT for i 0 i len i recbufi SPI_RecByte / 接收数据receive data / i SPI_RecByte i i 0:错误码Output: 0: right 0: error code ucharSD_SetBlockLenulong length uchar param4respretSD_PackParamparam length //将参数转化为字节形式change the parameter to bytes form SD_SendCmdCMD16 paramSD_R1 resp return resp / / 函数名称: void SD_PackParam Name: void SD_PackParam 功能描述: 将32位的参数转为字节形式Function: change 32bit parameter to bytes form 输入: INT8U parameter: 字节参数缓冲区Input: INT8U parameter: the buffer of bytes parameter INT32U value : 32位参数INT32U value : 32bit parameter 输出: 无Output: NULL / void SD_PackParamuchar parameter ulong value valuevalue512 parameter3 ucharvalue 24 parameter2 ucharvalue 16 parameter1 ucharvalue 8 parameter0 ucharvalue / 函数名称: INT8USD_WriteBlock Name: INT8U SD_WriteBlock 功能描述: 向SD卡中写入一个块Function: write a block to sd card 输入: INT32U blockaddr: 块地址Input: INT32U blockaddr: address of block INT8U sendbuf : 发送缓冲区长度512Bytes INT8U sendbuf : the buffer of sendlength is 512Bytes 输出: 0: 正确0: 错误码Output: 0: right 0: error code / ucharSD_WriteBlockulong blockaddr uchar sendbuf 页码3/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html uchar param4resprettmp2 ulong i // if blockaddr sds.block_num // returnSD_ERR_OVER_CARDRANGE / 操作超出卡容量范围operate over the card range / SD_PackParamparam blockaddr / 将参数转化为字节形式change the parameter to bytes form / SD_SendCmdCMD24 param SD_R1 resp / 写单块命令write single block / SD_WriteBlockData0 SD_BLOCKSIZE sendbuf / 写入数据write data / return resp / 函数名称: INT8USD_WriteBlockData Name: INT8U SD_WriteBlockData 功能描述: 向sd卡写数据块Function: write block data to sd card 输入: INT8U bmulti : 是否为多块操作1:是0:否Input:INT8U bmulti : multi blocks operate 1:Y 0:N INT32U len : 长度INT32U len : length INT8U sendbuf: 发送缓冲区INT8U sendbuf : the buffer of send 输出: 0: 正确0: 错误码Output: 0: right 0: error code / void SD_WriteBlockDatauchar bmulti ulong len uchar sendbuf uint i uchar tmp Pim.pts.bit.pts70//cs0 SPI_SendByte0xFF / 开始发送数据之前发送8个clock clock out 8 clk before start / if bmulti 1SPI_SendByteSD_TOK_WRITE_STARTBLOCK_M / 写多块开始令牌start token of write multi blocks / elseSPI_SendByteSD_TOK_WRITE_STARTBLOCK / 写单块开始令牌start token of write single block / for i 0 i len iSPI_SendBytesendbufi / 发送数据send data / SPI_SendBytei 8 0xFF SPI_SendBytei 0xFF / 发送CRC16校验码send CRC16 check code / tmp SPI_RecByte Pim.pts.bit.pts71//cs1 SD_WaitBusy void SD_WaitBusy uchar tmpiPim.pts.bit.pts70//cs0 i0 do / 等待忙结束wait for being busy end / tmp SPI_RecByte i while tmp 0xFF i 10000 / 忙时收到的值为0xFF always receive 0xFF when card is busy /Pim.pts.bit.pts71//cs1 / 函数名称: void SD_HardWareInit Name: void SD_HardWareInit 功能描述: 初始化访问SD卡的硬件条件Function: initialize the hardware condiction that access sd card 输入: 无Input: NULL 输出: 无Output: NULL / uchar SD_InsertDetect uchar InflagifPim.ptp.bit.ptp30//sd insert Inflag1 else Inflag0 return Inflag 类别默认分类添加到搜藏分享到i贴吧浏览57 评论0 上一篇sd卡的读写转下一篇一般SD卡和SDHC卡读写函数 .c -... 最近读者网友评论发表评论姓名哦没他发内容插入表情▼ 闪光字页码4/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html 同时将此文章分享给好友验证码请点击后输入四位验证码字母不区分大小写发表评论�0�82011 Baidu看看Ta是谁吧页码5/5Ww2011/6/26/wolf9s/blog/item/47e2a620 212d80268744f98c.html。
SD卡的读写和加解密
查看文章SD卡的读写和加解密2007-06-13 07:04SD卡的读写和加解密一、概述SD卡全称为Secrue Digital Memory Card,具有轻巧、可加密、传输速度高、适用于手持设备使用等优点。
二、总线接口SD需要高速读写,同时也要使手持等嵌入式设备能方便使用,特设有两个访问接口中:SD 模式接口和SPI接口。
SD卡在上电初期,卡主控通过检测引脚1(DA T3)来决定使用SD 模式还是SPI模式。
当此脚接50KOhm上拉电阻时,卡进入SD模式;当此脚为低电平,卡则工作于SPI模式。
SD引脚SD模式SPI模式1 DA T3 CS2 CMD DI3 VSS VSS4 VDD VDD5 CLK SCLK6 VSS VSS7 DA T0 DO8 DA T1 Resvered9 DA T2 Resvered表1:SD卡接口定义1、SPI接口SPI接口是为嵌入式和手持设备准备的,只使用普通的三线制SPI总线,即可对卡进行一般的慢速的读写等操作。
图一:SPI总线如上图,由读卡器到卡的数据,在每个时种的上升沿把DO的数据锁存到卡主控,而卡的数据则在每个CLK的上升沿把DI的数据读入读卡器。
2、SD接口SD接口是为高速专有设备而设计,使设备能对卡进行高速可靠的传输而设计,因SD模式在每个命令及数据转输时,都必须具有正确的CRC校验。
因此,此模式下主机一般需要专门设计的硬件模块以产生CRC校验。
在此模式下,SD卡具有四根数据线,且时种速度最大可达50MHz,所以此模式下数据传输速率比SPI模式快得多。
三、总线协议SD卡命令共分为12类,分别为class0到class11,不同的卡主控根据其功能,支持不同的命令集。
主要如下:class0:卡的识别、初始化命令集。
class2:读卡命令集class4:写卡命令集class7:卡的锁定,解锁功能命令集SD卡只有唯一的主机,所有命令是由主机发出。
总线上可传输三种类型数据,分别是命令帧、响应、数据。
sd卡典型电路 -回复
sd卡典型电路-回复SD卡典型电路SD卡(Secure Digital,安全数字存储卡)是一种便携式存储设备,被广泛应用于各种电子设备中,如数码相机、手机、平板电脑等。
SD卡的电路设计是非常重要的,它关系到SD卡的性能和稳定性。
在本文中,我们将一步一步地回答关于SD卡典型电路的问题。
第一步:了解SD卡的工作原理在深入了解SD卡的电路之前,我们首先需要了解SD卡的工作原理。
SD 卡由控制器和存储芯片组成。
控制器负责与主机设备进行通信,并控制存储芯片的数据读写操作。
存储芯片负责存储和读取数据。
SD卡采用SPI (串行外围设备接口)或SDIO(SD输入/输出)接口与主机设备进行通信。
第二步:SD卡电路的主要组成部分SD卡的电路主要包括电源管理电路、信号接口电路和控制器电路。
1. 电源管理电路:SD卡需要一个稳定的电源供应。
电源管理电路负责将主机设备的电源供应转换为适合SD卡工作的电压。
此外,电源管理电路还负责为控制器和存储芯片提供所需的电源。
2. 信号接口电路:SD卡与主机设备通信的接口电路是非常关键的。
对于SPI接口的SD卡,信号接口电路会将SPI接口信号进行转换和适配,以便与主机设备进行通信。
对于SDIO接口的SD卡,信号接口电路会解码主机设备发送的指令,并将数据读写操作传输到正确的存储芯片。
3. 控制器电路:控制器电路是SD卡的核心。
它负责控制存储芯片的数据读写操作,并与主机设备进行通信。
控制器电路还负责执行文件系统管理、错误校验和纠正等功能,确保数据的完整性和可靠性。
第三步:SD卡电路中的重要元件和设计考虑因素在设计SD卡电路时,需要考虑以下重要元件和设计考虑因素:1. 电源管理芯片:选择合适的电源管理芯片可以确保稳定的电源供应和有效的电池管理。
这对于SD卡的长时间使用和性能稳定性非常重要。
2. 高速时钟发生器:SD卡的通信速率越高,数据传输速度就越快。
选择适合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卡要进行块操作的起始块号和块数。
sd卡mos管开关电路
sd卡mos管开关电路
SD卡(Secure Digital card)是一种高容量、非挥发性存储卡,常用于移动设备和摄影器材中。
与SD卡关联的MOS管开关
电路指的是在SD卡接口中使用的MOS(金属氧化物半导体)管来完成电路的开关控制。
MOS管是一种常用的半导体器件,它具有高的开关速度和低
的导通电阻。
在SD卡中,MOS管常用于控制数据传输线路
的开关,以实现读写数据的功能。
在SD卡接口电路中,通常会使用多个MOS管来控制不同的
信号线路,如数据线、时钟线等。
通过控制MOS管的导通和
截止状态,可以实现数据的读取和写入操作。
SD卡插上电源后,通过发送不同的命令和控制信号,控制
SD卡接口电路中相应的MOS管开关动作。
例如,读数据时,控制MOS管导通连接数据线路,将存储器中的数据传输到主
设备;写数据时,控制MOS管导通将主设备中的数据传输到
存储器。
总之,SD卡和MOS管开关电路结合起来,实现了SD卡的读
写功能,提供了高速、稳定的数据存储和传输解决方案。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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卡自身有完备的命令系统,以实现各项操作。
命令格式如下:命令的传输过程采用发送应答机制,过程如下:每一个命令都有自己命令应答格式。
在SPI模式中定义了三种应答格式,如下表所示:写命令的例程://----------------------------------------------------------------------------------------------- 向SD 卡中写入命令,并返回回应的第二个字节//-----------------------------------------------------------------------------------------------unsigned char Write_Command_SD(unsigned char *CMD){unsigned char tmp;unsigned char retry=0;unsigned char i;SPI_CS=1; //禁止SD卡片选Write_Byte_SD(0xFF); //发送8个时钟信号SPI_CS=0; //使能SD卡片选//向SD卡发送6字节命令for (i=0;i<0x06;i++){Write_Byte_SD(*CMD++);}//获得16位的回应Read_Byte_SD(); //read the first byte,ignore it.do{ //读取后8位tmp = Read_Byte_SD();retry++;}while((tmp==0xff)&&(retry<100));return(tmp);}2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。
在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。
在初始化成功后,应尽量提高SPI的速率。
在刚开始要先发送至少74个时钟信号,这是必须的。
在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。
随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程://-------------------------------------------------------------------------- 初始化SD卡到SPI模式//-------------------------------------------------------------------------- unsigned char SD_Init(){unsigned char retry,temp;unsigned char i;unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}; SD_Port_Init(); //初始化驱动端口Init_Flag=1; //将初始化标志置1for (i=0;i<0x0f;i++){Write_Byte_SD(0xff); //发送至少74个时钟信号}//向SD卡发送CMD0retry=0;do{ //为了能够成功写入CMD0,在这里写200次temp=Write_Command_SD(CMD);retry++;if(retry==200){ //超过200次return(INIT_CMD0_ERROR);//CMD0 Error!}}while(temp!=1); //回应01h,停止写入//发送CMD1到SD卡CMD[0] = 0x41; //CMD1CMD[5] = 0xFF;retry=0;do{ //为了能成功写入CMD1,写100次temp=Write_Command_SD(CMD);retry++;if(retry==100){ //超过100次return(INIT_CMD1_ERROR);//CMD1 Error!}}while(temp!=0);//回应00h停止写入Init_Flag=0; //初始化完毕,初始化标志清零SPI_CS=1; //片选无效return(0); //初始化成功}3)读取CIDCID寄存器存储了SD卡的标识码。
每一个卡都有唯一的标识码。
CID寄存器长度为128位。
它的寄存器结构如下://WYF:16字节*8位= 128位它的读取时序如下:与此时序相对应的程序如下://------------------------------------------------------------------------------------读取SD卡的CID寄存器16字节成功返回0//-------------------------------------------------------------------------------------unsigned char Read_CID_SD(unsigned char *Buffer){//读取CID寄存器的命令unsigned char CMD[] = {0x4A,0x00,0x00,0x00,0x00,0xFF};unsigned char temp;temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytesreturn(temp);}4)读取CSD //WYF:共16字节,128位CSD(Card-Specific Data)寄存器提供了读写SD卡的一些信息。
其中的一些单元可以由用户重新编程。
具体的CSD结构如下:读CSD的时序:相应的程序例程如下://-----------------------------------------------------------------------------------------读SD卡的CSD寄存器共16字节返回0说明读取成功//-----------------------------------------------------------------------------------------unsigned char Read_CSD_SD(unsigned char *Buffer){//读取CSD寄存器的命令unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};unsigned char temp;temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytesreturn(temp);}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。
如下://-----------------------------------------------------------------------------------------------//返回// SD卡的容量,单位为M// sector count and multiplier MB are inu08 == C_SIZE / (2^(9-C_SIZE_MULT))// SD卡的名称//-----------------------------------------------------------------------------------------------void SD_get_volume_info(){unsigned char i;unsigned char c_temp[5];VOLUME_INFO_TYPE SD_volume_Info,*vinf;vinf=&SD_volume_Info; //Init the pointoer;/读取CSD寄存器Read_CSD_SD(sectorBuffer.dat);//获取总扇区数vinf->sector_count = sectorBuffer.dat[6] & 0x03;vinf->sector_count <<= 8;vinf->sector_count += sectorBuffer.dat[7];vinf->sector_count <<= 2;vinf->sector_count += (sectorBuffer.dat[8] & 0xc0) >> 6;// 获取multipliervinf->sector_multiply = sectorBuffer.dat[9] & 0x03;vinf->sector_multiply <<= 1;vinf->sector_multiply += (sectorBuffer.dat[10] & 0x80) >> 7;//获取SD卡的容量vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);// get the name of the cardRead_CID_SD(sectorBuffer.dat);vinf->name[0] = sectorBuffer.dat[3];vinf->name[1] = sectorBuffer.dat[4];vinf->name[2] = sectorBuffer.dat[5];vinf->name[3] = sectorBuffer.dat[6];vinf->name[4] = sectorBuffer.dat[7];vinf->name[5] = 0x00; //end flag}以上程序将信息装载到一个结构体中,这个结构体的定义如下:typedef struct SD_VOLUME_INFO{ //SD/SD Card infounsigned int size_MB;unsigned char sector_multiply;unsigned int sector_count;unsigned char name[6];} VOLUME_INFO_TYPE;5)扇区读扇区读是对SD卡驱动的目的之一。