
SD卡详细中文资料.doc
17页SD卡管脚定义及C语言讲解(1 ) SD卡的引脚定义/Cllllllll■ 12 3J5678SD MemoryCardSD卡引脚功能详述:引脚编号SD模式SPI模式名称类型描述名称类型描述1CD/DAT3IO 或 PP卡检测/数据线3#CSI片选2CMDPP命令/ 回应DII数据输入3VssiS电源地VSSS电源地4VddS电源VDDS电源5CLKI时钟SCLKI时钟6VSS2S电源地VSS2S电源地7DATOIO 或 PP数据线0DOO或PP数据输岀8DAT1IO 或 PP数据线1RSV9DAT2IO 或 PP数据线2RSV注:S:电源供给 I :输入O:采用推拉驱动的输出PP :采用推拉驱动的输入输出SD卡SPI模式下与单片机的连接图:eucw药单片机-O*:i h—4 r [~~b *IZ^LSD卡支持两种总线方式:SD方式与SPI方式其中SD方式采用6线制,使用CLK、 CMD、DAT0~DAT3 进行数据通信而 SPI方式采用4线制,使用 CS、CLK、Data In、 DataOut进行数据通信SD方式时的数据传输速度与 SPI方式要快,采用单片机对 SD 卡进行读写时一般都采用 SPI模式。
采用不同的初始化方式可以使 SD卡工作于SD方式或SPI方式这里只对其 SPI方式进行介绍2) SPI方式驱动SD卡的方法SD卡的SPI通信接口使其可以通过 SPI通道进行数据读写 从应用的角度来看,采用 SPI接口的好处在于,很多单片机内部自带 SPI控制器,不光给开发上带来方便,同时也见降低了开发成本然而,它也有不好的地方,如失去了 SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽 SPI接口的选用是在上电初始时向其写入第一个命令时进行的以下介绍 SD卡的驱动方法,只实现简单的扇区读写1)命令与数据传输1.命令传输SD卡自身有完备的命令系统,以实现各项操作命令格式如下:此位为1说明星主机给旳卡的命令幵雌昭却 : 命令内容 惟I巧验码 勞事位始终为]01CONTENTCRC1总长度为粕亍位』即自亍字节命令的传输过程采用发送应答机制,过程如下:每一个命令都有自己命令应答格式在 SPI模式中定义了三种应答格式,如下表所示:1擦除复位0闲置状态2〜5全部操作条件寄存器,高位在前写命令的例程:1.// 2.向SD卡中写入命令,并返回回应的第二个字节3.// 4.unsigned char Write_Command_SD( unsigned char5.{6.unsigned char tmp;7.unsigned char retry=0;8.unsigned char i;9.10.//禁止SD卡片选11.SPI_CS=1;12.//发送8个时钟信号13.Write_Byte_SD(OxFF);14.//使能SD卡片选15.SPI_CS=0;16.17.//向SD卡发送6字节命令18.for (i=0;i<0x06;i++)19.{20.Write_Byte_SD(*CMD++);21.}22.23.//获得16位的回应24.Read_Byte_SD(); //read the first byte,ignore25.do26.{ //读取后8位27.tmp = Read_Byte_SD();28.retry++;29.}30.while ((tmp==0xff)&&(retry<100));31.return (tmp);32.}*CMD)it.33.2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。
在初 始化过程中,SPI的时钟不能太快,否则会造初始化失败在初始化成功后,应尽量提高SPI的速率在刚开始要先发送至少 74个时钟信号,这是必须的在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功随后就是写入两个命令 CMD0与CMD1, 使SD卡进入SPI模式初始化时序图:(CMDilN(DATA)OUInlh(CMD} IN(DATA) OUT初始化例程:1. // 2. 初始化SD卡到SPI模式3. // 4. unsigned char SD_lnit()5. {6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.unsigned charretry,temp;unsigned chari;unsigned charCMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};SD_Port_Init();//初始化驱动端口Init_Flag=1;//将初始化标志置1for (i=0;i<0x0f;i++){Write_Byte_SD(Oxff); //发送至少74个时钟信号}//向SD卡发送CMD0retry=0;do{ //为了能够成功写入CMD0,在这里写200次temp=Write_Command_SD(CMD);retry++;if (retry==200){ //超过200次return (INIT_CMDO_ERROR); //CMDO Error!}}while (temp!=1); // 回应 01h,停止写入//发送CMD1至U 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 停止写入lnit_Flag=0; //初始化完毕,初始化标志清零SPI_CS=1; //片选无效return (0); //初始化成功50. }51.52.3) 读取CIDCID寄存器存储了 SD卡的标识码。
每一个卡都有唯一的标识码CID寄存器长度为128位它的寄存器结构如下:名称域数据宽度CID划分生产标识号MID8[127:120]OEM/应用标识OID16[119:104]产品名称PNM40[103:64]产品版本PRV8[63:56]产品序列号PSN32[55:24]保留—4[23:20]生产日期MDT12[19:8]CRC7校验合CRC7[7:1]未使用,始终为1—1[0:0]它的读取时序如下:8 8r r I. •4 AH 刖FFhr GhT .i:CK1DHN(DATA) OUTu OOnFEh• SA・1肯㈣与此时序相对应的程序如下:1. // 2. 读取SD卡的CID寄存器 16字节 成功返回03. // unsigned char Read_CID_SD( unsigned char *Buffer)5. {6. //读取CID寄存器的命令7. unsigned char CMD[] = {0x4A,0x00,0x00,0x00,0x00,0xFF};8. unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10. return (temp);11. }4)读取CSDCSD (Card-Specific Data )寄存器提供了读写 SD卡的一些信息。
其中的一些单元可以 由用户重新编程具体的 CSD结构如下:名称域数据宽度单元类型CSD划分CSD结构CSD_STRUCTURE2R[127:126]保留-6R[125:120]数据读取时间1TAAC8R[119:112]数据在CLK周期内读取时间 2( NSAC*100 )NSAC8R[111:104]最大数据传输率TRAN_SPEED8R[103:96]卡命令集合CCC12R[95:84]最大读取数据块长READ_BL_LEN4R[83:80]允许读的部分块READ_BL_PARTIAL1R[79:79]非线写块WRITE_BLK_MISALIGN1R[78:78]非线读块READ_BLK_MISALIGN1R[77:77]DSR条件DSR_IMP1R[76:76]保留-2R[75:74]设备容量C_SIZE12R[73:62]最大读取电流@Vdd minVDD_R_CURR_MIN3R[61:59]最大读取电流@VddmaxVDD_R_CURR_MAX3R[58:56]最大写电流 @Vdd minVDD_W_CURR_MIN3R[55:53]最大写电流 @Vdd maxVDD_W_CURR_MAX3R[52:50]设备容量乘子C_SIZE_MULT3R[49:47]擦除单块使能ERASE_BLK_EN1R[46:46]擦除扇区大小SECTOR_SIZE。
