《sd卡工作原理分析完整版.pdf》由会员分享,可在线阅读,更多相关《sd卡工作原理分析完整版.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、sd 卡工作原理分析侯会明2005-11-22一 CPU 相关,ssio 的连接和设置 21 硬件初始化,ssio 的相关配置 21)2)3)4)5)6)7)8)端口功能选择寄存器 一一 GPCTL.2端口模式寄存器 GPPMA,GPPMB,GPPMC,GPPMD,GPPME.2同步 SIO 控制寄存器 SSIOCON.3同步 SIO 状态寄存器 SSIOST.3同步 SSIO 测试控制寄存器一一 SSIOTSCON.4同步 SIO 收发缓冲寄存器一一 SSIOBUF.5同步 SIO 中断申请寄存器 SSIOINT.5同步 SIO 中断使能寄存器 SSIOINTEN.52 CPLD 片选 63
2、 第三步,ssio 收发字符相关 6二数据包的封装与命令协议相关 61 sd 卡指令数据包 62 sd 卡命令索弓 I 表 73 命令回应 repond.101)R1模式 102)R2模式 113)R3模式 11三命令的控制与实现 121 程序中调用的 sd 卡命令 121)2)3)4)命令响应函数-UCS_DRSD_niCommandRespond.12sd 卡驱动程序初始化 UCS_DRSD_giSdIdentify.13读 sd 卡操作函数 15写 sd 卡操作函数 15四 sd 卡的配置信息和相关结构体 161 卡识另 U 寄存器-CID(card identification reg
3、ister)162 卡特性寄存器-CSD(card specific data register).17一 CPU 相关,ssio 的连接和设置1 硬件初始化,ssio 的相关配置1)端口功能选择寄存器一一 GPCTL地址:0XB7000000功能描述:这个寄存器配置各组 GPI。的管教原始功能或者第二功能;CPU 可以对这个寄存器进行读/写访 I 可;复位后的默认值是 0X0000 015 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0-*GPCTLAt reset000000000000000这里对这个寄存器有两处操作 首先将此寄存器和0 x0008 与,来操作 GP
4、PMB;GPCTL3(bit3)位控制管脚 PIOB4和 PIOB1:0的功能,设置如下:GPCTL3=“0”原始功能)GPCTL3=“1”第。功能)FunctionIn/OutFunctionIn/OutPIOB0In/OutDREQ0InputPIOB1In/OutDREQCLR0OutputPIOB4In/OutTCOUT0Output 然后将此寄存器和 0 x0100 或,来操作 GPPME。GPCTL9(bit9)位控制管脚的功能,它的第二功能是 ssioGPCTL9=“0”原始功能)GPCTL9=“1”第匚功能)FunctionIn/OutFunctionIn/OutPIOE3In
5、/OutSDAIn/OutPIOE4In/OutSCLOutput2)端口模式寄存器GPPMA,GPPMB,GPPMC,GPPMD,GPPME 地址:0 xB7A010080 xB7A01088功能描述:这些寄存器指定相应管脚的 I/O 流向(PIOA7:0,PIOB7:0,PIOC7:0,PIOD7:0and PIOE9:0);CPU 可以对这个寄存器进行读/写访问;复位后的默 认值是 0 x0000。GPPMA7:0/GPPMB7:0/GPPMC7:0/GPPMD7:0(bits 0 to 7)/GPPME9:0(bits 0 to 9):,这些位置 0 时表示 input;置 1 时表示
6、 output。1510 9876543210-*-*-*-GPPM*GPPMA7:0/GPPMB7:0/GPPMC7:0/GPPMD7:0/GPPME9:0,GPPME uses bit9&bit8.For other GPPMx,bit9&bit8 are-*”.At reset0000000000这里对寄存器 GPPMB 和 0 x0002,将 PIOB2作为输出,作用是 CPLD 的片选对寄存器 GPPMEfe 后进行了三步操作:首先将寄存器和 0 x0001 或将 PIOE0作为输出,该管脚输出时钟 clock0再次将寄存器和 0 xfffd 与将 PIOE1作为输入,该管脚为 SD
7、I,即 SD 卡的输入。最后将寄存器和 0 x0004 或将 PIOE4作为输出,该管脚为 SDO,即 SD 卡的输出。3)同步 SIO 控制寄存器SSIOCON地址:0 xB7B01010功能描述:SSIOCON 寄存器用来控制收发操作。这个寄存器可以通过程序来进 行读或者写。如果 SSIOCON 寄存器被修改,那么变化会在收发操作结束后生 效。如果 SSIOCON 在传送过程中被修改,那么当前的操作将不能正确的执行。76543210SSIOCON-*-*SLMSBSFTSLV-*-*SFTCLK 1:0At reset00000000注意:-*是保留位,这些位总是被写 0,如果这些位被写
8、1,正常操作无法被保 证。位说明:SFTCLK 1:0(bit 1 to bit 0)这两位选择同步时钟,操作必须在主模式(master mode,从模式(slave mode)被禁止。bit1:0=00 时,1/8 HCLK;bit1:0=01 时,1/16 HCLKbit1:0=1x 时,1/32 HCLKSFTSLV(bit 4)这位用来选择主从模式bit4=0 时,Master modebit4=1 时,Slave modeSLMSB(bit 5)这位用来选择在收发数据过程中最低有效位在前(LSB first)还最高有效位在前(MSB first)bit5=0 时,LSB firstb
9、it5=1 时,MSB first这里将其存器设置成 0 x22,选择了主模式 Master|最高有效位在前 MSB|1/32HCLK。4)同步 SIO 状态寄存器SSIOST 地址:0 xB7B01004功能描述:SSIOST 寄存器指示同步 SIO 的操作状态,通过程序可以读写 OERR 和 BUSY。寄存器的 SFTCT2:0位是只读的,写这些位无效,当写这些位是,将写 0。6543210SSIOSTSFTCT 2:0-*-*-*OERRBUSYAt reset00000000注意:-*位是保留位,总是向这些位写 0,如果写 1,正常德操作将无法保证。位说明:BUSY(bit 0)这位指
10、示数据正在被收发,这位在数据收发时自动置 1,操作完成时自动活 00 当置 1 时,意味着数据正在被传送,在传送的过程中写 0,可能会终止收发操作 并且重新初始化 SSIO。如7果在空闲时写 0,操作是无效的。当 bit0=0,Transmit-receive idle当 bit0=1,Transmit-receive in progressOERR(bit 1)这位指示 overrunl 昔误是否发生。如果当前接收的数据没有被读,CPU 该位置 1。一旦被置 1,这位不会活 0,即使在下一个接受操作中没有 overrun!昔误发生。因 此有必要在程序中活 0,写 0 该位被活 0,但写 1
11、也被置 1。当 bit1=0,No overrun error当 bit1=1,Overrun errorSFTCT2:0(bit 7 to bit 5)这个位指示 3 位移位计数器的当收发时的计数值。当没有数据收发时计数器被 设置成 000(二进制)。每次收发数据时有移位,计数器增1。当收发操作结束时或者 BUSY 位在接收数据过程中写 0 时,寄存器返回 000。这里这个寄存器被写 0 x00 活除状态。5)同步 SSIO 测试控制寄存器 SSIOTSCON地址:0XB7B01014功能描述:SSIOTSCON 是一个可以设计简单的同步 SIO 内部测试的寄存器,寄 存器可以有程序读写。在
12、普通操作中,设置 SSIOTSCON 为 0 x00,收发数据时不 覆盖此寄存器的内容。765SSIOTSCONLBTST-*At reset0004-*03210-*0000注意:-*位是保留位,这些位总是写 0,如果写 1,正常的操作无法保证。位说明:LBTST(bit 7)这个位使能循环回侧函数,当循环回侧函数使能时,发送信号作为接收信号被 读回。当 bit7=0,Loop back test function disabled(normal mode)当 bit7=1,Loop back test function enabled(test mode)这里这个寄存器被写 0 x80,循
13、环回侧函数使能,进行虚拟发送数据0 xff 并接6)同步 SIO 收发缓冲寄存器一一 SSIOBUF地址:0XB7B01000功能描述:SSIOBUF 寄存器在收发操作过程中保存收发的数据,寄存器可以通 过程序读/写。当写时,寄存器作为发送缓冲区;读时,寄存器作为接收缓冲 区。当接收 SSIOBUF 的内容时,数据保存直到下次接收操作完成。转换并行发 送数据为申行数据和转换申行接收数据为并行数据时SSIOREG 寄存器被配置成移位寄存器。在发送操作中,发送数据写到 SSIOBUF 中,SSIOBUF 中的数据自 动传送给SSIOREG。在接收操作中,当接收完最后一位时,SSIOREG 数据传送
14、 给 SSIOBUF。寄存器 SSIOREG 不能在程序中读/写。7)同步 SIO 中断申请寄存器SSIOINT 地址:0XB7B01008功能描述:SSIOINT 寄存器设定一个同步 SIO 中断请求,可以通过程序读写寄存器,向一位写 1 来活除该位。注意:-*作为保留位,这些位总是写 0,如果这些位被写 1,正常德操作无法保 证SSIOINTAt reset7-*06-*05-*04-*03-*0210TREMPRXCMPTXCMP000位说明:TXCMP(bit 0)当发送完成时这位被设置。当 bit0=0,Transmission not complete当 bit1=1,Transm
15、ission completeRXCMP(bit 1)当接收完成时这位被设置。当 bit1=0,Reception not complete当 bit1=1,Reception completeTREMP(bit 2)当收发缓冲区寄存器的数据被传送到移位寄存器并且收发缓冲区为空时这位被 置位。当 bit2=0,Transmit data not transferred当 bit2=1,Transmit data transferred这里将此寄存器写入 0 x07,将 3 个标志位置 1,活除中断作为初始状态。8)同步 SIO 中断使能寄存器 SSIOINTEN地址:0XB7B0100C功能描
16、述:SSIOINTEN 寄存器可以使能同步 SIO 中断,可以通过程序读写寄存SSIOINTENAt reset位说明:7-*06-*05-*04-*03-*0210TREMPRXCMPTXCMP000注意:-*是保留位,总是对这些位写 0,如果写 1,正常操作无法保证TXCMPEN(bit 0)这位使能发送完成时的中断请求。当 bit0=0,Transmit complete interrupt request masked当 bit0=1,Transmit complete interrupt request enabledRXCMPEN(bit 1)这位使能接受完成时的中断请求。当 bi
17、t1=0,Receive complete interrupt request masked当 bit1=1,Receive complete interrupt request enabledTREMPEN(bit 2)这位使能收发缓冲区为空时的中断请求。当 bit2=0,Transmit-receive buffer empty interrupt request masked当 bit2=1,Transmit-receive buffer empty interrupt request enabled这里将此寄存器写入 0 x00,禁止所有中断2 CPLD 片选先读入地址 0 xf800
18、000e 中的值如果选中片选,向地址 0 xf8000002 写 0,拉低电平;如果为选中片选,向地址 0 xf8000002 写 1,拉高电平3 第三步,ssio 收发字符相关首先读取 SSIOINT 中的内容,SSIOINT 在这里是状态寄存器,中断已经屏 蔽,因此与中断无关。然后与 3 个宏定义比较SSIOCON_TXCMPEN 0 x01/*transmit complete*/SSIOCON_RXCMP0 x02/*receive complete*/SSIOCON_TREMP=0 x04/*transmit empty*/3 个宏分别 N 示 SSIOINT 的后 3 位置 1,比
19、较结果哪位置 1 证明此时操作已经完 成,但由丁屏蔽了中断,不产生中断。其次将 3 个宏定义的值相应的写入 SSIOINTo最后根据操作要求向 SSIOBUF 写数据或者读出 SSIOBUF 中的数据。二数据包的封装与命令协议相关1 sd 卡指令数据包s 仆的指令被封装成 48 位的数据包,每次传送这48 位的数据包。数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7 位 CRC 校验码。其具体格式分布如下图Bit 位置Bit 宽度值说明471“0”461“1”45:406x39:0832xArgument07:017xCRC7001“1”End bitTransmission b
20、itCommandStart bitindex其中的命令索引位是45:40,里面可以封装各种命令,具体的命令表将在下 面给出。不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格式,在命令表中的选项会给出。2 sd 卡命令索引表CMD简略语指令说明SPI 模式自变量回应0GO_IDLE_STATENoneR1这是使 car 刑始化到 Idle 状态的指令.CS 信号设 在Low 的状态时,接到本指令后,card 将转换 到SPI 模式.1SEND_OP_COND2ALL_SEND_CID接到本指令后,card 务做 R3 回应(含有 OCR 数据).根据 OCR值,可
21、以得知cardt 工作电压范围.OCR 数据最局值位的 1bit 是用来确认 card 内部处理是否结束(Ready/Busy询).接到本指令后,处丁 Read/犬态的 cardW 传送NoneR1CID 数据.在MMC 模式下,数据被送到 CMD 信号,在 CID 数据的每 1bit 传送 后,CMD 信号状 态财与该 card 内部状态相比较,如果不一致,将中止数据传送,carcte 回到 Ready 犬态.如果相一致,该 card将认为已被 选中,然后转换到Identification 状态.本指令会为已转换至 UIdentification 状态的 car 盼配 一个相对 cardft
22、 址(RCA).当 RCA 分配后,cartfB 转 换到Stand-by 状 态,对以后的 CMD2和 CMD3 不回应.3SET_RELATIVE_ADDR4NOP7SELECT/DESELECT_CARD这是用来设定DSR(DriveState 寄存器)的指令,但是本 car支持DSR.本指令是用来选择一张 card,让它在 Stand-by 犬态和 Transfej 犬态之间转换的指令.如果给 cardiS 定已分配到的 RCA 地址,cardW 从Stand-by 犬态转换到 Transfer!犬态,并将回应以后的读取指令及其他指令.如果给card 设定 RCA 以外的地址,card
23、W转换到 Stand-by状态。当RCA=0000h91011SEND_CSDSEND_CIDREAD_DAT_UNTIL_STOP时,cardW 无条件地转换到 Stand-by状态.接到本指令后,将传送 CSD 数据.接到本指令后,将传送 CID 数据.接到本指令后,将从设定的地址传 送P2ROM 数据,直到接到指令CMD12 为止.本指令强行终止NoneNoneR1R112STOP.TRANSMISSIONNoneR113SEND_STATUS15GO_INACTIVE _STATECMD11 和CMD18 的处理接到本指令后,将传送状态寄存器的信息.接到本指令后,将转换到休止(inac
24、tive)状态.NoneR216SET_BLOCKLEN本指令用来设定Block 长度.对象是以后的指令CMD17CMD18.和31:00 blocklengthR117READ_SINGLE _BLOCK18READ_MULTIPLE _BLOCK31:00 dataaddress接到本指令后,将从自变量设定的 地址传送 1 个 block长 度 的 数据.(block 长度由 指令 CMD16 设 定).接到本指令后,将31:00 dataaddress从自变量设定的 地址连续传送block长度的数据,直到接到指令CMD12为R1R123SET_BLOCK _COUNT止.(block 长
25、度由指令 CMD16 设定).31:16set to 0R1本指令是给紧跟15:00number of的指令 CMD18block设定要传送的block 数量.dataR1接到本指令后,将31:0写 1 个 block 长度address的数据到自变量设定的地址.(block 长度由指令 CMD16 设定).dataR1接到本指令后,将31:0连续写 block 长度address的数据到自变量 设定的地址,直到 接到指令 CMD12 为止.(block 长度 由指令 C MD16 设定).NoneR3接到本指令后,Card 将传送OCR 数据.24WRITE_BLOCK25WRITE_MUL
26、TIPLE_ BLOCK58READ_OCR59CRC_ON_OFF31:01 stuff bits00:00 CRCoptionON 或 OFF.在 SPI模式下,CRC 的初始值设定为本指令是用来设定 CRC 选项为OFF.CRC选 项bit=1 表 示CRCON;CRC选项bit=0 表 示CRCOFF.R13 命令回应 repond1)R1 模式对象指令CMD0:GO_IDLE_STATECMD1:SEND_OP_CONDCMD9:SEND_CSDCMD10:SEND_CIDCMD12:STOP_TRANSMISSIONCMD16:SET_BLOCKLENCMD17:READ_SING
27、LE_BLOCKCMD18:READ_MULTIPLE_BLOCKCMD23:SET_BLOCK_COUNTCMD59:CRC_ON_OFF765432001002)R2 模式对象指令CMD13:SEND_STATUS15 14 13 12 11 10009870654321000000003)R3 模式对象指令CMD58:READ_OCR39 38 37 36 35 34 33 3200OCR00三命令的控制与实现1 程序中调用的 sd 卡命令在程序中的 sd 的命令发送响应主要通过函数UCS_DRSD_niCommandRespond来实现。其他函数通过调用这个函数完成对sd 卡独作,成里
28、主要有 3 个函数:sd 卡驱动程序初始化、读 sd 卡操作和写 sd 卡操作函数,下面分别对这些 函数具体分析:1)命令响应函数-UCS_DRSD_niCommandRespondUCS_DRSD_niCommandResponc(W iCmd,UW uiArg,UB*pucRsp)参数务别表示:icmd 一命令号uiArg命令参数pucRsp命令响应的存储地址本函数分别涉及到了命令的处理CMD9、CMD10:接收 sd 卡的 CSD 和 CID 信息。CMD17、CMD24:读写单个 block 数据,CMD18、CMD25:读写多个 block 数CMD58:读取 sd 卡 OCR 信息
29、。2)sd 卡驱动程序初始化UCS_DRSD_giSdIdentify在 mainTask 中最开始调用,进行 sd 卡驱动的上电初始化。次函数调用上面的函数实现命令的设置,顺序进行了如下设置:CMD1:设置 sd 卡的工作电压UCS_DRSD_niCommandRespond(CMD1,UCS_DRSD_OCR_VAL,ucRsp_a)CMD59:使能 CRC 校验UCS_DRSD_niCommandRespond(CMD59,1,ucRsp_a)CMD9:读取 sd 卡的 CSD 信息UCS_DRSD_niCommandRespond(CMD9,0,ucRsp_a)CMD10:读取 sd
30、卡的 CID 信息UCS_DRSD_niCommandRespond(CMD10,0,ucRsp_aCMD16:设置 sd 读写块的大小,设置值为 512 个字节UCS_DRSD_niCommandRespond(CMD16,UCS_DRSD_ATASECTORSIZE,ucRsp_ a)3)读 sd 卡操作函数本函数主要处理了 CMD17 的读单个 block 操作,流程如下通过调用 DataIn 函数来读取 512 字节的数据,DataIn 函数的是这样实现的,接 收 512个字节的数据和 2 个字节的 16 位 CRC 校验码。4)写 sd 卡操作函数本函数主要处理了 CMD24,写单个
31、 block 操作,流程如下:END函数调用 DataOut 函数,其机制与 DataIn 相似。四 sd 卡的配置信息和相关结构体sd 卡驱动程序共定义了 4 个结构体:UCS_DRSD_SDTInfo_stsd 卡任务信息UCS_DRSD_SD_BASICINFO_stsd 卡物理信息UCS_DRSD_SD_CID_stsd 卡 CID 信息UCS_DRSD_SD_CSD_s sd 卡 CSD 信息Y其中,物理信息、CID 和 CSD 信息是从硬件上读取回来的,CID 和 CSD 直接 复制给程序中的结构体,物理信息 basicinfo 需要转换它们是在 mainTask 的 identi
32、fy 函数中调用的,CID 和 CSD 通过命令 CMD9 和CMD10 获取硬件信息后,直接复制。物理 信息的结构体是将 CSD 信息中 LBA(逻辑块地址)方式转换成 CHS(柱面 磁头 扇区)方式后得到的。1 卡识别寄存器-CID(cardidentification register)CID-slice127:120名称Manufacture ID栏目MIDBit 宽度8值0 x41OKI 原创OKI ID,由MMCA 指119:104103:5655:48OEM/Application IDProduct nameProduct revisionOIDPNMPRV1648847:16
33、Product serial numberPSN3215:8Manufacturing dataMDT87:17-bit CRC checksumCRC7r 70:0-12 卡特性寄存器一一-CSD(card specific data register)BitCSD-slice127:126125:122121:120119:112111:104103:9695:8483:80名称栏目宽度OK 设备名产品名产品修订版(version1.0)0 x00000001产口口编勺Default=1,user 设定可收到 Code文件的月份OKI 收到 客户 Code 档案的日 期,或是写 入程序的
34、日期检验和:CRC固定是”1”10 x0000P20160 x10值Type备注Bin.100011X0000100000000001001010100000000001111001Hex.0 x20 x3X0 x080 x010 x2A0 x0070 x9RRRRRRRRVersion 3.1Version 3.1不必理会CSD Structurespec versionCSD_STRUCTURESEPC_VERS242Reserveddatatime1 read accessdatatime2 read accessmax rate data transfercard command cl
35、assmax read data blocklengthTAACNSACTRAN_SPEEDCCCREAD_BL_LEN8881241ns100cycles20Mb/s支持Class0,1,2512字节79partial blocks for read allowedREAD_BL_PARTIAL110 x1R78Reserved1XXR不必理会777675:7473:6261:5958:5655:5049:4746:3130:2928:2625:22read block misalignmentDSR implementedREAD_BLK_MISALIGNDSR_IMP11200X1111
36、11111110000100X001X00X10010 x00 x0X0 xFFE0 x00 x4X0 x1X0 x0X0 x9RRR禁止跨越BlockDSR:不支持不必理会Reserveddevice sizemin.read currentmax.read currentC_CIZEVDD_R_CURR_MINVDD_R_CURR_MAX12336RRRR0.5mA35mA不必理会Reserveddevice size multiplierC_SIZE_MULT316RRRRRReservedmanufacture default ECC不必理会DEFAULT_ECC23ECC:不支持不必
37、理会ReservedWRITE_BL_LENMax.write data block length421:161514Reservedfile format groupCopy flag(OTP)6FILE_FORMAT_GRPCOPY11X00X0 x00 x0R不必理会RRDefault=0 User设定可13permanent protectionwritePERM_WRITE_ PRO TECT110 x1R12temporary protectionwriteTMP_WRI TE_ PROTECT110 x1R11:10file form atFILE_FORMAT2000 x0RDefault=0 User设定可9:87:10ECC codeCRCECCCRC27100CRC10 x0CRC0 x1RECC:不支持RReservedR