SD卡引脚及spi模式基本操作过程
SD卡引脚及spi模式基本操作过程
SD卡引脚及spi模式基本操作过程注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出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方式进行介绍。
SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。
从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。
然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。
SPI接口的选用是在上电初始时向其写入第一个命令时进行的。
以下介绍SD卡的驱动方法,只实现简单的扇区读写。
1)命令与数据传输写命令的例程:C程序//-------------------------------------------------------------------------向SD卡中写入命令,并返回回应的第二个字节//-------------------------------------------------------------------------unsignedchar Write_Command_SD(unsignedchar*CMD){unsignedchar tmp;unsignedchar retry=0;unsignedchar i;//禁止SD卡片选SPI_CS=1;//发送8个时钟信号Write_Byte_SD(0xFF);//使能SD卡片选SPI_CS=0;//向SD卡发送6字节命令for(i=0;i<0x06;i++){Write_Byte_SD(*CMD++);}//获得16位的回应Read_Byte_SD();//readthefirstbyte,ignoreit.do{//读取后8位tmp=Read_Byte_SD();retry++;}while((tmp==0xff)&&(retry<100));return(tmp);}初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。
SD卡的SPI模式的初始化顺序
SD卡的SPI模式的初始化顺序这些天没有出门,一直在家研究SD卡的SPI模式的初始化顺序,这里为大家总结了一下编写该程序所需要的知识:1.SD卡的官方资料SD卡的官方资料(我承认这个资料很垃圾,比起民间的技术总结它的内容可谓又臭又长,但是作为基础也要了解一下,SD协议不用看)2.清晰明了的MMC卡时序图清晰明了的MMC卡时序图(虽然这个是MMC卡的,但是在初始化的时候CMD0的时序是一样的) 电路:我用的SD卡的电路其实很简单,参考SD卡的官方资料中的电路链接就可以的。
供电问题:由于SD卡的电压是3.3V,所以你的CPU必须支持3.3V的IO端口输出。
再来说一说鸡毛蒜皮的细节:1.为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用)。
2.为什么在使用CMD0以后不使用CMD1?CMD1是MMC卡使用的指令,虽然本文并不想讨论MMC卡的问题,但是我还是要说:为了实现兼容性,上电或者发送CMD0后,应该首先发送CMD55+ACMD41确认是否有回应,如果有回应则为SD卡,如果等回应超时,则可能是MMC卡,再发CMD1确认。
3.正确的回应内容应该是:CMD0——0x01(SD卡处于in-idle-state)CMD55——0x01(SD卡处于in-idle-state)ACMD41——0x00(SD卡跳出in-idle-state,完成初始化准备接受下一条指令)这里要说的是如果最后的回应内容还是0x01的话,可以循环发送CMD55+ACMD41,直到回应的内容0x00。
4.在所有的指令中,唯独CMD0特殊,在向SD卡发送以前需要向SD卡发送74+个时钟。
那么为什么要74个CLK呢?因为在上电初期,电压的上升过程据SD卡组织的计算约合64个CLK周期才能到达SD卡的正常工作电压他们管这个叫做Supply ramp up time,其后的10个CLK是为了与SD卡同步,之后开始CMD0的操作,严格按照此项操作,一定没有问题。
sd卡读写模块的用法
sd卡读写模块的用法
SD卡读写模块是一种用于读写SD卡存储设备的模块。
它通常通过SPI或SDIO接口与主控制器(如单片机、开发板等)连接,并提供读
取和写入SD卡的功能。
使用SD卡读写模块的步骤如下:
1.初始化:通过控制模块的引脚,配置SPI或SDIO接口的工作模
式和相关参数。
2.卡插入检测:通过检测SD卡插槽的接触状态,确定是否插入了SD卡。
3.卡初始化:对SD卡进行初始化操作,包括发送命令和接收响应,以确认SD卡的类型和性能等信息。
4.数据读取:发送读取命令和地址,接收SD卡返回的数据。
5.数据写入:发送写入命令和地址,将数据写入SD卡的指定块位置。
在使用SD卡读写模块时,我们还可以拓展以下几个方面:
1.多线程读写:通过同时使用多个SPI或SDIO接口,实现多个线程同时读写SD卡,提高数据传输速度。
2. SD卡文件系统:在SD卡中创建文件系统(如FAT32),将数据按照文件的形式进行存储和管理,提供更加灵活和高效的数据存储方式。
3.数据加密:将敏感的数据进行加密后再写入SD卡,防止数据泄露和篡改。
4.文件压缩:在将数据写入SD卡之前,使用压缩算法(如ZIP)对数据进行压缩,减小存储空间占用。
5.数据校验:在读取或写入数据时,进行校验(如CRC校验)以确保数据的完整性和准确性。
总之,SD卡读写模块的使用方式可以根据具体需求进行拓展,以实现更多功能和提升性能。
基于stm32f103对sd卡底层的基本操作方法
基于stm32f103对sd卡底层的基本操作方法基于STM32F103的SD卡底层操作方法是指通过STM32F103系列微控制器来对SD卡进行读写操作的一组基本方法。
本文将详细介绍如何配置STM32F103的SPI接口和相关寄存器,以及如何使用SPI接口与SD卡进行通信和文件操作。
一、硬件连接首先,需要连接STM32F103与SD卡之间的硬件接口。
STM32F103的SPI接口包括四根引脚,分别是NSS(片选信号)、SCK(时钟信号)、MISO(数据输入信号)和MOSI(数据输出信号)。
通常,可以将SD卡的NSS引脚连接到STM32F103的任一GPIO引脚上作为片选信号,并通过软件控制片选信号的高低电平来选择SD卡进行读写操作。
此外,还需要将SD卡的SCK、MISO和MOSI引脚分别连接到STM32F103的SPI接口的SCK、MISO和MOSI引脚上。
为了方便起见,可以直接使用STM32F1的SPI中的SPI1进行配置。
二、SPI接口配置在STM32F103中,SPI接口由SPI1、SPI2和SPI3三个外设实现,其中SPI1位于APB2总线上,SPI2和SPI3位于APB1总线上。
在本文中,我们将使用SPI1进行SD卡的底层操作。
首先,需要在CubeMX中将SPI1的NSS、SCK、MISO和MOSI引脚分别配置为GPIO输出、SPI时钟、SPI数据输入和SPI数据输出功能。
然后,需要配置SPI1的时钟分频系数、数据位数、传输模式等参数。
SPI1的时钟分频系数由BDIV和BR两个参数决定,其中BDIV位于SPI1->CR1寄存器的位6-7位,用于设定SPI1主频的1/2、1/4、1/8还是1/16,BR位于SPI1->CR1寄存器的位3-5位,用于设定SPI1的分频系数。
根据SD卡的时钟特性,一般选择SPI1的分频系数为sclk/32,其中sclk为主控芯片时钟。
在SPI接口配置完成之后,需要打开SPI1外设时钟使能,并设置SPI1的工作模式、数据位数等参数。
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卡引脚及spi模式基本操作过程
SD卡引脚及spi模式基本操作过程(摘自网络)对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
SD卡的引脚定义SD卡引脚功能详述:引脚编号SD模式SPI模式名称类型描述名称类型描述1 CD/DAT3 IO或PP 卡检测/数据线3#CS I 片选2 CMD PP 命令/回应DI I 数据输入3 VSS1 S 电源地VSS S 电源地4 VDD S 电源VDD S 电源5 CLK I 时钟SCLK I 时钟6 VSS2 S 电源地VSS2 S 电源地7 DAT0 IO或PP 数据线0 DO O或PP 数据输出8 DAT1 IO或PP 数据线1 RSV9 DAT2 IO或PP 数据线2 RSV注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出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方式进行介绍。
SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。
从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。
然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。
SPI模式下对SD卡的操作
SPI模式下对SD卡的操作STM32的SPI设备简介:STM32F107VC有3个SPI设备,SPI控制器在输出数据的同时采样输入数据,使用相同时钟线。
Master设备写操作的同时,读入寄存器同时采样填充,每次也需要清空寄存器。
Master设备的读操作,实际上是通过写数据输出时钟序列,采样MISO的信号。
SD卡简介:SD卡的技术规范经过几次升级,与最初版本已有很大不同,本文基于Ver 3.01讨论从容量上分SD卡支持SPI的Mode0和Mode3SD卡支持50MHz总线,STM32的APB2总线最高72MHz,SPI分频?为36Mhz,理论上所有SD卡都可以正常操作,实际上一些低版本的卡缺乏稳定性插入信号CD:CD线是可选的信号线,没有卡时为高电位,有卡插入时CD为低电位电位稳定延迟:CS线为高的状态下输出若干时钟,延迟利于电位稳定SD卡的准备状态,初始化操作:SD卡从上电到可读写状态需要一定序列命令的操作,这个过程包括选择SPI模式和判断卡的版本以及供电操作SD规范中的流程图CMD0SD卡上电后使用CMD0进入SPI模式,CMD0的返回值是1字节的R1,R1应该为空闲0x01CMD8版本2.0以上的SD卡支持CMD8命令,包括大部分SDHC的卡和所有SDXC卡,早期的SDHC卡有可能仍属于V1.0卡命令返回值R7,第一字节为R1,Ver1.0的卡对R1的“非法命令”位2置位,Ver2.0以上卡应返回0x01ACMD41和CMD1ACMD41是为卡供电命令,供电前卡的状态为空闲(idle),R1的返回值为0x01,供电后为动作状态(ready)一些早期的卡认为ACMD41是非法命令,只能用MMC的CMD1命令供电CMD58CMD58读取卡的状态,一个重要的标志位CCS,会影响到读写操作中地址数据的设定CCS为1时为高版本卡,数据地址为页单位,512字节为一页CCS为0时,地址为以字节为单位实际地址CCS置位与否也取决于ACMD41中对HCS:30bit的置位请求CMD9取得卡容量等信息,CSO寄存器,CSO是16个字节的结构体,加上2字节的CRC,应读取18字节的内容卡的信息也有版本区别,需要分别处理CMD24 CMD17CMD24写数据CMD17读数据SD的读写都要以页单位进行,无论是否是新版本。
SD卡接口设计[附硬件电路和程序]
SD卡接口设计[附硬件电路和程序]1标准SD卡标准是SD卡协会针对可移动存储设备设计专利并授权的一种标准,主要用于制定卡的外形尺寸、电气接口和通信协议。
1.1SD卡引脚功能SD卡的外形如图1所示,引脚功能如表1所列。
SD卡的引脚具有双重功能,既可工作在SD模式,也可工作在SPI模式。
不同的模式下,引脚的功能不同。
SD模式多用于对SD卡读写速度要求较高的场合,SPI模式则是以牺牲读写速度换取更好的硬件接口兼容性。
由于SPI协议是目前广泛流行的通信协议,大多数高性能单片机都配备了SPI硬件接口,硬件连接相对简单,因此,在对SD卡读写速度要求不高的情况下,采用SPI模式无疑是一个不错的选择。
1.2SPI模式SPI模式是一种简单的命令响应协议,主控制器发出命令后,SD卡针对不S同的命令返回对应的响应。
SD卡的命令列表都是以CMD和ACMD开头,分别指通用命令和专用命令,后面接命令的编号。
例如,CMD17就是一个通用命令,用来读单块数据。
在SPI模式中,命令都是以如下的6字节形式发送的:每帧命令都以“01”开头,然后是6位命令号和4字节的参数(高位在前,低位在后),最后是7位CRC校验和1位停止位“1”。
SD卡的每条命令都会返回对应的响应类型。
在SPI模式下,共有3种响应类型:R1、R2和R3,分别占1、2和3个字节。
这里仅列出了R1响应的格式,如表2所列。
当出现表中所描述的状态时,相应的位置1。
R2和R3的第1个字节格式与R1完全一样,详细内容请参考SD卡标准。
2硬件设计本设计选用Freescale公司的32位低功耗微控制器MCF51QE128,采用SPI模式实现与SD卡的接口。
由于MCF51QE128是一款低功耗的微控制器,工作电压的典型值为3.6V,与SD卡的工作电压兼容,因而可以直接与SD卡连接,无需电平转换电路。
这里选用的是MCF51QE128的第2个SPI口,硬件连接如图2所示。
3软件实现软件部分主要实现MCF51QE128的初始化、底层SPI通信,以及SD卡的通用写命令、初始化和单块数据的读写等功能。
MicroSD卡(TF卡)spi模式实现方法
Micro SD 卡(TF卡)spi 模式实现方法现在我们手机的内存卡多为Micro SD卡,又叫TF卡,所以Micro SD卡比SD卡常见。
自己曾经也想写写SD卡的读取程序,但又不想特地再去买个SD卡,这时想起手机内存卡不是和SD卡很像吗?在网上查了以后发现SD卡和Micro SD卡其实也就大小和引脚不一样,它们的操作其实是一样的,所以网上的SD卡读写代码其实可以直接拿来用。
关于SD卡和Micro SD卡的引脚定义和不同可见下两表:我们可以发现Micro SD卡只有8个引脚是因为比SD卡少了一个Vss。
当然你也可以买个卡套套在Micro SD卡上,这样一来大小就和SD卡一样大,这时候卡套上的9个引脚就和SD卡一样了,你可以完全当做SD卡来操作。
spi下电路的连接非常简单,接上电源线Vdd和地线Vss,再接上spi的CS,SCLK,DI(MOSI)和DO(MISO)就可以了,其他引脚可以放空。
注意SD卡的电源和操作电压都为2.7-3.6V,5V的单片机要进行电平转换或串电阻限流。
还有记得SD卡的CS,SCLKh和DI要用10~100K的电阻上拉。
我是套了卡套接的电路,因为Micro SD卡的引脚太密了,不好焊接,SD卡相对引脚好焊。
因为没有卡座,而且也没专门的PCB我就直接焊到卡套上,诶牺牲了一个卡套。
下面是我自己画的电路图:上面Micro SD卡的硬件电路就好了,下面我们讲讲Micro SD卡的软件驱动和指令集。
SD卡的命令格式如下,6字节共48位,传输时最高位(MSB)先传输:SD卡的command(命令)占6 bit,一般叫CMDx或ACMDx,比如CMD1就是1,CMD13就是13,ACMD41就是41,依此类推。
Command Argument(命令参数)占4 byte,并不是所有命令都有参数,没有参数的话该位一般就用置0。
最后一个字节由7 bit CRC校验位和1 bit停止位组成。
SD卡引脚及spi模式基本操作过程精编版
SD卡引脚及spi模式基本操作过程(摘自网络)对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
SD卡的引脚定义SD卡引脚功能详述:引脚编号SD模式SPI模式名称类型描述名称类型描述1 CD/DAT3 IO或PP 卡检测/数据线3#CS I 片选2 CMD PP 命令/回应DI I 数据输入3 VSS1 S 电源地VSS S 电源地4 VDD S 电源VDD S 电源5 CLK I 时钟SCLK I 时钟6 VSS2 S 电源地VSS2 S 电源地7 DAT0 IO或PP 数据线0 DO O或PP 数据输出8 DAT1 IO或PP 数据线1 RSV9 DAT2 IO或PP 数据线2 RSV注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出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方式进行介绍。
SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。
从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。
然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。
stm32SPI模式读写SD卡
stm32SPI模式读写SD卡SPI模式读写SD卡SD卡初始化过程:1. 初始化STM32的SPI接口使用低速模式2. 延时至少74clock3. 发送CMD0,需要返回0x01,进入Idle状态4. 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态5. 设置读写block大小为512byte5. 把STM32的SPI设置为高速模式读一个block块的过程1. 发送CMD17(单块)或CMD18(多块)读命令,返回0x002. 接收数据开始令牌0xfe + 正式数据512Bytes + CRC 校验2Bytes写一个block块的过程1. 发送CMD24(单块)或CMD25(多块)写命令,返回0x002. 发送数据开始令牌0xfe + 正式数据512Bytes + CRC校验2Bytes/******************************************************************* ************* Function Name : SD_MMC_SPI_Init* Description : SD_MMC_SPI_Init* Input : None* Output : None* Return : zero init success, non-zero init error************************************************************************ *******/u8 SD_MMC_SPI_Init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable SPI1 and GPIO clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE);/* Configure SPI1 pins: SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure SD_MMC_SPI_CS */GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SD_MMC_SPI_CS, &GPIO_InitStructure);///////////////////////////////////////////////////////////////////////////////* initialize SPI with lowest frequency */SD_MMC_Low_Speed();/* card needs 74 cycles minimum to start up */for(u8 i = 0; i < 10; ++i) {/* wait 8 clock cycles */ SD_MMC_ReadWrite_Byte(0x00); } /* address card */ SD_MMC_SPI_SELECT();/* reset card */u8 response;for(u16 i = 0; ; ++i){response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE ,0 );if( response == 0x01 ) break;if(i == 0x1ff) {SD_MMC_SPI_DESELECT(); return 1;}}/* wait for card to get ready */ for(u16 i = 0; ; ++i) {response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);if(!(response & (1 << R1_IDLE_STATE)))break;if(i == 0x7fff) {SD_MMC_SPI_DESELECT(); return 1;}}/* set block size to 512 bytes */if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512)) {SD_MMC_SPI_DESELECT();return 1;}/* deaddress card */SD_MMC_SPI_DESELECT();/* switch to highest SPI frequency possible */ SD_MMC_High_Speed();return 0;//////////////////////////////////////////////////////////////////// //////////}/******************************************************************* ************* Function Name : SD_MMC_Read_Single_Block * Description :SD_MMC_Read_Single_Block * Input : sector number and buffer data point * Output : None* Return : zero success, non-zero error************************************************************************ *******/u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer) {u8 Response;u16 i;u16 Retry = 0;//读命令 send read commandResponse =SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9); if(Response != 0x00)return Response;SD_MMC_SPI_SELECT();// start byte 0xfewhile(SD_MMC_ReadWrite_Byte(0xff) != 0xfe) {if(++Retry > 0xfffe){SD_MMC_SPI_DESELECT();return 1; //timeout}}for(i = 0; i < 512; ++i) {//读512个数据*buffer++ = SD_MMC_ReadWrite_Byte(0xff); }SD_MMC_ReadWrite_Byte(0xff); //伪crcSD_MMC_ReadWrite_Byte(0xff); //伪crcSD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff); // extra 8 CLKreturn 0;}/******************************************************************* ************* Function Name : SD_MMC_Write_Single_Block* Description : SD_MMC_Write_Single_Block * Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error.************************************************************************ *******/u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer) {u8 Response;u16 i;u16 retry=0;//写命令 send write commandResponse =SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, sector<<9);if(Response != 0x00)return Response;SD_MMC_SPI_SELECT();SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);//发开始符 start byte 0xfeSD_MMC_ReadWrite_Byte(0xfe);//送512字节数据 send 512 bytes datafor(i=0; i<512; i++){SD_MMC_ReadWrite_Byte(*buffer++);}SD_MMC_ReadWrite_Byte(0xff); //dummy crc SD_MMC_ReadWrite_Byte(0xff); //dummy crcResponse = SD_MMC_ReadWrite_Byte(0xff);//等待是否成功 judge if it successfulif( (Response&0x1f) != 0x05){SD_MMC_SPI_DESELECT();return Response;}//等待操作完 wait no busywhile(SD_MMC_ReadWrite_Byte(0xff) != 0x00) {if(retry++ > 0xfffe){SD_MMC_SPI_DESELECT();return 1;}}SD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff);// extra 8 CLKreturn 0;}if( SD_MMC_SPI_Init() ==1)printf(" _SD_MMC Initialization ERROR\r\n"); else{printf(" _SD_MMC Initialization OK\r\n"); //memset(buffer,0,512); //读取一个扇区的内容这里读的是0扇区SD_MMC_Read_Single_Block( 0 , buffer );Uart1_PutString( buffer , 512 );}。
51单片机SD卡SPI模式操作
脚
s卡 的命 令格式 固定 为6 字节4 个位 ,其格式如 d 个 8
图3 所示 。
l】 , ! 矗=为 I说 明 帆 持 s 的 命 々 j d 、 …
s d模式 韩 ≯
( m^ A m T3
S i投式 p 类 型
10 P /
;
描述
书柠 翊 暂 掘 线 3
一
盛卷
器
—
]
J f
一
i
k
三、 1 5 单片机与s 卡在s i d p模式下的连接
由于5 单片机 内部没有集成sj 块 ,使用5 单片 1 p 模 1
机 与s卡通讯 要用5 单片机 的1 d 1 0口模 拟si p时序 ,原 则 上 5 单片 机 的P 、 1P 、3 1 0 P 、2 P 口的任 意位都 可 以与s 卡 d S 卡的内部结 构如图2 示 ,主要有 四部分组成 , D 所
名字
C S
类 型
批 述
片选
凿
互面五 二 蓟
— —— —— —— — — —— —— —— 一 心氍 艘 ; s个 位 . M 6 — — — 04 p
j —— — — —— —— — —— —— — — —- 一 -
命 令/ 反漩
电源地
~ ) S } 源
的, 两种模式下具有相 同的命令 。
连, 其接 口端定义如表1 所示 。s卡有两种操作模式 , d 一 种是s模式 , d 另一种是si p 模式 , 同模式下端 口的定 义 不 不同。s 模式有一个时钟线 、 D 一个命令饭 馈线 、 四根输 入/ 出信号线 、 输 两个 电源地和一个 电源 , 所有九根线都
51单片机SD卡SPI模式操作_1568
【51单片机SD卡SPI模式操作】摘要:sd卡有两种接口模式,一种是sd模式,另一种是spi模式。
在spi模式下,有六根接口线与主机相连,5V电平的51单片机通过电平转换可与3.3V电平的sd卡相连接。
51单片机没有专门的spi总线,可以用51单片机的IO口来模拟spi总结时序。
主机与sd卡的数据交换主要通过命令来实现,通过发送cmd0命令对sd卡进行复位,发送命令cmd1实现sd卡的spi模式初始化。
cmd17、cmd18命令是sd卡的读写扇区命令,对sd卡的操作是严格按照时序进行的。
关键词:sd卡;spi接口;时序sd卡以其大容量、低成本、携带方便、存储数据简单和安全可靠性高被大量应用于数码电子设备中,比如数码相机、数码摄像机、mp3、pda、电子学习机、电子图书等。
对sd卡的操作有复位、初始化、读写等,下面以本人掌握的材料对sd卡的操作进行分析。
一、sd卡的结构sd卡的外形与接口如图1,它有9个接点与主机相连,其接口端定义如表1所示。
sd卡有两种操作模式,一种是sd模式,另一种是spi模式,不同模式下端口的定义不同。
SD模式有一个时钟线、一个命令/反馈线、四根输入/输出信号线、两个电源地和一个电源,所有九根线都有定义,数据传输速率较快。
SPI模式只用到CS片选、数据输入、数据输出、时钟、电源地及电源六根线。
SPI模式较SD模式速度较慢,但很多单片机都有专用的SPI总线,可与sd卡直接相连,使用方便。
SD卡的内部结构如图2所示,主要有四部分组成,一是接口电路,共有九个接口电路,定义如表1所示。
二是接口控制电路,所有操作都由该控制电路具体去执行。
三是内部寄存器组OCR、CID、RCA等。
四是存储数据的存储单元。
接口电路通过控制电路与内部寄存器组成存储单元交换数据,其主要操作有写命令、读数据、写数据、读状态等。
二、sd卡的命令格式sd卡的命令格式固定为6个字节48个位,其格式如图3所示。
开始位固定为0,第二位固定为1,表示主机给sd卡的命令,然后是6位命令索引号,索引号的大小与索引号数字相同,比如cmd0的索引号为000000,索引号41为101001。
简述SPI的使用流程
简述SPI的使用流程SPI(Serial Peripheral Interface)是一种同步的串行通信接口协议,常用于连接微控制器、传感器、外围设备等。
在SPI通信中,主设备(MCU)控制一个或多个从设备(外设)进行通信。
SPI的使用流程主要包括以下几个步骤:1.硬件连接:首先需要将主设备与从设备通过SPI接口进行连接。
通常,SPI接口包括四根信号线:SCLK(时钟线)、MISO(主设备数据输出从设备数据输入线)、MOSI(主设备数据输入从设备数据输出线)和SS (片选线)。
通过连接这些信号线,主设备与从设备可以进行数据传输和通信。
2.配置主设备:在主设备中,需要配置SPI接口的设置,包括时钟频率、数据传输位序(高位先传输或低位先传输)、数据传输格式(数据位数、数据线的电平极性和相位)等。
这些设置通常由MCU提供的SPI控制寄存器进行配置。
3.初始化从设备:在进行SPI通信之前,需要对从设备进行初始化设置。
这通常涉及到配置从设备的工作模式、使能信号线(如片选线)、设置从设备的地址等。
4.发送数据:主设备通过SPI接口向从设备发送数据。
这需要先选择从设备(通过拉低相应的片选线),然后将待发送的数据写入SPI控制寄存器。
主设备每次发送一个数据字节,等待传输完成后再发送下一个。
5.接收数据:主设备在发送数据的同时,会接收从设备返回的数据。
从设备在接收到主设备的数据后,会将自己的响应数据通过MISO线发送给主设备。
主设备在SPI控制寄存器中可以读取到收到的数据。
6.关闭通信:当通信完成后,可以关闭通信。
通常,需要将片选线恢复为高电平,以完成与从设备的通信。
总结起来,SPI的使用流程可以归纳为硬件连接、配置主设备、初始化从设备、发送数据、接收数据和关闭通信等六个步骤。
其中,主设备通过配置SPI的相关设置和发送数据,从设备通过初始化设置和接收数据来完成通信。
SPI通信具有简洁、高速、性能稳定等特点,广泛应用于各种嵌入式系统中。
SD卡在单片机上的应用以及SD卡引脚电路图及工作原理介绍
SD卡在单片机上的应用以及SD卡引脚电路图及工作原理介绍部门: xxx时间: xxx整理范文,仅供参考,可下载自行编辑SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。
在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。
SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。
既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。
这就要求对SD卡的硬件与读写时序进行研究。
对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
1)SD卡的引脚定义:SD卡引脚功能详述:注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出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方式进行介绍。
b5E2RGbCAP<2)SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。
从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。
然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。
SD卡引脚定义-电路-基本原理
SD卡引脚定义-电路-基本原理SD卡引脚定义-电路-基本原理写命令的例程://----------------------------------------------------------------------------------------------- 向SD卡中写入命令,并返回回应的第二个字节//----------------------------------------------------------------------------------------------- unsigned char Write_Command_SD(unsigned char *CMD){unsigned char tmp;unsigned char retry=0;unsigned char i;//禁止SD卡片选SPI_CS=1;//发送8个时钟信号Write_Byte_SD(0xFF);//使能SD卡片选SPI_CS=0;//向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卡的标识码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SD卡引脚及spi模式基本操作过程(摘自网络)对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。
要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。
下面先来讲解SD卡的读写时序。
SD卡的引脚定义SD卡引脚功能详述:引脚编号SD模式SPI模式名称类型描述名称类型描述1 CD/DAT3 IO或PP 卡检测/数据线3#CS I 片选2 CMD PP 命令/回应DI I 数据输入3 VSS1 S 电源地VSS S 电源地4 VDD S 电源VDD S 电源5 CLK I 时钟SCLK I 时钟6 VSS2 S 电源地VSS2 S 电源地7 DAT0 IO或PP 数据线0 DO O或PP 数据输出8 DAT1 IO或PP 数据线1 RSV9 DAT2 IO或PP 数据线2 RSV注:S:电源供给I:输入O:采用推拉驱动的输出PP:采用推拉驱动的输入输出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方式进行介绍。
SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。
从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。
然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。
SPI接口的选用是在上电初始时向其写入第一个命令时进行的。
以下介绍SD卡的驱动方法,只实现简单的扇区读写。
1)命令与数据传输1. 命令传输SD卡自身有完备的命令系统,以实现各项操作。
命令格式如下:命令的传输过程采用发送应答机制,过程如下:每一个命令都有自己命令应答格式。
在SPI模式中定义了三种应答格式,如下表所示:字节位含义1 7 开始位,始终为06 参数错误5 地址错误4 擦除序列错误3 CRC错误2 非法命令1 擦除复位0 闲置状态字节位含义1 7 开始位,始终为06 参数错误5 地址错误4 擦除序列错误3 CRC错误2 非法命令1 擦除复位0 闲置状态2 7 溢出,CSD覆盖6 擦除参数5 写保护非法4 卡ECC失败3 卡控制器错误2 未知错误1 写保护擦除跳过,锁/解锁失败0 锁卡字节位含义1 7 开始位,始终为06 参数错误5 地址错误4 擦除序列错误3 CRC错误2 非法命令初始化时序图:初始化例程:C程序//----------------------------------------------------------初始化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++;与此时序相对应的程序如下:C程序//------------------------------------------------------------读取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);}读取CSDCSD(Card-Specific Data)寄存器提供了读写SD卡的一些信息。
其中的一些单元可以由用户重新编程。
具体的CSD结构如下:名称域数据宽度单元类型 CSD划分CSD结构CSD_STRUCTURE 2 R [127:126]保留- 6 R [125:120]数据读取时间1 TAAC 8 R [119:112]NSAC 8 R [111:104]数据在CLK周期内读取时间2(NSAC*100)最大数据传输率TRAN_SPEED 8 R [103:96]卡命令集合CCC 12 R [95:84]最大读取数据块长READ_BL_LEN 4 R [83:80]允许读的部分块READ_BL_PARTIAL 1 R [79:79]非线写块WRITE_BLK_MISALIGN 1 R [78:78]非线读块READ_BLK_MISALIGN 1 R [77:77]DSR条件DSR_IMP 1 R [76:76]保留- 2 R [75:74]设备容量C_SIZE 12 R [73:62] 最大读取电流@VDD min VDD_R_CURR_MIN 3 R [61:59] 最大读取电流@VDD max VDD_R_CURR_MAX 3 R [58:56] 最大写电流@VDD min VDD_W_CURR_MIN 3 R [55:53] 最大写电流@VDD max VDD_W_CURR_MAX 3 R [52:50] 设备容量乘子C_SIZE_MULT 3 R [49:47] 擦除单块使能ERASE_BLK_EN 1 R [46:46] 擦除扇区大小SECTOR_SIZE 7 R [45:39] 写保护群大小WP_GRP_SIZE 7 R [38:32] 写保护群使能WP_GRP_ENABLE 1 R [31:31] 保留- 2 R [30:29] 写速度因子R2W_FACTOR 3 R [28:26] 最大写数据块长度WRITE_BL_LEN 4 R [25:22] 允许写的部分部WRITE_BL_PARTIAL 1 R [21:21] 保留- 5 R [20:16] 文件系统群FILE_OFRMAT_GRP 1 R/W [15:15] 拷贝标志COPY 1 R/W [14:14] 永久写保护PERM_WRITE_PROTECT 1 R/W [13:13] 暂时写保护TMP_WRITE_PROTECT 1 R/W [12:12] 文件系统FIL_FORMAT 2 R/W [11:10] 保留- 2 R/W [9:8] CRC CRC 7 R/W [7:1]未用,始终为1 - 1 [0:0] 读取CSD 的时序:相应的程序例程如下:C程序//-------------------------------------------------------------------读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;扇区读扇区读是对SD卡驱动的目的之一。