SD卡引脚及spi模式基本操作过程

合集下载

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模式的初始化顺序这些天没有出门,一直在家研究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的操作,严格按照此项操作,一定没有问题。

STM32外设SDIO应用之SD卡

STM32外设SDIO应用之SD卡

STM32外设SDIO 应用之SD 卡一、SD 原理及内部结构SD 卡(Secure Digital Memory Card )是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD 卡允许在两种模式下工作,即SD 模式和SPI 模式。

1、SD 卡内部及引脚示意图:2、SD 模式及SPI 模式引脚名称P i n 3P i n 8P i n 7P i n 6P i n 5P i n 4P i n 2P i n 1P i n 93、Micro SD 引脚示意图及模式区别:二、SD 模式1、STM32的SDIO 适配器原理框图:注:R1b与R1格式相同,但可以选择在数据线上发送一个繁忙信号。

收到这些命令后,依据收到命令之前的状态,卡可能变为繁忙。

主机在收到此响应时应当检测忙状态。

R7中可接受的电压范围定义如下:6、部分命令详解CMD8用于初始化符合物理规范2.00版本的SD存储卡。

当卡处于空闲状态时,CMD8才是有效的。

该命令有两种功能:a.电压检测:检测卡是否能在主机提供的电压下工作b.扩充现有的命令及响应CMD8能通过重新定义某些现有命令的保留位,增加其新的功能。

ACMD41就是被这样被扩展后用于初始化高容量SD存储卡。

其中电源电压定义如下:当卡处于空闲状态,主机应当在发送ACMD41前发送CMD8。

在参数段,电源电压段是主机提供的电压值,而检测模式段可以是任何数值。

若主机支持卡的工作电压,卡会把接收到的电源电压及检测模式数值在命令响应中原样返回给主机。

若主机不支持卡的工作电压,卡不作响应并停留在空闲状态。

分是高容量卡(SDHC)还是标准容量卡(SDSC)。

7、SD卡寄存器SD卡寄存器有:卡识别寄存器(CID),相对卡地址寄存器(RCA),驱动级寄存器(DSR),特殊数据寄存器(CSD),SD卡配置寄存器(SCR),工作状态寄存器(OCR),SD状态寄存器(SSR),卡状态寄存器(CSR)。

6.SD介绍及SPI模式初始化说明

6.SD介绍及SPI模式初始化说明

SD/SDIO的SPI模式1.SPI模式的进入卡处于IDLE状态下,接收到CMD0 +CS=0,卡进入SPI模式;卡在其他状态下,即使接收到CMD0+CS=0,也不一定进入SPI模式;进入SPI模式的两种可能,一是卡上电复位后,二是卡在SD模式下接收到复位命令回到IDLE状态,在前面两种的任何一种情况下,卡接收到CMD0+CS=0即进入SPI 模式。

卡进入SPI模式后,如果再收到CMD0那么卡仍回到IDLE状态,但仍是SPI 模式下的IDLE状态。

如果想要回到SD模式,只有进行断电从启。

2.ACMD41在SPI模式下ACMD41和SD模式下不再一样,此时ACMD41将没有参数,其响应R1的最低位(IN IDLE STATE)在初始化后为1。

当CARD接收到ACMD41,并且已经完成其他的初始化操作后,将此位置低。

HOST发现此位为0时才继续发新的命令;否则循环发ACMD41,直至IN IDLE STATE =0;3.数据校验在SPI模式下默认不进行数据的CRC校验;但是命令和响应中的CRC位仍然保持,只是这些位将作为“DON’T CARE BIE”(不关注位)。

这样做的好处是只支持SPI模式的HOST可以省掉产生CRC和验证CRC的电路部分。

唯一例外的是,在卡的初始状态下,卡处于SD模式,要将卡置于SPI模式下,HOST 需要发固定的数据串0x40, 0x0, 0x0, 0x0, 0x0, 0x95。

卡识别到这个命令后也进入SPI模式,默认情况下也不关注CRC。

