sd卡
- 格式:pdf
- 大小:784.86 KB
- 文档页数:25
sd卡的功能和使用方法一、sd卡简介sd卡是一种存储卡,可以用于存储数据、图片、视频、音频等文件。
sd卡具有体积小、容量大、速度快、可靠性高等特点,广泛应用于数码相机、数码摄像机、手机、平板电脑等设备中。
二、sd卡的功能sd卡的主要功能包括存储数据、传输数据和扩展设备容量。
sd卡可以存储各种类型的数据文件,如文本文件、图片文件、视频文件、音频文件等。
同时,sd卡也可以作为数据传输工具,将设备中的数据传输到计算机或其他设备中。
此外,sd卡还可以扩展设备的容量,使得用户可以更加灵活地使用设备。
三、sd卡的分类sd卡根据不同的标准可以分为多种类型,如sd卡、micro sd 卡、sdhc卡、sdxc卡等。
这些类型的sd卡在容量、速度、兼容性等方面有所不同,用户可以根据自己的需求选择合适的sd卡。
四、sd卡的安装方法sd卡的安装方法非常简单,只需要将sd卡插入设备中的sd卡插槽即可。
在插入sd卡时,需要注意正确的方法和方向,以免损坏sd 卡。
如果用户需要拔出sd卡时,也需要注意正确的方法和方向。
五、sd卡的使用注意事项在使用sd卡时,需要注意一些事项,以避免对sd卡造成损害。
首先,用户需要注意不要将sd卡插入不兼容的设备中,以免损坏sd 卡。
其次,用户在使用sd卡时应该避免在高温、潮湿、震动等恶劣环境下使用。
此外,用户在使用sd卡时应该注意不要使用锐利的工具进行拆装,以免划伤sd卡表面。
最后,用户在使用sd卡时应该注意备份重要数据,以免数据丢失。
六、sd卡的传输方式sd卡的传输方式主要有两种:有线传输和无线传输。
有线传输是通过计算机的数据线将sd卡与电脑或其他设备连接,从而传输数据。
无线传输则是通过蓝牙、wifi等技术,将sd卡中的数据传输到其他设备中,更加方便快捷。
七、sd卡的维护保养为了保证sd卡的正常使用和寿命,用户需要对其进行适当的维护保养。
首先,用户需要定期对sd卡进行清洁,避免灰尘和油污对sd 卡造成损害。
内存卡知识大全一、SD卡(Secure Digital)技术参数SD卡(Secure Digital)是由SanDisk,Toshiba,Panasonic三家公司共同发展的一种规格小型存储卡,可以用于诸如相机、摄像机、MP3、电子书等消费电子产品,它拥有很小的体积、极高的规格和高度的安全性。
1、尺寸:SD卡共有3种尺寸,standard-size SD卡、miniSD卡和microSD卡,standard-size SD卡的外形尺寸约为32×24×2.1mm,miniSD卡的外形尺寸约为20.3×21.5×2.1mm,microSD卡的外形尺寸约为11×15×1mm。
2、存储容量:SD卡的存储容量可达128GB,最高采用SDXC (EXTended Capacity)技术。
3、传输速率:SD卡支持从2.5MB/s到25MB/s的传输速率。
4、安装模式:SD卡采用安装模式,可以通过SD卡插头或外部设备将SD卡安装到相应的设备中。
5、操作系统支持:SD卡支持PC(Windows、Linux和Unix)、手机(Android系统)和特定设备操作系统,也可以在多种设备中使用。
6、电池供电:SD卡采用USB电源,支持电池供电,其电池使用时间为4-6小时。
7、传输接口:SD卡支持USB2.0/3.0接口,支持直接连接或者夹具连接(夹具可以支持更大的存储容量)。
8、安全性:SD卡采用了安全等级(加密等级),可以防止对存储数据的非法访问,这种加密技术包括AES(Advanced Encryption Standard)和DES(Data Encryption Standard)等安全算法。
二、MicroSD(Micro Secure Digital)技术参数MicroSD卡也称为TransFlash。
sd card的芯片封装方式SD卡的芯片封装方式SD卡是一种常见的存储设备,其芯片封装方式对于其性能和使用寿命有着重要的影响。
下面将介绍SD卡的芯片封装方式及其特点。
1. BGA封装(Ball Grid Array)BGA封装是一种常见的封装方式,它采用球形焊盘连接芯片与PCB 板。
BGA封装具有高密度、良好的热性能和电气性能优势,可以在较小的空间中集成更多的功能,适用于高性能和高容量的SD卡。
2. QFP封装(Quad Flat Package)QFP封装是一种常见的封装方式,它采用四个平面引脚连接芯片和PCB板。
QFP封装具有较高的可靠性和良好的电气性能,适用于中等性能和中等容量的SD卡。
3. TSOP封装(Thin Small Outline Package)TSOP封装是一种常见的封装方式,它采用薄型封装,节省空间。
TSOP封装具有较高的集成度和良好的电气性能,适用于低功耗和小容量的SD卡。
4. CSP封装(Chip Scale Package)CSP封装是一种高度集成的封装方式,它将芯片直接封装在最小尺寸的外壳中,减少了封装大小和重量。
CSP封装具有较高的集成度和良好的电气性能,适用于超小容量和高度集成的SD卡。
这些封装方式各有特点,可以根据SD卡的需求选择合适的封装方式。
无论是高性能的BGA封装、中等性能的QFP封装,还是低功耗的TSOP封装和超小容量的CSP封装,都能满足不同应用场景下的需求。
总结起来,SD卡的芯片封装方式多种多样,每种封装方式都有其自身的优势和适用范围。
选择合适的芯片封装方式可以提升SD卡的性能和可靠性,满足不同用户的需求。
sd卡芯片SD卡(Secure Digital Card)是一种用于存储数据的芯片,广泛应用于各类电子设备中,如数码相机、智能手机、平板电脑等。
SD卡芯片是由非易失性存储器(NAND Flash)芯片、控制器和相关电路组成的。
NAND Flash芯片是SD卡的主要存储器件,它具有高速度、大容量、低功耗等特点。
控制器则控制着SD卡的读写操作,包括读取和写入数据、分配文件系统等功能。
SD卡芯片的主要特点有以下几个方面:1. 容量:SD卡芯片的容量可以从几百MB到几十TB不等。
随着技术的不断进步,SD卡的存储容量逐渐增大,越来越适应人们不断增长的数据存储需求。
2. 速度:SD卡芯片的速度主要指的是数据读写速度,通常以MB/s(兆字节/秒)为单位表示。
速度越快,说明数据读写的效率越高。
SD卡的速度等级一般有4级、6级、10级等,其中10级速度最快,可达到80MB/s以上。
3. 可靠性:SD卡芯片采用了先进的块级管理技术,使得数据的读写更加稳定可靠。
此外,SD卡还具备防震、防水、防静电等功能,从而提高了数据的安全性。
4. 兼容性:SD卡芯片采用统一的SD卡接口标准,因此具有很好的兼容性。
无论是在什么样的设备上使用,都可以使用SD卡进行数据存储与传输。
5. 适用范围广:由于SD卡的容量大、体积小、读写速度快等特点,因此广泛应用于各类电子设备中。
比如,数码相机中用来存储照片和视频,智能手机和平板电脑中用来存储应用程序和媒体数据等。
总之,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卡数据读写流程的详细介绍。
在实际应用中,还需要根据具体情况进行合理调整和优化。
一般的sd卡寿命SD卡是一种常见的存储设备,它在我们的生活中扮演着重要的角色。
它小巧方便,可用于存储照片、视频、音乐等各种数据。
然而,就像任何其他技术产品一样,SD卡也有其自身的寿命。
SD卡的寿命是指其可靠运行的时间。
虽然没有确切的寿命预测方法,但一般来说,SD卡的使用寿命取决于多个因素,包括制造质量、使用频率、存储容量等。
制造质量是决定SD卡寿命的重要因素之一。
好的制造商会使用高质量的材料和先进的制造工艺来生产SD卡,从而提高其寿命。
而低质量的SD卡可能会容易损坏或失效。
使用频率也会影响SD卡的寿命。
频繁地读写数据会加速SD卡的磨损,从而缩短其寿命。
因此,合理使用SD卡,避免频繁读写操作,可以延长其使用寿命。
SD卡的存储容量也会对其寿命产生影响。
一般来说,存储容量越大的SD卡,其寿命可能会相对较短。
这是因为大容量的SD卡通常需要更多的内存单元来存储数据,而这些内存单元的使用寿命有限。
因此,如果不需要大容量的存储空间,选择适当容量的SD卡可能更加经济实惠。
还有一些其他因素也可能影响SD卡的寿命,如温度、湿度等环境因素。
高温和潮湿的环境可能会对SD卡的电子元件产生损害,从而缩短其寿命。
总的来说,SD卡的寿命是一个相对而言的概念。
通过选择高质量的SD卡、合理使用和保护SD卡,我们可以延长其寿命,使其更长久地为我们提供数据存储服务。
当然,最终还是需要根据实际情况来评估和决定如何使用和更换SD卡。
希望以上对SD卡寿命的介绍能够帮助您更好地了解和使用SD卡。
通过合理的使用和保护,我们可以最大限度地延长SD卡的寿命,使其为我们的数字生活带来更长久的便利。
什么是TF卡? micro sd卡? mini sd卡? sd卡内容:1、什么叫闪存卡2、闪存卡的分类3、闪存卡的用途4、闪存卡的发展趋势5、闪存卡相关技术6、闪存卡的故障及排除7、闪存卡使用须知8、闪存卡的数据安全9、手机闪存的使用及故障排除附:数码设备与闪存使用对照表一: 什么叫闪存卡在过去,人们照相要使用胶卷,听歌要有磁带,录相要用录相带,存储文件使用磁盘,科技的发展,尤其是数码产品的发展,促使闪存卡的诞生。
目前闪存卡的应用领域范围广泛,使得闪存卡迅猛发展,现在照相存储照片,录相存储视频,听歌存储音乐,及其它数据都可由闪存卡来代替。
闪存:闪存是采用一种新型的EEPROM内存(电可擦可写可编程只读内存),具有内存可擦可写可编程的优点,还具有写入的数据在断电后不会丢失的优点。
所有被广泛应用用于数码相机,MP3,及移动存储设备。
闪存卡:闪存卡(Flash Card)是利用闪存(Flash Memory)技术达到存储电子信息的存储器,一般应用在数码相机,掌上电脑,MP3等小型数码产品中作为存储介质,所以样子小巧,有如一张卡片,所以称之为闪存卡。
二:闪存卡的分类由于不同的厂家,不同的设备,使用的用途也不同,所以闪存卡分为六大类十二小类,SD 卡SanDisk SD卡(32GB)CF 卡MMC 卡XD 卡SM 卡SONY记忆棒Mini SD 卡T-Flash卡SanDisk microSDHC(TF)卡(8GB)SONY Micro SD (TF)卡(8GB)CF Ⅰ卡CF12的区别不是速度,是卡外型大小.请你一定注意.CF Ⅱ卡CF12的区别不是速度,是卡外型大小.请你一定注意.(外型一样,性能方面有所不同)Rsmmc卡DV-RSMMC卡闪存卡(DV-RSMMC卡)Sony Memory Stick(MS) 长棒Sony Memory Stick(MS) PRO Duo 短棒SD卡:SD卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一代记忆设备。
SD卡按尺寸,分为SD卡、miniSD卡(比SD小)、microSD卡(比miniSD小,以前叫TF卡),小的两种可以通过转接卡当大的用。
SD卡还可以按容量大小分为SD卡(容量不超过2G)和SDHC卡(高容量SD卡,容量大于2G)。
还可以按读写速度分为高速卡和低速卡,不过都能在不同的设备上使用。
索尼有自己的MS卡,所以索尼生产的东西就不兼容别的卡了,肥水不流外人田嘛。
MS卡中文名叫记忆棒,所以一般就喊长棒短棒了,长棒是老型号的,现在都用尺寸更小的短棒,短棒也可以通过转接卡当长棒用。
RSMMC卡的形状正好是MMC卡的一半,体积为24mm x 18 mm x 1.4mm,长度比MMC 卡的一半长一点(MMC的长度为32mm,RS-MMC的长度为18mm),重量仅0.8克,是目前最小最轻的存储卡之一,它的特性也和MMC卡相同,也是7个针脚,通过在后面安装专用适配器可以当作MMC卡一样来用。
现在RSMMC就已经得到了手机厂商的广泛支持,必然也会是将来的主流产品,甚至有可能成为未来的第一大存储卡。
SD卡身材小巧,一般消费者在购买之前不会有太多了解,因此从外观上辨别有些困难,下面为大家介绍一下市场上常见的SanDisk牌SD卡真假的辨别方法:首先是看存储卡本身,sandisk正品储存卡都在正面贴有激光变彩标签,不同角度都会产生激光色彩变化。
其次是国内代理的行货正品卡,均采用了与上面相类似的塑料封装的包装形式,但是右下的“5年保证”的字样和日文均改为了图形表明的5年质保。
Secure Digital,缩写为SD,中文翻译为安全数码卡,是一种记忆卡的标准,它被广泛地於携带型装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
SD卡的技术建是基於MultiMedia卡(MMC)格式上,但SD卡比MMC卡略厚。
而SD卡也有较高的资料传送速度,而且不断地更新标准。
大部份SD卡的侧面设有写保护控制,以避免一些资料意外地写入,而少部分的SD卡甚至支援数位版权管理(DRM)的技术。
手机上安装sd卡的方法SD卡是一种便携式存储设备,可以增加手机的存储空间。
通过安装SD卡,我们可以存储更多的照片、视频、音乐和其他文件,以及安装更多的应用程序。
本文将介绍如何在手机上安装SD卡,并提供一些使用和管理SD卡的技巧。
选择适合的SD卡首先,在购买SD卡之前,我们需要了解手机支持的SD卡类型和最大容量限制。
大多数手机支持microSD卡,而最大支持容量因手机型号而异。
一般来说,16GB或32GB的SD卡已经足够满足大部分用户的需求,但如果你需要更多的存储空间,可以考虑64GB或128GB的SD卡。
此外,为了确保SD卡的质量和性能,建议选择知名品牌的SD卡,比如三星、SanDisk等。
避免购买低质量的SD卡,以免造成数据丢失或损坏手机。
插入SD卡安装SD卡之前,我们需要先关机。
然后按照以下步骤插入SD卡:1. 找到手机上的SD卡槽。
通常,SD卡槽位于手机侧面或背面的一个小门或插槽中。
2. 使用针状物,如SIM卡弹出针或图钉,小心地将SD卡槽弹出。
3. 将SD卡插入SD卡槽中。
确保SD卡的金属接点与手机的接点对齐。
4. 轻轻按下SD卡,直到它牢固地安装在位,然后将SD卡槽盖合。
格式化SD卡在将SD卡插入手机之后,我们需要格式化它以确保手机正确识别和使用SD卡。
格局化SD卡将删除所有数据,所以在操作之前,请确保备份重要文件。
以下是格式化SD卡的步骤:1. 打开手机设置,并找到存储选项。
2. 在存储选项中,找到“SD卡”或类似的选项,然后点击进入。
3. 在SD卡设置界面中,找到“格式化SD卡”选项,然后点击。
4. 系统将显示一个警告消息,说明格式化SD卡将删除所有数据。
如果您已备份数据,请点击“确定”继续。
5. 等待系统完成SD卡的格式化过程。
时间长短取决于SD卡的容量大小。
完成格式化后,SD卡已经准备好使用了。
使用和管理SD卡一旦SD卡安装和格式化完毕,我们可以开始使用它了。
以下是一些使用和管理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卡通过其引脚获得电源,通常采用3.3V或1.8V
的电源电压。
数据通信:SD卡与主机之间的数据传输通过两个数据总线完成,分别为数据线(DAT0~DAT3)和命令线(CMD)。
控制信号:控制信号通过控制引脚(CLK)完成,用于同步数据传输。
电源控制:电源控制引脚(PP)用于控制SD卡的电源模式。
写保护:写保护引脚(WP)用于保护SD卡免受误写操作。
此外,SD卡还具有一些其他引脚,如片选信号引脚(CS)、时钟引脚(SCK)等。
这些引脚共同构成了SD卡的典型电路。
sd标准总线时序SD标准总线(Secure Digital Standard Bus)是一种用于存储卡、数据通信和数字设备之间的通信接口。
SD卡已成为许多电子设备中的常见存储介质,它不仅具有较大的存储容量和较快的读写速度,还具有广泛的应用领域。
在了解SD标准总线时序之前,我们首先需要了解SD卡的基本工作原理和结构。
SD卡是一种具有特定规格和接口的存储卡。
它通常由控制器芯片、闪存存储芯片、读写电路和插槽等组成。
SD标准总线时序是一系列的时序规范,用于控制和管理数据在SD卡和主设备之间的传输。
在SD卡的读取和写入过程中,时序是关键的。
下面是SD标准总线时序的主要步骤描述:1. 初始化阶段:在连接SD卡之前,主设备会通过时钟信号发送预初始化命令来识别SD卡的类型和规格。
此外,主设备还会通过发送命令来设置数据传输速率、总线电压和总线宽度等参数。
2. 命令传输阶段:一旦初始化完成,主设备就可以发送各种命令来与SD卡进行通信。
这些命令包含读取、写入、擦除、锁定和格式化等操作。
此阶段通过发送不同的命令和参数来实现。
3. 数据传输阶段:在数据传输阶段,主设备可以发送读取和写入命令来读取或写入数据。
数据传输是通过主设备和SD卡之间的数据总线进行的,数据总线的宽度可能是SD卡规格的一部分。
在数据传输期间,时钟信号会定时指示数据的传输速率。
4. 结束阶段:在数据传输完成后,主设备可以发送结束命令或者断开与SD卡的连接。
这个阶段是SD卡和主设备之间通信的结束。
在SD标准总线时序中,时钟信号起着至关重要的作用。
主设备通过控制时钟信号的频率和相位来实现与SD卡的数据传输。
时钟频率越高,数据传输速度就越快。
同时,时钟的相位要与数据的传输顺序相匹配,以确保数据的准确传输。
此外,在SD标准总线时序中,命令和数据传输都是以数据包的形式进行的。
每个数据包由包头、命令或数据、校验和等几个部分组成。
包头用于标识数据包的类型和长度,命令或数据部分是具体的数据内容,校验和用于验证数据的完整性。
由于仪器本身内存有限,我们在日常生活中往往会选择使用内存卡增加仪器内存。
但很多人有一个误区,以为手机内存卡和相机内存卡都是同样的SD卡,其实不然,SD卡一般是相机使用的大的内存卡,而手机使用的小的内存卡叫做TF卡。
两者有何区别呢?下面小编就给大家讲解一下。
一、名称区分SD卡即Secure Digital Memory Card,中文翻译为安全数码卡。
TF卡即T-Flash又称MicroSD,是一种记忆卡。
后改称为TransFlash;而重新命名为MicroSD的原因是因为被SD协会(SDA)采立。
另一些被SDA采立的记忆卡包括miniSD和SD卡。
二、起源区分SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。
TF卡由Motorola与SanDisk(闪迪)共同推出的最新一代的记忆卡规格。
2004年推出。
三、外观区分SD卡体积为24mm×32mm×2.1mm;TF卡体积为15mm×11mm×1mm。
四、定义区分SD卡是一种基于半导体快闪记忆器的新一代记忆设备。
TF卡是极细小的快闪存储器卡,采用SanDisk最新NAND MLC技术及控制器技术。
五、用途不同SD卡被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
TF卡主要于手机使用,但因它拥有体积极小的优点,随着不断提升的容量,它慢慢开始于GPS设备、便携式音乐播放器和一些快闪存储器盘中使用。
六、安全区分SD卡有写保护开关!TF卡没有,但是TF卡可以通过卡套,转换成SD卡!七、容量区分SD卡容量有:32G 16G 8G 6G 4G 2G 1G 512M 256M 128M,早期从8~512 MB,1~8(SDHC) GB。
TF卡容量有:64G 32G 16G 8G 6G 4G 2G 1G 512M 256M 128M!综上,TF卡和SD卡其实性质相同,在功能方面也没有太大差别,只是两者使用范围不同,这也是我们常把SD卡和TF卡概念混淆的原因。
SD卡百科一、SD卡简介SD卡的速率一般定义为Class2、Class4、Class6 和Class 10 四个等级,最低读写速度分别为2、4、6、10M/s。
SD2.0的规范中对于SD卡的性能上分为如下4个等级,不同等级能分别满足不同的应用要求:Class 0:包括低于Class 2和未标注Speed Class的情况;Class 2:能满足观看普通MPEG4 MPEG2 的电影、SDTV、数码摄像机拍摄;Class 4:可以流畅播放高清电视(HDTV),数码相机连拍等需求;Class 6:满足单反相机连拍和专业设备的使用要求。
SD卡容量目前有3个级别,那就是SD、SDHC和SDXC。
1、普通SD卡容量上限是2GB,支持磁盘格式FAT 12, 16。
2、SDHC是"Secure Digital High Capacity“的缩写,即“高容量SD存储卡,容量大于2GB小于等于32GB的SD卡.SDHC必须采用FAT32文件系统,这是因为之前在SD卡中使用的FA T16文件系统所支持的最大容量为2GB,并不能满足SDHC的要求.缺少SDHC标志或速度等级标志,这些存储卡不能被称为SDHC卡.它们是不被SD协会所认可的,这类卡在使用中很可能出现与设备的兼容性问题。
3、SDXC存储卡的目前最大容量可达64GB。
理论容量是2TB,最大的传输速度预期能够达到300MB/s。
SDXC存储卡只和装有exFAT文件系统的SDXC对应设备相兼容。
它不能用于SD或SDHC对应设备。
为什么买的SD卡标注的容量是8G,电脑上查看确只有7个多G?这是因为单位换算的误差,因为这个是理论容量和实际厂商生产的容量中间的差值。
理论容量,是1G=1024MB=1024*1024KB。
厂商生产的容量为了便于计算。
是1G=1000MB=1000*1000KB。
然而,电脑识别后,还是以理论容量计算的。
所以就造成了8G内存卡,实际上达不到8G。
SD卡分TF(micro-SD)卡和SD卡两种。
TF(micro-SD)卡——迷你卡(用于手机,就是卡芯【指甲盖大小】)
SD卡——正常卡(用于相机)
CF卡
记忆棒/XQD卡
WIFI卡
1. TF卡又名MicroSD卡,体积非常小,多用于手机,MP4等对于性能要求不高的数码设备,不适合单反(当然也有高性能的UHS-1卡)。
2. SD卡是目前最通用的储存卡,各种价位都有,很多电脑自带SD卡插槽,卡片机和单反都能用。
3. CF卡总体性能较SD卡要高,用于单反等对性能要求高的设备,体积较大。
4. 记忆棒是索尼专有的规格,貌似也只有索尼的相机能用了。
5. 所谓“WIFI卡”也就是带wifi功能的SD卡,相机拍完照可以通过wifi把照片在手机或电脑上上显示或者传输,也有性能较高的。
sd卡的标签用法摘要:1.SD 卡简介2.SD 卡标签的定义与作用3.SD 卡标签的分类4.SD 卡标签的应用场景5.SD 卡标签的读写方法6.SD 卡标签的注意事项正文:SD 卡,全称Secure Digital Memory Card,是一种常见的存储卡格式,广泛应用于数码相机、手机、平板电脑等电子设备中。
SD 卡具有体积小巧、容量大、传输速度快等特点,为用户提供了便捷的存储解决方案。
在使用SD 卡的过程中,标签功能为用户提供了极大的便利。
本文将详细介绍SD 卡标签的用法。
1.SD 卡简介SD 卡作为一种便携式存储设备,具有多种尺寸和容量,可以满足不同用户的需求。
SD 卡支持即插即用,用户只需将其插入电子设备,便可实现数据的存储和传输。
2.SD 卡标签的定义与作用SD 卡标签,是指存储在SD 卡内部的一种标识信息,它可以记录文件系统、存储容量、设备型号等重要信息。
SD 卡标签的作用在于,帮助用户快速识别存储卡的基本属性,以及在使用过程中对数据进行有效管理。
3.SD 卡标签的分类SD 卡标签主要分为两类:一类是通用标签,另一类是特定应用标签。
通用标签主要包括了文件系统、容量、设备型号等信息;特定应用标签则是针对特定应用场景,如数码相机中的拍摄信息、手机中的通话记录等。
4.SD 卡标签的应用场景SD 卡标签广泛应用于各种电子设备中,尤其在数码相机、手机等设备中,标签功能为用户提供了极大的便利。
例如,在数码相机中,用户可以通过SD 卡标签快速查看拍摄时间、拍摄地点等信息;在手机中,用户可以通过SD 卡标签快速查找通话记录、短信等数据。
5.SD 卡标签的读写方法SD 卡标签的读写需要借助特定的工具和方法。
一般而言,用户可以通过电子设备内置的文件管理器、第三方管理软件等工具,实现SD 卡标签的读写。
此外,部分设备还支持通过OTG 功能连接电脑,通过电脑端的工具进行SD 卡标签的读写。
6.SD 卡标签的注意事项在使用SD 卡标签功能时,用户需要注意以下几点:首先,部分低端设备可能不支持SD 卡标签功能,因此无法读取和写入标签信息;其次,为了保证标签信息的稳定性和可靠性,建议用户使用正规的管理软件进行操作;最后,用户应定期备份SD 卡中的数据,防止数据丢失。
SD卡读写操作详细说明
一、SD卡的读取
1、安装SD卡:在使用SD卡之前,首先要将SD卡放入SD卡插槽,然后把开关拉到ON位置,表明SD卡装载完成。
2、打开IO口:在使用SD卡之前,需要在正确的地址上打开该SD卡的IO口,这样才能进行SD卡的读写操作。
3、初始化SD卡:在SD卡装载完成并打开IO口后,就可以进行SD 卡的初始化操作了。
SD卡的初始化是必须的,只有在SD卡的初始化操作成功后,才能进行下一步的读写操作。
4、发送CMD命令:发送CMD命令是SD卡的read操作的前提,必须发送CMD命令,才能获得SD卡中指定的数据,进而实现SD卡的读取。
5、读取数据:在发送CMD命令之后,就可以对SD卡中指定的数据进行读取,可以读取文本文件,二进制文件,BMP图片等等。
二、SD卡的写入
1、打开IO口:在使用SD卡之前,需要在正确的地址上打开该SD卡的IO口,这样才能进行SD卡的读写操作。
2、初始化SD卡:在SD卡装载完成并打开IO口后,就可以进行SD 卡的初始化操作了。
SD卡的初始化是必须的,只有在SD卡的初始化操作成功后,才能进行下一步的读写操作。
3、格式化SD卡:在连接SD卡后,需要进行格式化操作,必须格式化SD卡,才能进行SD卡的写入操作。
4、发送CMD命令:写入操作也需要发送CMD命令,发送CMD命令的目的是为了定位写入数据的位置。
5、写入数据:在发送CMD命令之后。
SD卡原理及内部结构SD卡(Secure Digital Card)是一种常见的存储媒介,用于扩展和备份电子设备的存储空间。
SD卡是由SanDisk、Panasonic和Toshiba共同开发的,在2000年正式发布。
它采用了闪存技术,并通过内部控制器管理数据存储和读取。
本文将介绍SD卡的原理及内部结构。
SD卡的原理:1.闪存技术:SD卡采用的是闪存技术,它是一种非易失性存储器,数据可以在断电后仍然保持。
它使用了一种特殊的电荷积累和释放过程来存储和擦除数据。
2.物理结构:SD卡的物理结构包括卡片和插槽。
卡片是由一系列的片层组成,每个片层之间有绝缘层隔开。
卡片的尾部有一组金属接点,用于与设备的插槽连接。
插槽则是设备用来接收SD卡的槽。
3.控制器:SD卡内部包含一个控制器芯片,用于管理卡片的读写操作。
控制器负责将主机发来的命令转换为SD卡内部的操作,并确保正常的数据传输。
4. 文件系统:SD卡通常使用的文件系统是FAT(File Allocation Table),这是一种常见的文件系统格式。
FAT可以将存储空间分割成一系列的簇,每个簇可以存储一个或多个数据块。
FAT表记录了每个文件被存储在哪个簇以及哪些簇是空闲的。
5. 数据传输:SD卡通过低电压差分信号进行数据传输。
它使用了一种称为SPI(Serial Peripheral Interface)的串行接口协议。
SPI接口允许SD卡与主机之间进行高速数据传输,通常以几十MHz的速度进行。
SD卡的内部结构:1.控制器:SD卡的控制器芯片是SD卡最重要的组成部分。
它包含CPU、闪存映射器以及一些IO接口。
控制器负责管理数据的读写、错误检测和修复,以及与主机的通信。
2.闪存芯片:SD卡的主要存储介质是闪存芯片。
闪存芯片由一系列的存储单元组成,每个存储单元可以存储一个或多个比特的数据。
闪存芯片通常被组织成一个二维的数组,每行是一个块,每列是一个页。
3. ECC:ECC(Error Correction Code)是用来检测和纠正数据中的错误的一种技术。
2953.20 SD 卡实验很多单片机系统都需要大容量存储设备,以存储数据。
目前常用的有U 盘,FLASH 芯片,SD 卡等。
他们各有优点,综合比较,最适合单片机系统的莫过于SD 卡了,它不仅容量可以做到很大(32Gb 以上),而且支持SPI 接口,方便移动,有几种体积的尺寸可供选择(标准的SD 卡尺寸,以及TF 卡尺寸),能满足不同应用的要求。
只需要4个IO 口,就可以外扩一个最大达32GB 以上的外部存储器,容量选择尺度很大,更换也很方便,而且方便移动,编程也比较简单,是单片机大容量外部存储器的首选。
ALIENTKE MiniSTM3开发板就带有SD 卡接口,利用STM32自带的SPI 接口,最大通信速度可达18Mbps ,每秒可传输数据2M 字节以上,对于一般应用足够了。
本节将向大家介绍,如何在ALIENTEK MiniSTM32开发板上读取SD 卡。
本节分为如下几个部分:3.20.1 SD 卡简介 3.20.2 硬件设计 3.20.3 软件设计 3.20.4 下载与测试2963.20.1 SD 卡简介SD 卡(Secure Digital Memory Card )中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。
SD 卡由日本松下、东芝及美国SanDisk 公司于1999年8月共同开发研制。
大小犹如一张邮票的SD 记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。
SD 卡一般支持2种操作模式: 1,SD 卡模式; 2,SPI 模式;主机可以选择以上任意一种模式同SD 卡通信,SD 卡模式允许4线的高速数据传输。
SPI 模式允许简单的通过SPI 接口来和SD 卡通信,这种模式同SD 卡模式相比就是丧失了速度。
SD 卡的引脚排序如下图所示:图3.20.1.1 SD 卡引脚排序图SD 卡引脚功能描述如下表所示:表3.20.1.1 SD 卡引脚功能表SD 卡只能使用3.3V 的IO 电平,所以,MCU 一定要能够支持3.3V 的IO 端口输出。
注意:在SPI 模式下,CS/MOSI/MISO/CLK 都需要加10~100K 左右的上拉电阻。
SD 卡要进入SPI 模式很简单,就是在SD 卡收到复位命令(CMD0)时,CS 为有效电平(低电平)则SPI 模式被启用。
不过在发送CMD0之前,要发送>74个时钟,这是因为SD 卡内部有个供电电压上升时间,大概为64个CLK ,剩下的10个CLK 用于SD 卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK 时钟最大不能超过400Khz !。
ALENTEK MiniSTM32开发板使用的是SPI 模式来读写SD 卡,下面我们就重点介绍一下SD 卡在SPI 模式下的相关操作。
首先介绍SPI 模式下几个重要的操作命令,如下表所示:297命令 参数 回应描述 CMD0(0X00) NONE R1复位SD卡CMD9(0X09) NONE R1读取卡特定数据寄存器 CMD10(0X0A) NONE R1读取卡标志数据寄存器 CMD16(0X10) 块大小 R1设置块大小(字节数) CMD17(0X11) 地址 R1读取一个块的数据 CMD24(0X18) 地址 R1写入一个块的数据 CMD41(0X29) NONE R1引用命令的前命令 CMD55(0X37)NONER1开始卡的初始化 CMD59(0X3B) 仅最后一位有效R1设置CRC 开启(1)或关闭(0)表3.20.1.2 SPI 模式下SD 卡部分操作指令 其中R1的回应格式如下表所示:表3.20.1.3 SD 卡R1回应格式接着我们看看SD 卡的初始化,SD 卡的典型初始化过程如下:1、初始化与SD 卡连接的硬件条件(MCU 的SPI 配置,IO 口配置);2、上电延时(>74个CLK );3、复位卡(CMD0);4、激活卡,内部初始化并获取卡类型(CMD1(用于MMC 卡)、CMD55、CMD41); 5.、查询OCR ,获取供电状况(CMD58);6、是否使用CRC (CMD59);7、设置读写块数据长度(CMD16);8、读取CSD ,获取存储卡的其他信息(CMD9); 9、发送8CLK 后,禁止片选;这样我们就完成了对SD 卡的初始化,这里面我们一般设置读写块数据长度为512个字节,并禁止使用CRC 。
在完成了初始化之后,就可以开始读写数据了。
SD 卡读取数据,这里通过CMD17来实现,具体过程如下: 1、发送CMD17; 2、接收卡响应R1;3、接收数据起始令牌0XFE ;4、接收数据;5、接收2个字节的CRC ,如果没有开启CRC ,这两个字节在读取后可以丢掉。
6、8CLK 之后禁止片选;以上就是一个典型的读取SD 卡数据过程,SD 卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下:1、发送CMD24;2、接收卡响应R1;3、发送写数据起始令牌0XFE ;2984、发送数据;5、发送2字节的伪CRC ;6、8CLK 之后禁止片选;以上就是一个典型的写SD 卡过程。
关于SD 卡的介绍,我们就介绍到这里,更详细的介绍请参考SD 卡的参考资料。
3.20.2 硬件设计本节实验功能简介:开机的时候先初始化SD 卡,如果SD 卡初始化完成,则读取扇区0的数据,然后通过串口打印到电脑上。
如果没初始化通过,则在LCD 上提示初始化失败。
同样用DS0来指示程序正在运行。
所要用到的硬件资源如下: 1)STM32F103RBT6。
2)DS0(外部LED0)。
3)串口1。
4)TFTLCD 液晶模块。
5)SD 卡。
前面四部分,在之前的实例已经介绍过了,这里我们介绍一下SD 卡在开发板上 的连接方式,SD 卡与MCU 的连接原理图如下:图3.20.2.1 SD 卡与STM32连接电路图2993.20.3 软件设计打开上一节的工程,首先在HARDWARE 文件夹下新建一个SD 的文件夹。
然后新建一个MMC_SD.C 和MMC_SD.H 的文件保存在SD 文件夹下,并将这个文件夹加入头文件包含路径。
打开MMC_SD.C 文件,输入如下代码: #include "sys.h" #include "mmc_sd.h" #include "spi.h" #include "usart.h" #include "delay.h" u8 SD_Type=0;//SD 卡的类型 //Mini STM32开发板 //SD 卡 驱动//正点原子@ALIENTEK //2010/5/13//增加了一些延时,实测可以支持TF 卡(1G/2G),金士顿2G,4G 16G SD 卡 //2010/6/24//加入了u8 SD_GetResponse(u8 Response)函数 //修改了u8 SD_WaitDataReady(void)函数//增加了USB 读卡器支持的u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead);//和u8 MSD_WriteBuffer(u8* pBuffer, u32 WriteAddr, u32 NumByteToWrite);两个函数//等待SD 卡回应//Response:要得到的回应值//返回值:0,成功得到了该回应值 // 其他,得到回应值失败u8 SD_GetResponse(u8 Response) { u16 Count=0xFFF;//等待次数 while ((SPIx_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到准确的回应if (Count==0)return MSD_RESPONSE_FAILURE;//得到回应失败 else return MSD_RESPONSE_NO_ERROR;//正确回应 }//等待SD 卡写入完成 //返回值:0,成功; // 其他,错误代码;u8 SD_WaitDataReady(void) {u8 r1=MSD_DATA_OTHER_ERROR;300u32 retry; retry=0; do {r1=SPIx_ReadWriteByte(0xFF)&0X1F;//读到回应 if(retry==0xfffe)return 1; retry++; switch (r1) { case MSD_DATA_OK://数据接收正确了 r1=MSD_DATA_OK; break; case MSD_DATA_CRC_ERROR: //CRC 校验错误 return MSD_DATA_CRC_ERROR; case MSD_DATA_WRITE_ERROR://数据写入错误 return MSD_DATA_WRITE_ERROR; default://未知错误 r1=MSD_DATA_OTHER_ERROR; break; }}while(r1==MSD_DATA_OTHER_ERROR); //数据错误时一直等待 retry=0; while(SPIx_ReadWriteByte(0XFF)==0)//读到数据为0,则数据还未写完成 { retry++; //delay_us(10);//SD 卡写等待需要较长的时间 if(retry>=0XFFFFFFFE)return 0XFF;//等待失败了 };return 0;//成功了 }//向SD 卡发送一个命令 //输入: u8 cmd 命令 // u32 arg 命令参数// u8 crc crc 校验值 //返回值:SD 卡返回的响应u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc) {u8 r1;u8 Retry=0; SD_CS=1;SPIx_ReadWriteByte(0xff);//高速写命令延时 SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff);301//片选端置低,选中SD 卡 SD_CS=0; //发送SPIx_ReadWriteByte(cmd | 0x40);//分别写入命令 SPIx_ReadWriteByte(arg >> 24); SPIx_ReadWriteByte(arg >> 16); SPIx_ReadWriteByte(arg >> 8); SPIx_ReadWriteByte(arg); SPIx_ReadWriteByte(crc); //等待响应,或超时退出while((r1=SPIx_ReadWriteByte(0xFF))==0xFF) {Retry++; if(Retry>200)break; }//关闭片选 SD_CS=1;//在总线上额外增加8个时钟,让SD 卡完成剩下的工作 SPIx_ReadWriteByte(0xFF); //返回状态值 return r1; }//向SD 卡发送一个命令(结束是不失能片选,还有后续数据传来) //输入:u8 cmd 命令 // u32 arg 命令参数// u8 crc crc 校验值 //返回值:SD 卡返回的响应u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc) {u8 Retry=0; u8 r1;SPIx_ReadWriteByte(0xff);//高速写命令延时 SPIx_ReadWriteByte(0xff); SD_CS=0;//片选端置低,选中SD 卡 //发送SPIx_ReadWriteByte(cmd | 0x40); //分别写入命令 SPIx_ReadWriteByte(arg >> 24); SPIx_ReadWriteByte(arg >> 16); SPIx_ReadWriteByte(arg >> 8); SPIx_ReadWriteByte(arg); SPIx_ReadWriteByte(crc);302//等待响应,或超时退出while((r1=SPIx_ReadWriteByte(0xFF))==0xFF) {Retry++; if(Retry>200)break; }//返回响应值 return r1; }//把SD 卡设置到挂起模式 //返回值:0,成功设置 // 1,设置失败 u8 SD_Idle_Sta(void) { u16 i;u8 retry;for(i=0;i<0xf00;i++);//纯延时,等待SD 卡上电完成 //先产生>74个脉冲,让SD 卡自己初始化完成 for(i=0;i<10;i++)SPIx_ReadWriteByte(0xFF);//-----------------SD 卡复位到idle 开始----------------- //循环连续发送CMD0,直到SD 卡返回0x01,进入IDLE 状态 //超时则直接退出 retry = 0; do{//发送CMD0,让SD 卡进入IDLE 状态 i = SD_SendCommand(CMD0, 0, 0x95); retry++;}while((i!=0x01)&&(retry<200));//跳出循环后,检查原因:初始化成功?or 重试超时? if(retry==200)return 1; //失败 return 0;//成功 } //初始化SD 卡//如果成功返回,则会自动设置SPI 速度为18Mhz //返回值:0:NO_ERR // 1:TIME_OUT // 99:NO_CARDu8 SD_Init(void) { u8 r1; // 存放SD 卡的返回值 u16 retry; // 用来进行超时计数303u8 buff[6];//设置硬件上与SD 卡相关联的控制引脚输出 //避免NRF24L01/W25X16等的影响 RCC->APB2ENR|=1<<2; //PORTA 时钟使能 GPIOA->CRL&=0XFFF000FF; GPIOA->CRL|=0X00033300;//PA2.3.4 推挽 GPIOA->ODR|=0X7<<2; //PA2.3.4上拉 SPIx_Init();SPIx_SetSpeed(SPI_SPEED_256);//设置到低速模式 SD_CS=1;if(SD_Idle_Sta()) return 1;//超时返回1 设置到idle 模式失败 //-----------------SD 卡复位到idle 结束----------------- //获取卡片的SD 版本信息 SD_CS=0; r1 = SD_SendCommand_NoDeassert(8, 0x1aa,0x87);//如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化 if(r1 == 0x05) {//设置卡类型为SDV1.0,如果后面检测到为MMC 卡,再修改为MMC SD_Type = SD_TYPE_V1;//如果是V1.0卡,CMD8指令后没有后续数据 //片选置高,结束本次命令 SD_CS=1;//多发8个CLK,让SD 结束后续操作 SPIx_ReadWriteByte(0xFF);//-----------------SD 卡、MMC 卡初始化开始----------------- //发卡初始化指令CMD55+ACMD41// 如果有应答,说明是SD 卡,且初始化完成// 没有回应,说明是MMC 卡,额外进行相应初始化 retry = 0; do {//先发CMD55,应返回0x01;否则出错 r1 = SD_SendCommand(CMD55, 0, 0);if(r1 == 0XFF)return r1;//只要不是0xff,就接着发送//得到正确响应后,发ACMD41,应得到返回值0x00,否则重试200次 r1 = SD_SendCommand(ACMD41, 0, 0); retry++;}while((r1!=0x00) && (retry<400)); // 判断是超时还是得到正确回应// 若有回应:是SD 卡;没有回应:是MMC 卡 //----------MMC 卡额外初始化操作开始------------ if(retry==400)304{retry = 0;//发送MMC 卡初始化命令(没有测试) do {r1 = SD_SendCommand(1,0,0); retry++;}while((r1!=0x00)&& (retry<400));if(retry==400)return 1; //MMC 卡初始化超时 //写入卡类型SD_Type = SD_TYPE_MMC; }//----------MMC 卡额外初始化操作结束------------ //设置SPI 为高速模式SPIx_SetSpeed(SPI_SPEED_4); SPIx_ReadWriteByte(0xFF); //禁止CRC 校验 r1 = SD_SendCommand(CMD59, 0, 0x95);if(r1 != 0x00)return r1; //命令错误,返回r1 //设置Sector Sizer1 = SD_SendCommand(CMD16, 512, 0x95);if(r1 != 0x00)return r1;//命令错误,返回r1//-----------------SD 卡、MMC 卡初始化结束-----------------}//SD 卡为V1.0版本的初始化结束 //下面是V2.0卡的初始化//其中需要读取OCR 数据,判断是SD2.0还是SD2.0HC 卡 else if(r1 == 0x01) {//V2.0的卡,CMD8命令后会传回4字节的数据,要跳过再结束本命令 buff[0] = SPIx_ReadWriteByte(0xFF); //should be 0x00 buff[1] = SPIx_ReadWriteByte(0xFF); //should be 0x00 buff[2] = SPIx_ReadWriteByte(0xFF); //should be 0x01buff[3] = SPIx_ReadWriteByte(0xFF); //should be 0xAA SD_CS=1;SPIx_ReadWriteByte(0xFF);//the next 8 clocks //判断该卡是否支持2.7V-3.6V 的电压范围//if(buff[2]==0x01 && buff[3]==0xAA) //不判断,让其支持的卡更多 {retry = 0;//发卡初始化指令CMD55+ACMD41 do {305r1 = SD_SendCommand(CMD55, 0, 0); if(r1!=0x01)return r1; r1 = SD_SendCommand(ACMD41, 0x40000000, 0); if(retry>200)return r1; //超时则返回r1状态 }while(r1!=0);//初始化指令发送完成,接下来获取OCR 信息 //-----------鉴别SD2.0卡版本开始----------- r1 = SD_SendCommand_NoDeassert(CMD58, 0, 0); if(r1!=0x00) { SD_CS=1;//释放SD 片选信号 return r1; //如果命令没有返回正确应答,直接退出,返回应答}//读OCR 指令发出后,紧接着是4字节的OCR 信息 buff[0] = SPIx_ReadWriteByte(0xFF); buff[1] = SPIx_ReadWriteByte(0xFF); buff[2] = SPIx_ReadWriteByte(0xFF); buff[3] = SPIx_ReadWriteByte(0xFF); //OCR 接收完成,片选置高 SD_CS=1;SPIx_ReadWriteByte(0xFF);//检查接收到的OCR 中的bit30位(CCS),确定其为SD2.0还是SDHC //如果CCS=1:SDHC CCS=0:SD2.0if(buff[0]&0x40)SD_Type = SD_TYPE_V2HC; //检查CCS else SD_Type = SD_TYPE_V2;//-----------鉴别SD2.0卡版本结束----------- //设置SPI 为高速模式SPIx_SetSpeed(SPI_SPEED_4); } }return r1; }//从SD 卡中读回指定长度的数据,放置在给定位置 //输入: u8 *data(存放读回数据的内存>len) // u16 len(数据长度)// u8 release(传输完成后是否释放总线CS 置高 0:不释放 1:释放) //返回值:0:NO_ERR // other:错误信息u8 SD_ReceiveData(u8 *data, u16 len, u8 release) {// 启动一次传输306SD_CS=0; if(SD_GetResponse(0xFE))//等待SD 卡发回数据起始令牌0xFE { SD_CS=1; return 1; }while(len--)//开始接收数据 {*data=SPIx_ReadWriteByte(0xFF); data++; }//下面是2个伪CRC(dummy CRC) SPIx_ReadWriteByte(0xFF); SPIx_ReadWriteByte(0xFF);if(release==RELEASE)//按需释放总线,将CS 置高 {SD_CS=1;//传输结束SPIx_ReadWriteByte(0xFF); } return 0; }//获取SD 卡的CID 信息,包括制造商信息//输入: u8 *cid_data(存放CID 的内存,至少16Byte) //返回值:0:NO_ERR // 1:TIME_OUT // other:错误信息u8 SD_GetCID(u8 *cid_data) {u8 r1;//发CMD10命令,读CIDr1 = SD_SendCommand(CMD10,0,0xFF);if(r1 != 0x00)return r1; //没返回正确应答,则退出,报错 SD_ReceiveData(cid_data,16,RELEASE);//接收16个字节的数据 return 0; }//获取SD 卡的CSD 信息,包括容量和速度信息//输入:u8 *cid_data(存放CID 的内存,至少16Byte) //返回值:0:NO_ERR // 1:TIME_OUT // other:错误信息307u8 SD_GetCSD(u8 *csd_data) {u8 r1;r1=SD_SendCommand(CMD9,0,0xFF);//发CMD9命令,读CSD if(r1)return r1; //没返回正确应答,则退出,报错SD_ReceiveData(csd_data, 16, RELEASE);//接收16个字节的数据 return 0; }//获取SD 卡的容量(字节) //返回值:0: 取容量出错// 其他:SD 卡的容量(字节)u32 SD_GetCapacity(void) {u8 csd[16]; u32 Capacity; u8 r1; u16 i; u16 temp; //取CSD 信息,如果期间出错,返回0 if(SD_GetCSD(csd)!=0) return 0; //如果为SDHC 卡,按照下面方式计算 if((csd[0]&0xC0)==0x40) { Capacity=((u32)csd[8])<<8; Capacity+=(u32)csd[9]+1;Capacity = (Capacity)*1024;//得到扇区数 Capacity*=512;//得到字节数 } else{ i = csd[6]&0x03; i<<=8; i += csd[7]; i<<=2; i += ((csd[8]&0xc0)>>6); //C_SIZE_MULT r1 = csd[9]&0x03; r1<<=1; r1 += ((csd[10]&0x80)>>7); r1+=2;//BLOCKNR temp = 1; while(r1)308{temp*=2; r1--; } Capacity = ((u32)(i+1))*((u32)temp); // READ_BL_LEN i = csd[5]&0x0f; //BLOCK_LEN temp = 1; while(i) {temp*=2; i--; }//The final resultCapacity *= (u32)temp;//字节为单位 }return (u32)Capacity; }//读SD 卡的一个block//输入:u32 sector 取地址(sector 值,非物理地址) // u8 *buffer 数据存储地址(大小至少512byte) //返回值:0: 成功 // other:失败u8 SD_ReadSingleBlock(u32 sector, u8 *buffer) { u8 r1; //设置为高速模式SPIx_SetSpeed(SPI_SPEED_4);//如果不是SDHC,给定的是sector 地址,将其转换成byte 地址 if(SD_Type!=SD_TYPE_V2HC) {sector = sector<<9; } r1 = SD_SendCommand(CMD17, sector, 0);//读命令 if(r1 != 0x00)return r1; r1 = SD_ReceiveData(buffer, 512, RELEASE); if(r1 != 0)return r1; //读数据出错! else return 0; }/////////////////下面2个函数为USB 读写所需要的/////////////////////////309//定义SD 卡的块大小 #define BLOCK_SIZE 512 //写入MSD/SD 数据 //pBuffer:数据存放区 //ReadAddr:写入的首地址//NumByteToRead:要写入的字节数 //返回值:0,写入完成 // 其他,写入失败u8 MSD_WriteBuffer(u8* pBuffer, u32 WriteAddr, u32 NumByteToWrite) { u32 i,NbrOfBlock = 0, Offset = 0; u32 sector; u8 r1;NbrOfBlock = NumByteToWrite / BLOCK_SIZE;//得到要写入的块的数目 SD_CS=0; while (NbrOfBlock--)//写入一个扇区 { sector=WriteAddr+Offset; if(SD_Type==SD_TYPE_V2HC)sector>>=9;//执行与普通操作相反的操作r1=SD_SendCommand_NoDeassert(CMD24,sector,0xff);//写命令 if(r1) { SD_CS=1; return 1;//应答不正确,直接返回 } SPIx_ReadWriteByte(0xFE);//放起始令牌0xFE //放一个sector 的数据 for(i=0;i<512;i++)SPIx_ReadWriteByte(*pBuffer++); //发2个Byte 的dummy CRC SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); if(SD_WaitDataReady())//等待SD 卡数据写入完成 { SD_CS=1; return 2; } Offset += 512; }//写入完成,片选置1 SD_CS=1;SPIx_ReadWriteByte(0xff); return 0;310}//读取MSD/SD 数据 //pBuffer:数据存放区 //ReadAddr:读取的首地址//NumByteToRead:要读出的字节数 //返回值:0,读出完成 // 其他,读出失败u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead) { u32 NbrOfBlock=0,Offset=0; u32 sector=0; u8 r1=0;NbrOfBlock=NumByteToRead/BLOCK_SIZE; SD_CS=0; while (NbrOfBlock --) { sector=ReadAddr+Offset; if(SD_Type==SD_TYPE_V2HC)sector>>=9;//执行与普通操作相反的操作 r1=SD_SendCommand_NoDeassert(CMD17,sector,0xff);//读命令if(r1)//命令发送错误 {SD_CS=1; return r1; } r1=SD_ReceiveData(pBuffer,512,RELEASE); if(r1)//读数错误 {SD_CS=1; return r1; } pBuffer+=512; Offset+=512; } SD_CS=1;SPIx_ReadWriteByte(0xff); return 0; }////////////////////////////////////////////////////////////////////////// //写入SD 卡的一个block(未实际测试过)//输入:u32 sector 扇区地址(sector 值,非物理地址)311// u8 *buffer 数据存储地址(大小至少512byte) //返回值:0: 成功 // other:失败u8 SD_WriteSingleBlock(u32 sector, const u8 *data) {u8 r1; u16 i; u16 retry;//设置为高速模式//SPIx_SetSpeed(SPI_SPEED_HIGH);//如果不是SDHC,给定的是sector 地址,将其转换成byte 地址 if(SD_Type!=SD_TYPE_V2HC) {sector = sector<<9; }r1 = SD_SendCommand(CMD24, sector, 0x00); if(r1 != 0x00) {return r1; //应答不正确,直接返回 }//开始准备数据传输 SD_CS=0;//先放3个空数据,等待SD 卡准备好 SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); //放起始令牌0xFESPIx_ReadWriteByte(0xFE);//放一个sector 的数据 for(i=0;i<512;i++) {SPIx_ReadWriteByte(*data++); }//发2个Byte 的dummy CRC SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff);//等待SD 卡应答r1 = SPIx_ReadWriteByte(0xff);312if((r1&0x1F)!=0x05) {SD_CS=1; return r1; }//等待操作完成 retry = 0;while(!SPIx_ReadWriteByte(0xff)) {retry++;if(retry>0xfffe) //如果长时间写入没有完成,报错退出 {SD_CS=1;return 1; //写入超时返回1 } }//写入完成,片选置1 SD_CS=1;SPIx_ReadWriteByte(0xff);return 0; }//读SD 卡的多个block(实际测试过)//输入:u32 sector 扇区地址(sector 值,非物理地址) // u8 *buffer 数据存储地址(大小至少512byte) // u8 count 连续读count 个block //返回值:0: 成功 // other:失败u8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count) {u8 r1;//SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式 //如果不是SDHC,将sector 地址转成byte 地址 if(SD_Type!=SD_TYPE_V2HC)sector = sector<<9; //SD_WaitDataReady(); //发读多块命令 r1 = SD_SendCommand(CMD18, sector, 0);//读命令 if(r1 != 0x00)return r1; do//开始接收数据 {if(SD_ReceiveData(buffer, 512, NO_RELEASE) != 0x00)break;313buffer += 512; } while(--count); //全部传输完毕,发送停止命令 SD_SendCommand(CMD12, 0, 0); //释放总线 SD_CS=1;SPIx_ReadWriteByte(0xFF);if(count != 0)return count; //如果没有传完,返回剩余个数 else return 0; } //写入SD 卡的N 个block(未实际测试过) //输入:u32 sector 扇区地址(sector 值,非物理地址) // u8 *buffer 数据存储地址(大小至少512byte) // u8 count 写入的block 数目 //返回值:0: 成功 // other:失败u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count) {u8 r1;u16 i;//SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector 地址,将其转换成byte 地址if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC 卡,启用ACMD23指令使能预擦除r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令 if(r1 != 0x00)return r1; //应答不正确,直接返回 SD_CS=0;//开始准备数据传输SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD 卡准备好 SPIx_ReadWriteByte(0xff);//--------下面是N 个sector 写入的循环部分 do {//放起始令牌0xFC 表明是多块写入 SPIx_ReadWriteByte(0xFC); //放一个sector 的数据 for(i=0;i<512;i++) {SPIx_ReadWriteByte(*data++); }//发2个Byte 的dummy CRC SPIx_ReadWriteByte(0xff);314SPIx_ReadWriteByte(0xff);//等待SD 卡应答r1 = SPIx_ReadWriteByte(0xff); if((r1&0x1F)!=0x05) {SD_CS=1; //如果应答为报错,则带错误代码直接退出 return r1; }//等待SD 卡写入完成if(SD_WaitDataReady()==1) {SD_CS=1; //等待SD 卡写入完成超时,直接退出报错 return 1; }}while(--count);//本sector 数据传输完成 //发结束传输令牌0xFDr1 = SPIx_ReadWriteByte(0xFD); if(r1==0x00) {count = 0xfe; }if(SD_WaitDataReady()) //等待准备好 { SD_CS=1; return 1; }//写入完成,片选置1 SD_CS=1;SPIx_ReadWriteByte(0xff);return count; //返回count 值,如果写完则count=0,否则count=1 } //在指定扇区,从offset 开始读出bytes 个字节 //输入:u32 sector 扇区地址(sector 值,非物理地址) // u8 *buf 数据存储地址(大小<=512byte) // u16 offset 在扇区里面的偏移量 // u16 bytes 要读出的字节数 //返回值:0: 成功 // other:失败u8 SD_Read_Bytes(unsigned long address,unsigned char *buf,unsigned int offset,unsigned int bytes){315u8 r1;u16 i=0;r1=SD_SendCommand(CMD17,address<<9,0);//发送读扇区命令if(r1)return r1; //应答不正确,直接返回SD_CS=0;//选中SD 卡if(SD_GetResponse(0xFE))//等待SD 卡发回数据起始令牌0xFE{SD_CS=1; //关闭SD 卡return 1;//读取失败}for(i=0;i<offset;i++)SPIx_ReadWriteByte(0xff);//跳过offset 位for(;i<offset+bytes;i++)*buf++=SPIx_ReadWriteByte(0xff);//读取有用数据for(;i<512;i++) SPIx_ReadWriteByte(0xff); //读出剩余字节SPIx_ReadWriteByte(0xff);//发送伪CRC 码SPIx_ReadWriteByte(0xff);SD_CS=1;//关闭SD 卡return 0;}此部分代码我们在本节主要用到的就是SD 卡初始化函数SD_Init 和SD 卡读取函数SD_ReadSingleBlock,通过前面的介绍,相信大家不难理解,这里我们就不多说了,接下来保存MMC_SD.C 文件,并加入到HARDWARE 组下,然后打开MMC_SD.H ,在该文件里面输入如下代码:#ifndef _MMC_SD_H_#define _MMC_SD_H_#include <stm32f10x_lib.h>//Mini STM32开发板//SD 卡 驱动//正点原子@ALIENTEK//2010/6/13//SD 传输数据结束后是否释放总线宏定义#define NO_RELEASE 0#define RELEASE 1// SD 卡类型定义#define SD_TYPE_MMC 0#define SD_TYPE_V1 1#define SD_TYPE_V2 2#define SD_TYPE_V2HC 4// SD 卡指令表#define CMD0 0 //卡复位#define CMD1 1#define CMD9 9 //命令9 ,读CSD 数据#define CMD10 10 //命令10,读CID 数据#define CMD12 12 //命令12,停止数据传输316#define CMD16 16 //命令16,设置SectorSize 应返回0x00#define CMD17 17 //命令17,读sector#define CMD18 18 //命令18,读Multi sector#define ACMD23 23 //命令23,设置多sector 写入前预先擦除N 个block#define CMD24 24 //命令24,写sector#define CMD25 25 //命令25,写Multi sector#define ACMD41 41 //命令41,应返回0x00#define CMD55 55 //命令55,应返回0x01#define CMD58 58 //命令58,读OCR 信息#define CMD59 59 //命令59,使能/禁止CRC ,应返回0x00//数据写入回应字意义#define MSD_DATA_OK 0x05#define MSD_DATA_CRC_ERROR 0x0B#define MSD_DATA_WRITE_ERROR 0x0D#define MSD_DATA_OTHER_ERROR 0xFF//SD 卡回应标记字#define MSD_RESPONSE_NO_ERROR 0x00#define MSD_IN_IDLE_STATE 0x01#define MSD_ERASE_RESET 0x02#define MSD_ILLEGAL_COMMAND 0x04#define MSD_COM_CRC_ERROR 0x08#define MSD_ERASE_SEQUENCE_ERROR 0x10#define MSD_ADDRESS_ERROR 0x20#define MSD_PARAMETER_ERROR 0x40#define MSD_RESPONSE_FAILURE 0xFF//这部分应根据具体的连线来修改!//Mini STM32使用的是PA3作为SD 卡的CS 脚.#define SD_CS PAout(3) //SD 卡片选引脚extern u8 SD_Type;//SD 卡的类型//函数申明区u8 SD_WaitReady(void); //等待SD 卡就绪u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD 卡发送一个命令u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc);u8 SD_Init(void); //SD 卡初始化u8 SD_Idle_Sta(void); //设置SD 卡到挂起模式u8 SD_ReceiveData(u8 *data, u16 len, u8 release);//SD 卡读数据u8 SD_GetCID(u8 *cid_data); //读SD 卡CIDu8 SD_GetCSD(u8 *csd_data); //读SD 卡CSD u32 SD_GetCapacity(void); //取SD 卡容量//USB 读卡器 SD 卡操作函数u8 MSD_WriteBuffer(u8* pBuffer, u32 WriteAddr, u32 NumByteToWrite);u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead);317u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sectoru8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sectoru8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sectoru8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count);//写多个sectoru8 SD_Read_Bytes(unsigned long address,unsigned char *buf,unsigned intoffset,unsigned int bytes);//读取一byte#endif该部分代码主要是一些命令的宏定义以及函数声明,在这里我们设定了SD 卡的CS 管脚为PA3。