SD卡编程指南
SD卡FAT32文件系统学习手册
SD卡FAT32文件系统学习手册一一般硬盘数据结构是按下面来建立的。
二首先看看启动区的内容,也就是第一个扇区。
使用软件:WinHex有用的内容用彩色线标志下:(1)灰色线内容:EB 59 90 跳转指令;(2)灰色点线内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号,这里是MSDOS5.0;(3)红色部分:00 20 (偏移地址0BH,长度2)注意这里数据的布局,高地址放高字节,低地址放低字节(数据为小端格式组织),所以数据应该是0200,就是512,表示的意思是,该磁盘每个扇区有512个字节,有的可能是1024、2048、4096;(4)黄色部分:08 (偏移地址0DH,长度1)表示的意思是每个簇有8个扇区,这个值不能为0,而且必须是2的整数次方,比如1、2、4、8、16、32、64、128,但是这个值不能使每个簇超过32KB 字节;(5)蓝色部分:24 00 (偏移地址0EH,长度2),转换一下,就是00 24,意思是保留区域中的保留扇区数为36个,那么就可以知道下面的FAT1区的开始的地址就是:0x24*200(每个扇区的字节数)=0x4800;(6)粉色部分:02 (偏移地址10H,长度1) ,此卷中的FAT结构的份数为2,另外一个是备份的。
(7)黑色部分:C6 03 (偏移地址24H,长度2)转换一下,03C6,每个FAT占用的扇区数。
那么每个扇区占用的字节数就是0x03c6*200=78C00。
根据启动区、FAT1、FAT2、根目录、数据区的次序,可以依次计算出它们的地址了。
启动区:理所当然是0x00;FAT1:0x4800;FAT2:0x4800 + 0x78C00 = 7D400;根目录区:7D400 + 78C00 = F6000;数据区的地址,等等再计算。
这个只是计算,可以看看是不是和实际的一致。
怎么样,是不是和计算的很一致。
为什么要计算为什么要计算SD数据的读取要给出地址,而且每次读取都是一个整扇区,512个字节。
CH376编程指南
/* 往 CH376 数据端口写入数据 */
void xWriteCH376Data( UINT8 mData ) /* 向 CH376 写数据 */
{
/* (*(volatile unsigned char xdata *)0xBCF0) = mData ; */ /* 通过 51 单片机外
部并行总线接口操作向 CH376 写入数据 */
CH376_DATA_DAT_OUT( mData ); /* 向 CH376 的并口输出数据 */
CH376_DATA_DIR_OUT( );
/* 设置并口方向为输出 */
CH376_A0 = 0;
CH376_CS = 0;
CH376 编程指南
2
CH376_WR = 0; /* 输出有效写控制信号, 写 CH376 芯片的数据端口 */
并口读写时序如下:
/* 往 CH376 命令端口写入命令 */ void xWriteCH376Cmd( UINT8 mCmd ) /* 向 CH376 写命令 */ {
/* (*(volatile unsigned char xdata *)0xBDF1) = mCmd ; */ /* 通过 51 单片外部并行总线接口操作向 CH376 写入命令 */ CH376_DATA_DAT_OUT( mCmd ); /* 向 CH376 的并口输出数据 */ CH376_DATA_DIR_OUT( ); /* 设置并口方向为输出 */ CH376_A0 = 1; CH376_CS = 0; CH376_WR = 0; /* 输出有效写控制信号, 写 CH376 芯片的命令端口 */ //CH376_CS = 0; /* 该操作无意义,仅作延时,CH376 要求读写脉冲宽度大于 40nS */ CH376_WR = 1; /* 输出无效的控制信号, 完成操作 CH376 芯片 */ CH376_CS = 1; CH376_A0 = 0; CH376_DATA_DIR_IN( ); /* 禁止数据输出 */ /*mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );*/ /* 延时 1.5uS 确保读写周期大于 1.5uS,或者用状态查询代替 */ }
SD卡手册
SD卡(Secure Digital Card):基于FLASH存储单元的卡,它是专为安全性高、容量大、高性能目的设计的。
SD框图如图1-1所示:图1-1SD卡不但有大容量存储单元,还集成有智能控制器来实现接口协议管理、安全性能、版权保护盒ECC校验等。
特点:高达2GB容量、SD卡协议兼容、SPI模式控制、版权保护、密码保护SD卡通讯方式:SD 6线通讯(clk、cmd、D0—3)数据出错保护传送单块、多块数据传送SPI 3线串行总线(clk、DI、DO)可选的非数据保护传送单块、多块数据传送读写次数性能:SD卡数据读次数:不受限(无限次)每扇区写:100,000次SD Mode:SD模式下多卡的识别:SD卡模式是单主机多从机模式,clk和power线共用;识别过程如下:主机分别使能各个卡自己的cmd线,各个卡的CID寄存器是事先编程好的,它是一个用在卡识别过程中唯一数字,主机能使用READ_CID命令读取CID寄存器的值,主机只能读而不能写。
内部上拉的DA T3脚可以用来进行卡插入的侦测,在数据传输过程中可以将上拉电阻断开(使用ACMD42)。
Card Status:存储在一个32bit的寄存器中,它被当做命令应答的数据区来发送,它包含卡当前的状态及上一个命令的完成代码,可以通过SEND_STA TUS命令读取。
SD_Status:存储在512bit的寄存器中,当发送命令SD_STA TUS(ACMD13)时它被当做一块数据块来发送。
存储空间阵列分区如图1-2所示:数据传输的基本单元式byte面向块的命令:Block:块大小就是发送块传输命令时传输的数据字节数,大小可变也可以固定,块的大小及编程存储在CSD寄存器中。
图1-2一次擦除单元的粒度一般与面向块命令不同Sector:这是和擦除命令有关的单元,每个设备扇区的大小事固定的,扇区的大小信息存储在CSD寄存器中。
具有写保护的卡:WP Group:拥有独立写保护的最小单元,Its size is the number of groups which will be write protected by one bit,每张卡WP Group的大小也是固定的,大小信息存在CSD 中。
sd卡读写模块的用法
SD卡读写模块是一种使单片机能够读写SD卡/TF卡的模块,它可以帮助单片机实现大容量存储方案。
该模块内置文件系统,可直接进行文件读写操作,适用于单片机系统。
使用SD卡读写模块时,需要了解其用法和操作。
1. 连接SD卡:将SD卡插入SD卡读写模块的卡槽中,确保卡槽与SD卡之间的接触良好。
2. 连接单片机:将SD卡读写模块与单片机相连接。
通常,SD卡读写模块会提供标准的SPI接口或MMC接口与单片机相连。
根据单片机的接口类型和SD卡读写模块的接口类型,选择合适的连接方式。
3. 初始化模块:在程序中调用SD卡读写模块的初始化函数,对模块进行初始化。
初始化过程中,模块会自动检测SD卡的类型和容量,并配置相应的操作模式。
4. 文件操作:通过调用SD卡读写模块的文件操作函数,实现文件的创建、删除、读取、写入等操作。
例如,可以使用open()函数打开一个文件,使用read()函数读取文件内容,使用write()函数写入文件内容,使用close()函数关闭文件。
5. 目录操作:通过调用SD卡读写模块的目录操作函数,实现目录的创建、删除、遍历等操作。
例如,可以使用mkdir()函数创建一个目录,使用rmdir()函数删除一个目录,使用opendir()函数打开一个目录,使用readdir()函数读取目录下的一个文件,使用closedir()函数关闭目录。
6. 卡操作:通过调用SD卡读写模块的卡操作函数,实现SD卡的格式化、挂载、卸载等操作。
例如,可以使用format()函数格式化SD卡,使用mount()函数挂载SD卡,使用umount()函数卸载SD卡。
需要注意的是,不同的SD卡读写模块可能具有不同的功能和操作方式,因此在使用时需要参考相应的模块手册或开发指南。
同时,为了提高程序的稳定性和可维护性,建议使用模块提供的函数进行操作,而不要直接操作SD卡的底层寄存器。
单片机读写SD卡教程
单片机读写SD卡教程引言:SD卡(Secure Digital Card)是广泛应用于各类数字设备上的一种存储介质。
它小巧轻便,可靠性高,容量大,因此在各种嵌入式系统中都广泛使用。
本教程将介绍如何使用单片机读写SD卡,包括初始化SD卡、读写数据等基本操作。
一、硬件准备在开始之前,我们需要准备以下硬件设备:1.一个支持SPI协议的单片机开发板(例如STC89C51、STM32等);2.一个SD卡插槽,或者是一个带有SD卡插槽的扩展板;3.杜邦线、面包板等连接器。
二、软件准备除了硬件设备,我们还需要准备以下软件工具:1. Keil C51、IAR、Keil MDK等单片机编译工具;2. SD卡相关的库文件,例如FatFs;3.一个用于测试的程序(可以是一个简单的读写数据的程序)。
三、连接SD卡插槽将SD卡插入到对应的插槽中,并将插槽与单片机的硬件SPI接口连接。
根据不同的开发板,连接方式可能有所不同,一般SPI接口包括SCK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和CS(片选线)等。
四、编写读写SD卡的程序在开始编写程序之前,我们需要先了解SD卡的工作原理。
SD卡通过SPI总线与单片机进行通信,通过发送特定的命令和参数实现读写操作。
以下是一个简单的读写SD卡的流程:1.初始化SD卡a.发送CMD0命令,将SD卡设置为SPI模式;b.发送CMD8命令,验证SD卡是否支持高速SPI模式;c.发送ACMD41命令,等待SD卡初始化完成。
2.读写数据a.发送CMD17命令,指定要读取的扇区地址;b.等待SD卡回应,确认读取命令执行成功;c.读取数据;d.发送CMD18命令,继续读取下一个扇区;e.重复步骤c和d,直到读取完所有数据;f.发送CMD12命令,停止读取。
g.发送CMD24命令,指定要写入的扇区地址;h.等待SD卡回应,确认写入命令执行成功;i.写入数据;j.发送CMD25命令,继续写入下一个扇区;k.重复步骤i和j,直到写入完所有数据;l.发送CMD12命令,停止写入。
sd卡模块产品使用手册及单片机程序
BRT = 0XFD;
//设置波特率 9600
AUXR = 0x10;
//启动波特率发生器
EA = 1;
//开总中断
IE2 = 0x01;
//开串口 2 中断
}
/*--------------------------------------
发送一个字符
--------------------------------------*/
--------------------------------------*/
#include "STC12C5A60S2.h"
#define uchar unsigned char
#define uint unsigned int
uchar dat=0;
/*--------------------------------------
S2CON &= ~0x01; dat= S2BUF; } if( S2CON & 0x02 ){ S2CON &= ~0x02; } } /*--------------------------------------
主函数 --------------------------------------*/ void main() { uchar tab[]={"liguangyang!!"}; uchar *p; uchar x; init(); p=tab; for( x=0;x<14;x++ ){ txd_c(p[x]); delay(200); } while(1) P0 = dat; }
串口初始化
--------------------------------------*/
SD卡资料编写
SD卡资料整理1、概述SD卡高度集成闪存,具备串行和随机存取能力。
可以通过专用优化速度的串行接口访问,数据传输可靠。
接口允许几个卡垛叠,通过他们的外部连接。
接口完全符合最新的消费者标准,叫做SD卡系统标准,由SD卡系统规范定义。
SD卡系统是一个新的大容量存储系统,基于半导体技术的变革。
它的出现,提供了一个便宜的、结实的卡片式的存储媒介,为了消费多媒体应用。
SD卡可以设计出便宜的播放器和驱动器而没有可移动的部分。
一个低耗电和广供电电压的可以满足移动电话、电池应用比如音乐播放器、个人管理器、掌上电脑、电子书、电子百科全书、电子词典等等。
使用非常有效的数据压缩比如MPEG,SD卡可以提供足够的容量来应付多媒体数据。
安全数字存储卡(Secure Digital Memory Card,SDC)作为事实上的标准存储卡广泛应用于移动设备上。
SDC 曾作为高层兼容多媒体卡(Multi Media Card,MMC)进行开发。
SDC设备一般也兼容MMC。
还存在一些功能相同但尺寸更小的版本,如RS-MMC、miniSD和microSD。
MMC/SDC 内置一个微控制器,在卡内部执行flash 存储操作(擦写、读取、写入、错误控制和功耗平衡(Wearleveling))。
数据以512 字节为单位在存储卡与主机控制器之间传输,从高层看来,卡可以被看作是通用硬盘设备。
当前定义的用于存储卡的文件系统为FAT12/16 并使用FDISK 分区规则。
FAT32 仅用于大容量卡(>=4G)。
SD卡允许在两种模式下工作,即SD模式和SPI模式,本系统采用SPI模式。
本小节仅简要介绍SPI模式。
2、引脚SD卡引脚如下图所示:SD卡外部引脚图micro-SD卡-本卡的物理尺寸见【1】。
SPI模式下SD各管脚名称为.JPG注意:SPI模式时,这些信号需要在主机端用10~100K欧的电阻上拉【2a】p4,如下表的相应引脚说明【2a】p5。
SD卡驱动编写流程
SD卡驱动编写流程现在对SD卡驱动编写做个总结,以及本人在调试中遇到的问题。
先介绍一下SD卡规格,其全称Secure Digital Memory Card简写SD,是以Flash Memory为基础的存储卡,自带控制器。
所以编写的驱动是针对控制器接口的,不是针对Flash Memory的。
SD卡支持三种驱动模式,见下图!外观图和PIN定义看下图:分别为SPI模式和SD BUS模式,不同的模式,注意相同编号的PIN意义不一样!下面以SD1bit mode为例子介绍怎么驱动SD卡。
SD卡是以命令驱动的,所以应先了解命令的基本格式,见下图!其中需要用到CRC7下面的图是用示波器实际采集到的CMD6发送时的波形图例说明:深蓝为CLK信号浅蓝为CMD信号红色CMD开始黄色CMD结束结合上面的图很容易理解命令发送格式CRC7码可以用下面函数计算另外还会用到CRC16码,在发送数据和接收数据时需要用到,可以用查表方法,那样速度最快SD卡命令实际使用到的命令有32条,其中基本命令25条,用户应用命令7条。
下面表中详细介绍了每条命令的功能下面的图表为用户命令:要运行用户命令需要先发送基本命令CMD55。
每次运行都需要先发送CMD55其中R1,R2,R3,R6为返回数据格式SD卡内部寄存器介绍:R2,R3,R6,能返回寄存器状态或使用CMD9.CMD10读寄存器内容下面的截图为发送CMD24后,SD卡回复的数据信息图例说明:深蓝为CLK信号浅蓝为CMD信号红色CMD开始黄色CMD结束紫色为DATA0了解命令发送格式后,就可以继续下一步了,向SD卡发送初始化命令和读写数据了,调试过程中这一步很容易出问题,主要是时序匹配不上,发送命令后SD卡没有反映,不过CMD0是个例外用I/O模拟CLK,CMD时需要注意数据是上升沿有效,下降沿触发。
SD卡操作总流程!驱动模式选择卡发送SD退出CD卡操作SD卡支持级联,可以在总线上挂多个设备,通过初始化命令选择卡,状态转换命令退出。
SD卡中文数据手册
SD卡中⽂数据⼿册SD卡中⽂数据⼿册⼀概述1.SD总线模式下CLK:时钟信号CMD:双向命令和响应信号DAT0-3:双向数据信号VDD,VSS:电源和地信号SD模式下允许有⼀个主机,多个从机(即多个卡),主机可以给从机分别地址.主机发命令有些命令是发送给指定的从机,有些命令可以以⼴播形式发送.SD模式下可以选择总线宽度,即选⽤⼏根DAT信号线,可以在主机初始化后设置.2.SD总线协议SD模式下的命令和数据流都有⼀个开始位和结束位.>命令:是在CMD上传输的⽤于启动⼀个操作的⽐特流.由主机发往从机,可以是点对点也可以是⼴播的. >响应:是在CMD上传输的⽤于之前命令回答的⽐特流.由从机发往主机.>数据:是在DAT上传输的⽐特流,双向传输.⽆响应模式⽆数据模式多块读操作模式多块写操作模式命令格式响应格式数据格式SD卡上电后会⾃动初始化,通过给卡发送CMD0也可以复位卡.⼆.SD卡命令描述.1.⼴播命令:给所有卡都发送,某些命令需要响应.2.点对点命令给指定地址的卡发送,需要响应.SD卡系统有两种⼯作模式:1.卡识别模式.主机上电复位后即处于此模式,它会在总线上等待卡.卡复位后也处于此模式,直到SEND_RCA(CMD3)命令到来.2.数据传输模式.卡收到SEND_RCA(CMD3)命令后即进⼊此模式.主机识别到卡后也进⼊此模式.卡状态和⼯作模式对照表1.卡识别模式.此模式下主机复位总线所有的卡,验证⼯作电压,询问卡的地址.这个模式下所有数据的传输都是只通过CMD线来完成.1)卡的复位.当卡上电或收到GO_IDLE_STATE(CMD0)命令后,卡即进⼊Idle State状态.此时卡将其RCA设为0,相关寄存器设为传输稳定的最优模式.2)⼯作电压验证每个卡的最⾼和最低⼯作电压存储在OCR.只有当电压⽐配时,CID和CSD的数据才能正常传输给主机.SD_SEND_OP_COND(ACMD41)命令⽤来判断卡的⼯作电压是否符合,如果不符合的话,卡应该放弃总线操作,进⼊Inactive State状态.在发送SD_SEND_OP_COND(ACMD41)命令前记得要⾸先发送APP_CMD (CMD55).卡的状态变换图.ACMD41命令响应中的BUSY位也⽤于卡表⽰其还没准备好,主机此时应重发ACMD41命令,直到卡准备好.主机在这个阶段的ACMD41中不允许改变⼯作电压,如果确实想改变的话,应该先发送CMD0,然后再发送改变后的ACMD41.GO_INACTIVE_STATE(CMD15)命令⽤于使指定地址的卡进⼊Inactive State模式.3)卡识别过程.ALL_SEND_CID(CMD2)命令⽤于获取卡的CID信息,如果卡处于Ready State,它就会在CMD线上传送它的CID信息,然后进⼊Identification State模式.紧接着发送CMD3 (SEND_RELATIVE_ADDR)命令,⽤于设置卡新的地址.卡收到新的地址后进⼊Stand-by State 模式.2.数据传输模式.数据传输模式下卡的状态转变图进⼊数据传输模式后,主机先不停的发送SEND_CSD(CMD9)命令获取卡的CSD信息. SET_DSR(CMD4)⽤于设置卡的DSR寄存器,包括数据总线宽度,总线上卡的数⽬,总线频率,当设置成功后,卡的⼯作频率也随之改变.此步操作是可选的.CMD7命令⽤于使指定地址的卡进⼊传输模式,任何指定时刻只能有⼀个卡处于传输模式.传输模式下所有的数据传输都是点对点的,并且所有有地址的命令都需要有响应..所有读命令都可以由CMD12命令停⽌,之后卡进⼊Transfer State.读命令包括单块读(CMD17),多块读(CMD18),发送写保护(CMD30),发送scr(ACMD51)和读模式⼀般命令(CMD56)..所有写命令都可以由CMD12命令停⽌.写命令包括单块读(CMD24),多块读(CMD25),写CID(CMD26),写CSD(CMD27),锁和解锁命令(CMD42)和写模式⼀般命令(CMD56)..当写命令传输完成后,卡进⼊Programming State(传输成功)或Transfer State(传输失败).如果⼀个卡写操作被停⽌,但其前⾯数据的CRC和块长度正确,数据还是会被写⼊..卡要提供写缓冲,如果写缓冲已满并且卡处于Programming State,DAT0保持低BUSY. .写CID,CSD,写保护,擦除命令没有缓冲,当这些命令没完时,不应发送其他的数据传输命令..参数设置命令在卡被编程时是不允许发送的,这些命令包括设置块长度(CMD16),擦除块起始(CMD32)和擦除块结束(CMD33). .当卡正编程时读命令是禁⽌的..⽤CMD7使另⼀个卡进⼊Transfer State不会终⽌当前卡的编程和擦除,当前卡会进⼊Disconnect State并且释放DAT线..Disconnect State模式的卡可通过CMD7重新被选中,此时卡进⼊Programming State 并且使能busy信号..CMD0或CMD15会终⽌卡的编程操作,造成数据混乱,此操作应禁⽌.1)总线宽度选择命令ACMD6命令⽤于选择总线宽度,此命令只有在Transfer State有效.应在CMD7命令后使⽤.2)块读命令块是数据传输的最⼩单位,在CSD(READ_BL_LEN)中定义,SD卡为固定的512B.每个块传输的后⾯都跟着⼀个CRC校验.CMD17(READ_SINGLE_BLOCK)⽤于传输单个块,传输完之后,卡进⼊Transfer State.CMD18(READ_MULTIPLE_BLOCK)⽤于多个块的传输,直到收到⼀个CMD12命令.3)块写命令与块读命令类似,每个块传输的后⾯都跟着⼀个CRC校验.卡写数据时会进⾏CRC校验.多块写⽐重复的单块写更能提⾼效率.如果CSD中的WRITE_BLK_MISALIGN没设置,并且发送的数据不是块对齐的,卡会设置状态寄存器中的ADDRESS_ERROR 位,并且进⼊Receive-data-State状态等待停⽌命令.此时写操作也会停⽌,并且卡会设置其的WP_VIOLATION位.如果写缓冲满的话,卡会停⽌接受WRITE_BLOCK命令.此时主机应发送SEND_STATUS (CMD13)命令,卡返回数据的READY_FOR_DATA位标志卡是否准备好接受新的数据.在多块写操作中通过事先发送ACMD23命令可提⾼写速度.ACMD23⽤于定义接下来要写数据的块的数⽬.每次多块写操作后,这个值⼜被设为默认的1.ACMD22会使卡返回写成功的块数⽬.4)擦除命令擦除命令的顺序是:ERASE_WR_BLK_START(CMD32),ERASE_WR_BLK_END(CMD33)and ERASE (CMD38).如果(CMD38或(CMD32,33)接收到出错信息,卡会设置状态寄存器中的ERASE_SEQ_ERROR 位并且重新等待新的命令时序.如果接收到时序错误命令,卡会设置其ERASE_RESET位并且重新等待新的命令时序.5)写保护管理三种机制:-.写保护物理开关-.卡内部写保护通过设置CSD中的WP_GRP_ENABLE位和WP_GRP_SIZE位,SET_WRITE_PROT和CLR_WRITE_PROT命令⽤来设置和清除保护机制.-.密码保护.三.时钟控制如果主机要发送1K的数据,但是主机缓冲区只有512B,那么主机可以在发送完前512B 后,可以先停⽌时钟,然后把后512B填充⼊缓冲区,再启动时钟,这样卡并不会检测要两次发送之间的间隔,认为其是⼀次完整的数据发送过程.四CRC校验1.CRC7CRC7⽤于所有的命令,除R3以外的响应,以及CID和CSD寄存器.2.CRC16CRC16⽤于数据块的校验五.错误类型.1.CRC错误和命令⾮法错误命令的CRC校验出错,卡设置其状态寄存器的COM_CRC_ERROR位.⾮法命令错误,卡设置其状态寄存器的ILLEGAL_COMMAND位.⾮法命令包括:不⽀持的命令,未定义的命令以及当前状态不⽀持的命令.2.读,写和擦除超时.卡应该在指定的时间内完成⼀个命令或返回移动的错误信息.如果在指定的超时时间内主机收不到响应,应认为卡停⽌⼯作,应重新复位卡.六命令1.命令类型:-bc不需要响应的⼴播命令.-bcr需要响应的⼴播命令.每个卡都会独⽴的接收命令和发送响应.-ac点对点命令,DAT线上没数据-adtc点对点命令,DAT线上有数据所有命令均遵守上图中的格式,总共48位.⾸先是1个起始位0,接着是1个⽅向位(主机发送位1),6个命令位(0-63),32位参数(有些命令需要),CRC7位校验,1个停⽌位. 2.卡命令根据不同的类型分成了不同的Class,见下表,其中Class0,2,4,5,8是每个卡都必须⽀持的命令,不同的卡所⽀持的命令保存在CSD中.3.命令详细描述1)基本命令Class02)读命令Class23)写命令Class43)擦除命令Class54)应⽤特定命令Class8下表中的所有命令使⽤前都应先跟⼀个APP_CMD(CMD55)命令七.卡状态转换表⼋.应答.所有的应答都是通过CMD发送,不同的应答长度可能不同.总共有四种类型的应答.1.R1:长度位48位.注意每个块传输完成后有⼀个BUSY位.2.R1b:与R1类似,只是将BUSY位加⼊响应中.3.R2(CID CSD寄存器):长度为136位,CID为CMD2和CMD10的应答,CSD为CMD9的应答.4.R3(OCR寄存器):长度位48位.作为ACMD41的应答.5.R6(RCA地址应答):长度为48位九.卡的状态SD卡⽀持两种状态:-卡状态:与MMC卡兼容.-SD卡状态:扩充到了512位.1.卡状态:R1应答包含⼀个32位的卡状态.见下表.其中Type中的含义为:E:错误位.S:状态位.R:根据命令在响应中设置.X:根据在命令执⾏期间设置,必须再次读此位才能获得命令执⾏后的情况.Clear Condition:A:与卡的当前状态有关B:总是与命令有关,⽆效的命令会清除此位.C:通过读此位来清除下表指明了哪些命令可能使哪些位产⽣变化这些位通过DAT线传输,并伴有CRC16校验.其是作为ACMD13的应答.⼗.卡存储器形式.-块:块是基本读写命令的单位,它可以是固定的或可变的.关于块的⼤⼩以及其是否可变性存储在CSD中.-扇区:扇区是擦除命令的单位,它是固定的值,保存在CSD中.⼗⼀.时序图时序图中字母含义:1.命令和应答1)卡识别和卡⼯作电压确认模式:CMD2,ACMD412)地址分配模式:CMD33)数据传输模式:4)命令结束->下⼀个命令:5)两个命令直接2.数据读.1)单块读:CMD172)多块读:读过程时序.停⽌命令时序3.数据写1)单块写:注意Busy信号.2)多块写:多块写命令时序停⽌命令时序卡主动停⽌时的时序4.时序值。
SD卡读写操作详细说明
SD卡读写操作详细说明51单⽚机实现对SD卡的读写SD卡SPI模式下与单⽚机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是⾮常重要的,只有进⾏了正确的初始化,才能进⾏后⾯的各项操作。
在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。
在初始化成功后,应尽量提⾼SPI的速率。
在刚开始要先发送⾄少74个时钟信号,这是必须的。
在很多读者的实验中,很多是因为疏忽了这⼀点,⽽使初始化不成功。
随后就是写⼊两个命令CMD0与CMD1,使SD卡进⼊SPI 模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端⼝10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送⾄少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写⼊CMD0,在这⾥写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停⽌写⼊30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写⼊CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上⾯对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。
SD卡读写程序
SD卡读写程序SD卡读写程序//实验目的:学习SD卡的操作//软件设计// 1、SD卡采用SPI通信// 2、先往SD里顺序写入0-255共256个数据,然后再读回送LCD1602显示//硬件要求:// 拨码开关S11置ON// 跳线J18全部接通#include //dsPIC30F6014标准头文件_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍频晶振,Failsafe 时钟关闭_FWDT(WDT_OFF); //关闭看门狗定时器_FBORPOR(PBOR_OFF & MCLR_EN); //掉电复位禁止,MCLR 复位使能。
_FGS(CODE_PROT_OFF); //代码保护禁止#define cs PORTGbits.RG9 //定义SD卡片选脚#define rs /doc/e62205906.html,TB4 //定义LCD控制位(注意这里只能用LATB寄存器,不能直接用PORTB 寄存器)#define rw /doc/e62205906.html,TB5 #define e /doc/e62205906.html,TB6unsigned char __attribute__((address(0x900))) lcd[3]={0,0,0};void spi_init(); //申明系统初始函数void spi_low(); //申明产生低波特率函数(SD卡初始化使用)void spi_high(); //申明产生高波特率函数(SD卡初始化后使用)unsigned char sd_reset(); //申明SD卡初始化函数unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg); //申明写SD卡命令函数unsigned char SPI_WriteByte(unsigned char val); //申明写一字节函数unsigned char SPI_ReadByte(void); //申明接收一字节函数unsigned char SD_WriteSingleBlock(unsigned long sector); //申明写SD卡单BLOCK数据函数unsigned char SD_ReadSingleBlock(unsigned long sector); //申明读SD卡单BLOCK数据函数void lcd_display(); //申明结果显示函数void delay(); //申明延时函数(显示时用)//系统初始化函数void spi_init(){TRISG="0x00d0"; //设置SDI为输出,其他C口为输出TRISB="0X0000"; //设置B口为输出TRISD="0X0000"; //设置D口为输出SPI2CON=0x0278; //空闲时总线为高电平,fosc/64SPI2STAT=0x8000; // 输出数据的末尾采样输入数据,上升沿发送数据}//*************************写LCD程序****************************************//写一个字节数据函数//在电平发生改变后需要插入一段延时时间,否则LCD反应不过来。
SD卡驱动参数的配置与编译(完全)(Linux)
14.2 SD卡驱动参数的配置
{ .name = "ramdisk", .size = 0x2c0000, .offset = 0x540000 }, { .name = "jffs2", .size = 0x700000, .offset = 0x800000 } }; 接下来告诉内核使用该驱动程序。修改maps目录下的Kconfig文 件,该文件决定出现在menuconfig中的项目,在config MTD_CDB89712之后添加 config MTD_S3C2410 tristate "RJ 2410 board"
14.1 SD概述
2.SD总线的访问状态 SD总线的访问状态有3种。 1)COMMOND:启动操作的会话,由Host从CMD连线传送到卡类设备。 2)Response:响应CMD的会话,由卡类设备CMD连线传送至Host。 3)Data:在Host与卡设备间传送数据的双向数据流,物理链路为 Data0~Data3。
14.2 SD卡驱动参数的配置
struct mtd_partition flagadm_parts[] = { { .name = "bootloader", .size = 0x040000, .offset = 0x0 }, { .name = "kernel", .size = 0x0200000, .offset = 0x040000 }, { .name = "cramfs", .size = 0x300000, .offset = 0x240000 },
14.2 SD卡驱动参数的配置
步骤5. 修改flash分区 [root@localhost linux-2.6.24.4]# cd drivers/mtd/maps/ [root@localhost maps]# cp cfi_flagadm.c s3c2410.c [root@localhost maps]# vi s3c2410.c 将FLASH_PHYS_ADDR和FLASH_SIZE这两个宏分别修改 成自己板子的flash起始地址和大小。然后修改结构体数组 flagadm_parts添加自己的分区信息,修改以后如下: #define FLASH_PHYS_ADDR 0x01000000 #define FLASH_SIZE 0x01600000 struct map_info flagadm_map = { .name = "NOR flash on S3C2410", .size = FLASH_SIZE, .bankwidth = 2, };
SD卡读写程序设计(二)
SD卡读写程序设计(二)一、概述上次已经简单描述了SD卡读写程序的层次设计,今天开始一一实现。
二、命令接口程序设计1、首先添加两个命令:sdrd和sdwr.《在文件tast_uartcmd.c中》#define UartCmdMaxCount 10 //现在支持10个内部命令u8* UartCmdStrTable[UartCmdMaxCount]={ //串口命令字符串"help","cls","ledon","ledoff","time","temp","i2cwr","i2crd","sdrd","sdwr"};2、添加命令处理程序:UartCmdTable[8].UartCmdFunc=UartCmdSDRead;UartCmdTable[9].UartCmdFunc=UartCmdSDWrite;《在文件uartcmd.c中》void UartCmdSDRead(void){}void UartCmdSDWrite(void){} 先定义空函数,编译通过再说。
《在文件uartcmd.h中》void UartCmdSDRead(void);void UartCmdSDWrite(void);然后编译,一次性编译通过。
但是输入help,没有显示sdrd和sdwr命令,在帮助命令里还没有完成。
void UartCmdHelp(void){Uart_PutString("cls ");Uart_PutString("ledon ");Uart_PutString("ledoff ");Uart_PutString("time ");Uart_PutString("temp ");Uart_PutString("i2cwr ");Uart_PutString("i2crd \r\n");Uart_PutString("sdrd "); //以下两句为新添加。
SD卡LED控制器编程代码详细介绍
川田LED控制器产品目录高品质高性能控制器1口 -SD卡1024点 电源同步LED控制器1口 -SD卡1024点 多同步模式LED控制器2口 -SD卡2048点 电源同步LED控制器4口 -SD卡4096点 电源同步LED控制器8口 -SD卡8192点 电源同步LED控制器16口-SD卡16384点电源同步LED控制器16口-SD卡32768点电源同步LED控制器16口-SD卡32768点电源同步LED控制器-分控版32口-SD卡32768点电源同步LED控制器32口-SD卡65536点电源同步LED控制器高性价比系列控制器1口-单机版/直流版SD卡1024点 LED控制器1口-LS-1024点 / LS-2048点1口LED控制器1口-BS-1024点 / BS-2048点1口LED控制器1口-BS系列带4路并联输出的单口LED控制器2口-BS-2048点2口LED控制器4口-BS-4096点4口LED控制器8口-BS-8192点8口LED控制器铝外壳系列控制器4口-铝壳版SD卡4096点LED控制器8口-铝壳版SD卡8192点LED控制器兼容双线、三线及及线系列控制器1口-SD卡1024点 电源同步LED控制器A型2口-SD卡2048点 电源同步LED控制器A型4口-SD卡4096点 电源同步LED控制器A型8口-SD卡8192点 电源同步LED控制器A型以太网/USB/实时播放/联机系列控制器2通道实时播放控制器16通道实时播放控制卡SD卡1024X64主机带分控LED控制器SD卡4096点 联机LED控制器USB实时播放控制器-工程应用的好工具DMX512系列控制器SD卡1通道DMX512控制器SD卡8通道DMX512控制器DMX512三通道大功率LED恒流驱动模块特色LED控制器 SD卡1024点单机版LED控制器SD卡2048点电源同步LED控制器6803专用SD卡LED控制器64点轮廓专用LED控制器256点轮廓专用LED控制器七彩3路大功率控制器 同步版七彩3路大功率控制器 DMX512版七彩3路软灯条大功率控制器软件类产品 LED动画/效果专业设计软件联系方式SD卡1024点电源同步LED控制器B型 [ CT-1024-1CH ]⊙采用创新技术设计,渐变柔和,可满足各种动画效果需要.⊙各台控制器使用同档速度并连接在同一电网,即可自动实现整体动画的同步运行,无需连线,无安装距离限制.⊙八档速度、十六档花样均可自由调节.⊙采用SD卡存储花样文件, 更新/修改动画非常方便.⊙支持芯片引脚任意错乱排列。
[整理]SD卡程序设计、流程及操作系统.
对SD卡进行操作首先要对SD卡进行初始化,初始化的过程中设置SD卡工作在SPI模式,其流程图如图3所示。
在复位成功之后可以通过CMD55和ACMD41判断当前电压是否在工作范围内。
主机还可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据Block长度,通过CMD9读取卡的CSD寄存器。
从CSD寄存器中,主机可获知卡容量,支持的命令集等重要参数。
SD卡初始化的C语言程序如下:unsigned char SD_Init(void){ unsigned char retry,temp;unsigned char i;for (i=0;i<0x0f;i++){ SPI_TransferByte(0xff); //延迟74个以上的时钟}SD_Enable(); //开片选SPI_TransferByte(SD_RESET); //发送复位命令SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x00);SPI_TransferByte(0x95);SPI_TransferByte(0xff);SPI_TransferByte(0xff);retry=0;do{ temp="Write"_Command_SD(SD_INIT,0);//发送初始化命令retry++;if(retry==100) //重试100次{SD_Disable(); //关片选return(INIT_CMD1_ERROR);//如果重试100次失败返回错误号}}while(temp!=0);SD_Disable(); //关片选return(TRUE); //返回成功}数据块的读写完成SD卡的初始化之后即可进行它的读写操作。
SD卡的读写操作都是通过发送SD 卡命令完成的。
SDMMC卡初始化及读写流程讲述
二、MMC/SD卡的模型和工作原理PIN脚、SD卡总线、SD卡结构、SD卡寄存器、上电过程SD卡寄存器:OCR:操作电压寄存器: 只读,32位第31位:表示卡上电的状态位CID: 卡身份识别寄存器只读128位生产厂商、产品ID,生产日期和串号等CSD:部分可写128位卡的容量、擦出扇区大小、读写最大数据块的大小、读操作的电流、电压等等 CSR: 卡配置寄存器64位数据位宽RCA:16位相关的卡地址寄存器,卡识别过程中主控器和卡协商出来的一个地址三、SD卡命令和响应格式命令和相应格式SD卡命令,命令类型,ACMD命令响应类型、卡类型、卡状态转换表命令的格式:48位起始位0 方向位(host to card: 1, card to host: 0)内容CRC7 结束位1·响应的格式:48位或者136位卡命令:命令的类型:bc: broadcast without Response 无响应的广播bcr: broadcast with Response 有响应的广播ac: Address(point-to-point) Command: 点对点,DATA0~DATA3数据线上无数据adtc: Adress(point-to-point) Data Transfer Commands 点对点,DATA0~DATA3数据线上有数据CMD0, CMD2, CMD3, CMD55, ACMD41 命令可能会导致卡的状态发生变化响应类型:R1,R1b, R2, R3,R6(SD2.0扩展了R7)扩展内容:SPI工作模式:要知道的特点:只支持一个卡,没有RCA,命令只是MMC/SD的基本的子集SDHC:(支持2GB~32GB):理解CMD8的作用,命令格式和响应,了解CSDV2.0寄存器做了扩展SDIO WIFI:增加CMD52,CMD53CMD8可以通过重新定义先前保留的位,来扩展一些已经存在的命令的新功能。
SD卡读写程序设计三.
该文章讲述了SD卡读写程序设计三.一、概述今天的主要任务是建立SD操作底层驱动的框架。
二、SD用户层程序的编写这几天看了周立功的《嵌入式软件开发实例》中关于SD卡操作的部分,又加了一个函数void SD_GetCardInfo( void );现在共有5个函数:void SD_Config( void );void SD_GetCardInfo( void );void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf );void SD_WriteBlock( u32 BlockIndex, u8* WriteBuf );void SD_EraseBlock( u32 BlockIndex, u32 BlockNum );1、SD_Config函数的编写(1)主要任务是进行复位、激活、和设置块长度等。
(2)代码框架void SD_Config( void ){SD_Reset(); //命令0使卡复位,并进入SPI模式SD_Activate(); //命令1激活卡进行内部处理退出空闲状态SD_SetBlockLen ( BlockSize );//命令16设置块长度,一般为512字节}2. SD_ReadBlock( u32 BlockIndex, u8* ReadBuf )函数的编写void SD_ReadBlock( u32 BlockIndex, u8* ReadBuf ){u16 i="0"u16 TmpByte;SendCommand:SD_CmdReadSingle ( BlockIndex ); //发出读单块命令17do{ TmpByte = SPI_GetByte ( );i++;} while ( (TmpByte != 0xFE ) && ( i<=1000 ) );if ( i>1000 ) goto SendCommand; //如果在这段时间内没有收到0xFE的令牌,重复读命令for ( i="0"; i<BlockSize; i++ )ReadBuf[i] = SPI_GetByte();TmpByte = SPI_GetByte ( );TmmByte = SPI_GetByte ( ); //不进行CRC校验SPI_PutByte ( 0xFF ); //纯粹只是为了延时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SD卡编程指南——如何使用MMC/SDC2011-11-05 苏勇安全数字存储卡(Secure Digital Memory Card,SDC)作为事实上的标准存储卡广泛应用于移动设备上。
SDC曾作为高层兼容多媒体卡(Multi Media Card,MMC)进行开发。
SDC设备一般也兼容MMC。
还存在一些功能相同但尺寸更小的版本,如RS-MMC、miniSD和microSD。
MMC/SDC内置一个微控制器,读取、写入、错误控制和功耗平衡(Wearleveling))。
数据以512字节为单位在存储卡与主机控制器之间传输,从高层看来,卡可以被看作是通用硬盘设备。
当前定义的用于存储卡的文件系统为FAT12/16并使用FDISK分区规则。
FAT32仅用于大容量卡(>=4G)。
本文讲述作者在小型嵌入式系统中使用MMC/SDC中的基本知识和一些琐碎的内容。
作者相信,这些信息对于即将在电子硬件工程中使用MMC/SDC的人会有一些帮助。
1. 引脚下图展示了SDC/MMC的外观,MMC有7个引脚,SDC有9个引脚。
其中三个引脚为电源引脚,故负责通信的引脚MMC有4个,SDC有6个。
主机与卡之间的通信是通过同步串行接口实现的。
工作电源电压范围是有工作状况寄存器(Operation Conditions Register,OCR)指示的,应读该寄存器并确定工作电压范围。
无论怎样,电源应固定在3.0/3.3V,因为所有的MMC/SDC的电源至少是在2.7~3.6V的范围内。
在执行写入操作时,电流消耗能达到几十毫安,因此,主机系统应至少保证能够为卡提供100mA的电流供应。
2. 命令与应答在SPI模式下,信号线上的数据方向是确定的,数据按字节以串行方式传输。
从主机传向卡的命令帧是定长(6个字节)数据包,如下图所示。
当一个命令帧被传送到卡上,命令的应答(R1,R2或R3)从卡上反馈回主机。
由于数据传输是有主机产生的串行时钟驱动的,主机需在读到有效的应答之前保持读取状态以提供时钟,DI信号线上在读通信过程中保持高电平(发送0xFF交换数据)。
应答应在命令响应时间内(NCR)反馈回来,对于SDC为0到8个字节,对于MMC为1到8个字节。
,CS信号线上的电平需在发送命令帧之前被拉低,并在通信过程中(发送命令,接收应答及读写数据)保持低电平。
在SPI模式下,CRC校验功能是可选的,但是CRC字段始终要填充内容以构成一个完整的命令帧。
2.1 常用的SPI模式命令(1)命令由6个字节组成:01+6位命令号+4个字节的命令参数+7位校验码+结束位1。
(2)命令分为10个类:SPI支持:类0——基本控制(0复位、1激活初始化、9读CSD寄存器、10读CID寄存器、12多块过程中停止传输、13读状态寄存器);类2——块读(16设置块长度、17读一个数据块、18读多个数据块,直到发命令12);类4——块写(24写块、25写多个块、27写CSD的可编程为);类5——擦除(32设置擦除块的起始地址、33设置终止块地址、38擦除先前选择的所有块);块6——写保护(可选28设置写保护、29清除写保护、30读写保护状态);类7——锁卡命令(可选42上锁或者解锁);类8——指定应用(55通知SD卡下个是特殊应用命令、56获取或写入一个数据块);类10与类11——保留。
其中,SPI模式不支持类1,类3,类9。
2.2 SPI命令的响应状态有三种命令应答的格式,R1(1个字节)、R2(两个字节)和R3 R3(五个字节),因发送命令而不同。
大部分命令的响应是R1,R1的位段如下图所示,值为0x00表示运行成功,否则由相应状态位置1标识错误。
读取状态寄存器响应R2,只有读取32位的OCR(命令58)使用应答R3。
一些命令的执行时间比NCR长,它们使用应答R1B(1个字节)。
R1B同R1类似(有些命令只需要0或非0反馈,就用R1B,比如停止传输、擦除等命令),即为R1跟在忙标志后(在内部执行命令时DO保持低电平)。
主控制器应等待命令执行完毕直到DO转为高电平3. SPI模式下的初始化过程上电复位之后,MMC/SDC进入原生工作模式(SD模式)。
若要进入SPI模式,须如下图所示执行过程。
3.1 上电(插卡)卡供电达到2.2V以上后,还需等待至少1毫秒才能接收命令。
设定主机控制器的SPI 时钟频率在100kHz到400kHz之间。
设定DI和CS为高电平,同时发送至少74个时钟脉冲到SCLK上。
此时,卡将进入原生工作模式(SD模式)并准备接收原生命令。
3.2 软件复位在CS为低电平时发送命令0,对卡进行复位。
卡在接收命令0成功时对CS信号采样,若CS信号为电平,则卡进入SPI模式并且回应R1进入空闲状态(R1=0x01)。
由于命令0必须作为原生命令发送,CRC字段必须包含有效值。
卡一旦进入SPI模式,CRC功能就被关闭,不再进行CRC校验。
命令0和命令8需要CRC校验时,可将该字段写0。
命令59可以启动CRC功能。
3.3 初始化在空闲状态,卡只接收命令0、命令1、命令41、命令58和命令59。
其它的命令被拒绝执行。
此时,读OCR寄存器并查看卡的工作电压。
若系统供电不在卡的正常供电范围,则卡不工作。
注意,所有的卡工作电压范围为2.7~3.6V。
当接收到命令1时,卡执行初始化过程。
若要检测初始化过程是否结束,主机需持续发送命令1并查看回应直到初始化结束。
当卡成功完成初始化,应答R1的空闲状态位将清零(R1由0x01变为0x00)。
初始化过程将持续几百毫秒(卡容量越大,时间越长),故而需要考虑超时时间的设定。
在空闲状态位被清零后,卡可以接收正常的读写命令。
对于SDC建议时候用命令41(ACMD41)取代命令1,若命令41被拒绝后在用命令1尝试,在理想情况下,所有的卡都支持这两个命令。
若要提高对卡的读写性能,可将SPI通信速率尽量提高。
CSD寄存器中的TRAN_SPEED 字段指示了卡支持的最大工作频率。
大多数情况下,MMC最大工作频率为20MHz,SDC最大工作频率为25MHz。
注意,在SPI模式下时钟需要确定为20/25MHz,因为没有开环条件限制时钟频率。
对于2GB容量的卡,初始读写块长度为1024,这就需要使用命令16将读写块长度重新设定为512以适应FAT文件系统的工作要求。
3.4 支持SDC v2和高容量的卡卡通过命令0进入空闲状态后,以0x000001AA为参数发送命令8并发送正确的CRC,之后进入初始化进程。
若命令8被拒绝并回应非法命令错误(0x05),则表示此卡可能为SDC v1或是MMC。
若命令8被接收,并回应R7(R1(0x01)后跟着32位数据),返回值的低12位为0x1AA,则表示此卡为SDC v2,工作电压范围为2.7~3.6V。
否则,此卡将拒绝访问,此时,可使用以HCS(位30)为参数发送命令41(ACMD41)进行初始化。
完成初始化后,读OCR寄存器并检查CCS(位30),若该位置1,则下文说明的子序列数据读取操作中将使用块地址而不是字节地址。
块地址固定为512字节。
4. 数据传输4.1 数据包与数据回应在数据通信过程中,命令回应后将会有一个或多个数据块被发送/接收。
数据块以数据包发送。
数据包包含令牌(Token)、数据块(Data Block)和CRC校验码,数据包格式如下图所示。
停止传输令牌(Stop Tran Token)表示写入多个块的结束,以单个字节使用而无需数据块和CRC字段。
4.2 读单个块参数指定读取内容的起始地址,以字节或块为单位。
扇区地址是由高层指定的。
当命令17被接收,一个读操作即被启动并将读到数据发送到主机。
检测到有效的令牌后,主机控制器接收数据域和两个字节的CRC。
若不需要进行CRC校验,CRC字段数值必须被填充为偶数。
在读操作过程中,若发生错误,则将返回错误令牌而不是数据包。
4.3 读多个块读多块命令可以从指定地址连续读多个块。
在执行读命令之前,若未指定读取块的数量,传输过程将作为一个开放结束的多块读操作启动,读操作将连续执行,直到发送命令12结束。
发送命令12后,紧接着接收到(交换)的是一个填充字节,在接收到命令12的回应之前应将其抛弃。
4.4 写单个块当卡成功接收一个写命令时,主机控制器在一个空字节后发送数据包,发送数据包格式与块写入命令的格式相同。
若未启动CRC校验功能,CRC字段可以为任何值。
当主机发送一个数据包,卡将在接收数据包后立刻回应一个数据应答,数据应答跟随一个处理写操作的忙标志位。
大多数卡不能被更改写入块的大小,一般固定为512字节。
在基本的SPI模式下,CS信号在传输过程中应为有效,但存在一个例外。
当卡为忙时,主控制器可以关闭CS信号以释放与卡的SPI总线连接供其它SPI设备使用。
在进行内部处理过程中,卡将再次拉低DO信号。
由此,一个预先的忙查询过程(等待准备好后立刻发送命令或数据)取代消极地等待将有效地减少浪费时间。
附加的一个内部过程是在数据回应后发送的一个字节,这以为着启动内部写操作需要8个时钟驱动。
在8个时钟期间,CS信号的状态为无效,以便执行上述的释放总线的过程。
4.5 写多个块多块写命令将按序在指定地址上写入多个块。
若未指定写入块的数量,则写如过程将以开放结束多块写入(open-ended multiple block write)命令开始,连续写入多块数据,以停止传输令牌(Stop Tran token)结束。
在停止传输令牌发送后的一个字节,DO信号线上将会有忙标志。
对于SDC,对块写通信过程必须以一个结束传输令牌结束,与传输类型、预定义或是开放结束无关。
4.6 读CSD和CID读CSD和CID与单块读命令相同,但是读取长度不同。
CSD和CID以16字节的数据块发送给主机控制器。
关于命令(CMD)、CID和OCR,请参见MMC/SDC的说明。
5. 关于总线悬空与热插拔任何可能悬空的信号都应该通过一个上拉/下拉电阻设定初始电平,对于MOS设备,这是一个通用的设计标准。
由于DI和DO在默认情况下为高电平,所以它们应被上拉。
根据SDC/MMC的说明,上拉电阻的阻值建议为50K~100K ohms。
但是,在SDC/MMC说明中未提到时钟信号,这是由于这个信号始终是由主机控制器驱动。
如果有可能悬空,应被拉低到默认状态。
MMC/SDC支持热插拔,但需要考虑主机电路得避免误操作。
例如,若系统供电(Vcc)直接连在卡的接口上,Vcc将在卡接入的一瞬间被拉低,这是因为卡内部的电容上流过充电电流造成的,如A图所示,图中示波器显示电压下降了600mV,这已经足够触发掉电检测了。
B图所示为一个电感插入到接口电路中,瞬间压降为200mV。
一个小的ESR电容,比如6. 考虑多从机配置在SPI总线上,每个从机信号由CS信号选中,可以有多个设备挂载到SPI总线上。