如果HOST希望进行CRC保护,那么它可以通过CMD59打开/关闭CRC校验功能。

SD卡SPI模式驱动程序1.SD卡的官方资料(我承认这个资料很垃圾,比起民间的技术总结它的内容可谓又臭又长,但是作为基础也要了解一下,SD协议不用看)2.清晰明了的MMC卡时序图(虽然这个是MMC卡的,但是在初始化的时候CMD0的时序是一样的)电路:我用的SD卡的电路其实很简单,参考SD卡的官方资料中的电路链接就可以的。

基于stm32f103对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)

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卡引脚及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方式,因为它提供更大的总线数据带宽。

SD卡-4

SD卡-4

CS: Host to card Chip Select signal. CLK: Host to card clock signal DataIn: Host to card data signal. DataOut: Card to host data signal
软件设计时, 为了程序的可移 植性和易用性, 将程序分为三 个层次。第一个层次是硬件 抽象层, 第二层是实现访问SD 卡的命令层, 第三层是应用层, 提供给用户或文件系统的接口函数。 硬件抽象层包括访问SD 卡的硬件环境配置、SPI 接口实现通讯 的基本函数以及SPI 中断的处理。 硬件环境配置包括硬件初始化、以及内存变量初始化等。如将单 片机的I/O 端口配置、SD 卡的上电与断开、SD 卡插入是否到 位检测、SD 卡内部寄存器特定参数设置等等。 SPI 接口实现通讯的基本函数, 包括主控制器向SD卡发送一字节 和从SD 卡读取一字节的基本函数, 这是所有SPI通讯的基础。
SD卡的接口可以支持两种操作模式: SD卡模式 SPI模式 主机可以选择其中任一模式,SD卡模式允许4线的高速数 据传输。 SPI模式允许简单通用的SPI通道接口, 这种 模式相对于SD模式的不足之处是丧失了速度。
SD卡模式针脚定义 针脚 名称 1 CD DAT3 2 CMD 3 Vss 4 Vcc 5 CLK 6 Css2 7 DAT0 8 DAT1 9 DAT2
{
SdWriteByte(command|0x40); SdWriteByte(((unsigned char *) & argument)[0]); SdWriteByte(((unsigned char *) & argument)[1]); SdWriteByte(((unsigned char *) & argument)[2]); SdWriteByte(((unsigned char *) & argument)[3]); SdWriteByte(CRC); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S D卡引脚及s p i模式基本操作过程SANY GROUP system office room 【SANYUA16H-注: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模式。

写命令的例程: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卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。

在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。

在初始化成功后,应尽量提高SPI的速率。

在刚开始要先发送至少74个时钟信号,这是必须的。

在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。

随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程:C程序//----------------------------------------------------------初始化SD卡到SPI模式//----------------------------------------------------------unsignedchar SD_Init(){unsignedchar retry,temp;unsignedchar i;unsignedchar CMD[]={0x40,0x00,0x00,0x00,0x00,0x95};SD_Port_Init();//初始化驱动端口Init_Flag=1;//将初始化标志置1for(i=0;i<0x0f;i++){Write_Byte_SD(0xff);//发送至少74个时钟信号读取CSD的时序:相应的程序例程如下:C程序//-------------------------------------------------------------------读SD卡的CSD寄存器共16字节返回0说明读取成功//-------------------------------------------------------------------unsignedchar Read_CSD_SD(unsignedchar*Buffer){//读取CSD寄存器的命令unsignedchar CMD[]={0x49,0x00,0x00,0x00,0x00,0xFF};unsignedchar temp;temp=SD_Read_Block(CMD,Buffer,16);//read16bytesreturn(temp);}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。

如下://----------------------------------------------------------------------//返回//SD卡的容量,单位为M//sectorcountandmultiplierMBareinu08==C_SIZE/(2^(9-C_SIZE_MULT))//SD卡的名称//----------------------------------------------------------------------void SD_get_volume_info(){unsignedchar i;unsignedchar c_temp[5];VOLUME_INFO_TYPESD_volume_Info,*vinf;vinf=&SD_volume_Info;//Initthepointoer;/读取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); //getthenameofthecardRead_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;//endflag}以上程序将信息装载到一个结构体中,这个结构体的定义如下:typedefstruct SD_VOLUME_INFO{//SD/SDCardinfounsignedint size_MB;unsignedchar sector_multiply;unsignedint sector_count;unsignedchar name[6];}VOLUME_INFO_TYPE;扇区读扇区读是对SD卡驱动的目的之一。

SD卡的每一个扇区中有512个字节,一次扇区读操作将把某一个扇区内的512个字节全部读出。

过程很简单,先写入命令,在得到相应的回应后,开始数据读取。

扇区读的时序:扇区读的程序例程:C程序unsignedchar SD_Read_Sector(unsignedlong sector,unsignedchar*buffer){unsignedchar retry;//命令16unsignedchar CMD[]={0x51,0x00,0x00,0x00,0x00,0xFF};unsignedchar temp;//地址变换由逻辑块地址转为字节地址sector=sector<<9;//sector=sector*512CMD[1]=((sector&0xFF000000)>>24);CMD[2]=((sector&0x00FF0000)>>16);CMD[3]=((sector&0x0000FF00)>>8);//将命令16写入SD卡retry=0;do{//为了保证写入命令一共写100次temp=Write_Command_MMC(CMD);retry++;if(retry==100){return(READ_BLOCK_ERROR);//blockwriteError!}}while(temp!=0);//ReadStartByteformMMC/SD-Card(FEh/StartByte)//Nowdataisready,youcanreaditout.while(Read_Byte_MMC()!=0xfe);readPos=0;SD_get_data(512,buffer);//512字节被读出到buffer中return0;}其中SD_get_data函数如下://---------------------------------------------------------获取数据到buffer中//---------------------------------------------------------void SD_get_data(unsignedint Bytes,unsignedchar*buffer){unsignedint j;for(j=0;j<Bytes;j++)*buffer++=Read_Byte_SD();}扇区写扇区写是SD卡驱动的另一目的。

每次扇区写操作将向SD卡的某个扇区中写入512个字节。

过程与扇区读相似,只是数据的方向相反与写入命令不同而已。

扇区写的时序:扇区写的程序例程:C程序//-----------------------------------------------------------------写512个字节到SD卡的某一个扇区中去返回0说明写入成功//-----------------------------------------------------------------unsignedchar SD_write_sector(unsignedlong addr,unsignedchar*Buffer){unsignedchar tmp,retry;unsignedint i;//命令24unsignedchar CMD[]={0x58,0x00,0x00,0x00,0x00,0xFF};addr=addr<<9;//addr=addr*512CMD[1]=((addr&0xFF000000)>>24);CMD[2]=((addr&0x00FF0000)>>16);CMD[3]=((addr&0x0000FF00)>>8);//写命令24到SD卡中去retry=0;do{//为了可靠写入,写100次tmp=Write_Command_SD(CMD);retry++;if(retry==100){return(tmp);//sendcommamdError!}}while(tmp!=0);//在写之前先产生100个时钟信号for(i=0;i<100;i++){Read_Byte_SD();}//写入开始字节Write_Byte_MMC(0xFE);//现在可以写入512个字节for(i=0;i<512;i++){Write_Byte_MMC(*Buffer++);}//CRC-ByteWrite_Byte_MMC(0xFF);//DummyCRCWrite_Byte_MMC(0xFF);//CRCCodetmp=Read_Byte_MMC();//readresponseif((tmp&0x1F)!=0x05)//写入的512个字节是未被接受{SPI_CS=1;return(WRITE_BLOCK_ERROR);//Error!}//等到SD卡不忙为止//因为数据被接受后,SD卡在向储存阵列中编程数据while(Read_Byte_MMC()!=0xff){};//禁止SD卡SPI_CS=1;return(0);//写入成功}此上内容在笔者的实验中都已调试通过。

相关文档
最新文档