版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、www. alientek comALIENTEK STM32开发板AN1302AN1302 STM32 SDIO 的使用木应用文档(AN1302,对应ALIENTEK战舰STM32扩展实验2 )将教人家如何使用STM32 的SDIO接II来驱动SD卡,并结合FATFS,实现对SD卡的读写操作。本文档分为如卜JL部分:1, SDIO简介2, 硬件连接3, 软件实现4, 验证1、SDIO接口简介STM32F103人容战系列(FLASH2256K)产品都含仃SDIO控制器,ALIENTEK战舰STM32 开发板所使用STM32F1O3ZET6就属于大容帚产品,带有SDIO接II。本节,我们将简单介
2、绍 STM32的SDIO接II,包括:功能及框图、时钟、命令与响应和相关寄存器简介等,最 后,我们将介绍SD卡的初始化流程。1.1 SDIO主要功能及框图STM32的SDIO控制器支持多媒体卡(MMC卡)、SD存储卡、SD I/O卡和CE-ATA设备等。 SDIO的主要功能如卜:> 与多媒体卡系统规格帖版本4.2全兼容。支持二种不同的数据总线模式:1位(默认)、 4位和8位。> 与较早的多媒体卡系统规格版木全兼容(向前兼容)。> 与SD存储卡规格版本2.0全兼容。> 与SDI/O卡规格版木2.0全兼容:支持良种不同的数据总线模式:1位似认)和4 位。> 完全支持C
3、E-ATA功能(与CE-ATA数字协议版本1.1全兼容)。8位总线模式F 数据传输速率可达48MHz。> 数据和命令输出使能信号,用丁控制外部双向驱动器。STM32的SDIO控制器包倉2个部分:SDIO适配器模块和AHB总线接I I, JC功能框图如 图1.1.1所示:HCLK/2SDIOCLK图1.1.1 STM32的SDIO控制器功能框图复位后默认情况F SDIO_DO用数据传输。初始化厉主机吋以改变数据总线的宽度(通 id ACMD6命令设置)。如果一个多媒体卡接到了总线上,则SDIO_DO、SDIO_D3:0或SDIO_D7:0冋以用J:数 据传输。MMC版本V3.31和Z前版本
4、的协议只支持1位数据线,所以只能用SDIO_DO (为 了通用性考偲,在程序里面我们只要检测到是MMC V就设置为1位总线数据)。如果一个SD或SD I/O卡接到了总线上,可以通过主机配置数据传输使用SDIO_DO或 SDI0_D3:0o所有的数据线都工作在推挽模式。SDIO_CMD有两种操作模式: 用于初始化时的开路模式(仅用I" MMC版本V3.31或Z前版本) 用丁命令传输的推挽模式(SD/SD I/O卡和MMC V4.2在初始化时也使用推挽驱动)1.2 SDIO的时钟从图1.1.1我们可以看到SDIO总共有3个时钟,分别是:卡时钟(SDIO-CK):每个时钟周期在命令和数据线
5、上传输1位命令或数据。对J:多媒 体卡V3.31协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体k V4.0/4.2协议,时 钟频率可以在0MHz至48MHz间变化:对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz 间变化。SDIO适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,其频率等于AHB总线频 率(HCLK),并用丁产生SDIO_CK时钟。AHB总线接口时钟(HCLK/2):该时f中用加动SDIO的AHB总线接I I,其频率为HCLK/2 前面提到,我们的SD卡时钟(SDIO_CK),根据卡的不同,可能有好儿个区间,这就涉 及到时钟频率的设置,SDIO
6、_CK与SDIOCLK的关系为:SDIO_CK=SDIOCLK/(2+CLKDIV)其中,SDIOCLK为HCLK, 般是72Mhz,而CLKDIV则是分配系数,可以通过SDIO的 SDIO_CLKCR寄存器进行设置(确保SDIO.CK不超过卡的最人操作频率)。这里耍提醉大家,在SD尺刚刚初始化的时候,其时钟频率(SDIO-CK):不能超过400Khz 的,否则町能无法完成初始化。在初始化以后,就町以设置时钟频率到最人了(但不可超过 SD卡的最人操作时钟频率)。1.3 SDIO的命令与响应SDIO的命令分为应用相关命令(ACMD)和通用命令(CMD)两部分,应用相关命令 (ACMD)的发送,必
7、须先发送通用命令(CMD55),然后才能发送应用相关命令(ACMD)。 SDIO的所冇命令和响应都是通过SDIO_CMD引脚传输的,任何命令的长度都是固定为48位, SDIO的命令格式如表1.3.1所示:位宽度数值说明4710开始位4611传输位45:406-命令索引39:832-参数7:17-CRC?011结束位衣13.1 SDIO命令格式所有的命令都是由STM32发出,其中开始位、传输位、CRC7和结束位由SDIO硬件控 制,我们盂耍设置的就只仃命令索引和参数部分。其中命令索引(如CMDO, CMD1Z类的) 在SDIO_CMD寄存器里面设置,命令参数则由寄存器SDIO_ARG设置。一般情
8、况卜,选中的SD卡在接收到命令Z后,都会回复一个应答(注意CMDO是无应 答的),这个应答我们称之为响应,响应也是在CMD线上串行传输的。STM32的SDIO控制 器支持2种响应类型,即:短响应(48位)和长响应(136位),这两种响应类型都带CRC 错谋检测(注意不带CRC的响应应该忽略CRC错误标志,如CMD1的响应)。短响应的格式如表1.3.2所示:位宽度数值说明4710开始位4610传输位45406命令索引39:832参数717011结束位1.3.2 SDIO命令格式长响应的格式如表1.3.3所示:位宽度数值说明13510开始位13410传输位(133:1286111111保留1271
9、127-CID或CSD(包含内部CRG7)01I结束位表1.3.3SDIO命令格式同样,硬件为我们滤除了开始位、传输位、CRC7以及结束位等信息,对于短响应,命 令索引心放在SDIO_RESPCMD寄存器,参数则存放在SDIO_RESP1寄存器里而。对J:长响应, 则仅留CID/CSD位域,存放在SDIO_RESP1SDIO_RESP4等4个寄存器。SD存储卡总共有5类响应(Rl、R2、R3、R6、R7),我们这里以R1为例简单介绍一 R1 (普通响应命令)响应输入短响应,其长度为48位,R1响应的格式如13.4所示:位域宽度数值说明47I0开始位46I0传输位45406X命令索引39:832
10、X卡状态7:17XCRC7011结束位衷1.3.4 R1响应格式在收到R1响应后,我们可以从SDIO_RESPCMD窃存器和SDIO_RESP1寄存器分别读出命 令索引和卡状态信息。关于其他响应的介绍,请人家参考光盘:SD卡2.0协议小(0或STM32 中文参考手册_V10.pdf。我们看看数据在SDIO控制器与SD卡Z间的传输。对r SDI/SDI0存储器,数据 是以数据块的形式传输的,而X1T-MMC卡,数据是以数据块或昔数据流的形式传输。本节 我们只考虑数据块形式的数据传输。SDIO (多)数据块读操作,如图1.3.1所示:SDIO CMD 主机至卡卡至主机I卡至上机的敷祁Stop命令
11、停止故据传输和令H响应www. openedv. com2013-03-10www. alientek comALIENTEK STM32开发板AN1302www. openedv. com2013-03-10www. alientek comALIENTEK STM32开发板AN1302SDIO D|数据块|cc卜数IR停止慄作读数押块操作多个读数抵块操作1.3.1 SDIO (多)数据块读操作从上图,我们町以看出,从机在收到主机相关命令后,开始发送数据块给主机,所冇数 据块都带冇CRC校验值(CRC (11 SDIO唤件自动处理),单个数据块读的时候,在收到1个数 据块以后即町以停止了,不
12、盂耍发送停止命令(CMD12)。但是幺块数据读的时候,SD卡将 一直发送数据给主机,直到接到主机发送的STOP命令(CMD12)oSDIO (多)数据块写操作,如图132所示:命令卜响应1T数据块| crcH繁忙|, 数州仔止廉作多个数据块写操作Slop命令 停止数擁传输主机至卡卡至主机Iv 主机至卡的教料SDIO CMD- 命令H响2|SDIO D 町能的卡繁忙 CE-ATA 需 SI图1.3.2SDIO (多)数据块写操作数据块写操作同数据块读操作基本类似,只是数据块写的时候,女了一个繁忙判断,新 的数据块必须在SD 繁忙的时候发送。这里的繁忙信号宙SD K拉低SDIO_DO,以衣示繁 忙
13、,SDIO硬件自动控制,不需耍我们软件处理。SDIO的命令与响应就为人家介绍到这电。1.4 SDIO相关寄存器介绍第一个,我们来看SDIO电源控制寄存器(SDIO_POWER),该寄存器定义如图1.4.1所 示:31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 543210保留PWRCTF1resrw忖312保RL始终读为6位1:0PWRCTRL:电源控制位(Power supply control bi 达些位用丁定义M时钟的F前功能状志: 00:申源关匸的时W停心。01:保留.10:保宙的上电
14、状念11:上电状念.卡的时钟开启。图1.4.1 SDIO_POWER寄存器位泄义该寄存器复位值为0,所以SDIO的电源是关闭的,我们耍启用SDIO,第一步就是耍设 置该寄存器最低2个位均为1,让SDIO上电,开启卡时钟。第:个,我们看SDIO时钟控制寄存器(SDIO_CLKCR),该寄心器主要用设B SDIO_CK 的分配系数,开关等,并对以设置SDIO的数据位宽,该寄存器的定义如图142所示:31 30 20 CS 27 26 25 21 23 22 21 20 19 IS 17 16 15 11 13 12 11 10 0 S 76 543210保留IW TWIDBLJSCLKDIVres
15、rv nr rv rv rv nrr/宵位 31:15保留.姑终读为0。何14hwfc.en:恻件角拎制怦能(HW Flow control enable)0:关W1破件渝拎制1:便能皴件渝梓制X件辭孙卄r拎刮活关十TXFPOE和RXFIFOF申特信号的吉乂诂参考20 9 11 了的SOIO状杰 需存88的亡义位13NEGEDGE SDIO_CK相位送桂位(SDIO.CK dephasing selection bit) 0:在左时钟SDIOCLK的上升沿产牛SDIO-CIC1,在主左钟SDIOCLK的下晞沿产1SDIO CK.位 12:11WIDBUS:觅总线能位(Wide bus mode
16、 enable bit) 00; 认总线模式.便用SDIO_D001: 4位总线模式.便用SDIO_D3:0,10: 8位总线模式.哝用SDIOJD7:OL何10bypass:旁祥m中分频器 QocK divider oypass enable on)0:关I可旁烁 陋动SDIO_CK输岀信巧依范CLKDIV数值对SDIOCLK分频。 1:使能旁跨:SDQCLK宜按郭功SDQ GK辑出伯号.位9PWRSAV:省电配覺楼(Power saving configuration bit)为/省电乌总线为空闲讨.设SPWRSAVftflJ以关闭SDIO_CKE钟續出。 0i始终絵出SDIO-CK*1:
17、仅在有总找活动时才输出SDQ CIG位8CLKEN: B-:钟使能位(Clock enable bit) o: sdio_ck关 nr1: SDIO CK便包位7:0CLKDIV,时沖分频系敎 Qock diS血factor)卜域定义r输亠时何(SDIOCLK)弓输出肘钟(SDIOCK)何的分頻系斷 SDIO CK频耳=SDIOCLK1CLKDIV 幼图1.4.2 SDIO_CLKCR寄存器位定义从上图可以看出时钟控制寄存器的最低8位,用J:控制SDIO_CK的分配,位8用于控 制SDIO_CK的开启和关闭。我们还可以通过位12:11,控制SDIO的数据位宽。第三个,我们耍介绍的是SDIO参数
18、制寄存器(SDIO.ARG),该寄存器比较简单,就是 一个32位寄存器,用丁存储命令参数,不过盂耍注意的是,必须在写命令Z前先写这个参 数寄存器!第四个,我们要介绍的是SDIO命令响应寄存器(SDIO_RESPCMD),该寄存器为32位, 比较简单,川存储瑕后收到的命令响应屮的命令索引。如果传输的命令响应不包含命令索 引,则该寄存器的内容不可预知。第任个,我们耍介绍的是SDIO响应寄存器纽(SDIO_RESP1SDIO_RESP4),该寄存器组 总共由4个32位寄心器组成,用存放接收到的卡响应部分信息。如果收到短响应,则数 据放在SDIO_RESP1寄存器里而,其他三个寄心器没仃用到。而如果收
19、到长响应,则依次 存放在 SDIO_RESP1 SDI0_RESP4 里面,如表 1.4.1 所示:寄存器短响应长响应SDIO RESP1卡状态:0卡状态127:96SDIO_RESP2不用卡状态95:64SDIO RESP3不用卡状态63:32SDIO RESP4不用卡状态31:1表141响应类型和SDIO_RESPx寄存器第七个,我们介绍SDIO命令寄存器(SDIO.CMD),该寄存器各位定义如图143所示:31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 L1 10 9876543210位 31:15保留.始终读为05
20、14ATACMD: C&ATA命令(CEATA command) 如臬设2E该位.CPSMH>CMD61.位13nIEN:不使能屮断(not interrupt enable) 如臬耒设赛该位.则使能CE-ATA设备的丰断位12ENCMDcompL 便炭CMD完成(Enable CMD completion) 如臬设置该位.则使能命令完成信号位11SDIOSuspend? SD I/O暂停命令(SD I/O suspend command) 如臬设58该程.则将娶发送的命令是一个警停命令(只陡用于SDIO"。位10CPSMEN:命令通道状态机(CPSM)便能也(Comm
21、and path state machine (CPSM) Enable bit)如臬设2!该包则便能CPSS位9WAITPEND: CPSM等待数抿传输(CmdPend内部信弓)(CPSM Waits for ends of data transfer (CmdPend internal signal)如臬设置该位.则CPSMA开始发送一个命令Z耐等特数据传输结束.位8WAITINT; CPSM 齐 f寺中斷谄求(CPSM waits for interrupt request) 如臬设置该位.则CPSM关闭命令超时控制并等待中斷请求。位7:6WAITRESP:皆待响险位(Wart for
22、response bits)这2位指小CPSM足占需婴等往响应.如柴需委等待响应.则指示响应类乩 00:无聃应.期待CMDSENT标志01:短响应,朝待CMDREND或CCRCFAIL标志10:无响应.期侍CMDSENT标志11:长咱应.胡待CMDREND咸CCRCFAIL标志位5:0CMDINDEX:命令窠引(Command index) 命令啸引足作为金令的一部分发送到尺中图143 SDIO_CMD寄存器位定义图中,我们这里只关心最低8位,Jt中最低6位为命令索引,也就是我们要发送的命令 索引号(比如发送CMD1,其值为1,索引就设置为1)。位7:6,用设置等待响应位,用 指示CPSM是否
23、盂要等待,以及等待类型等。这里的CPSM,即命令通道状态机,我们就 不详细介绍了,请参阅STM32中文参考于册V10的第368页,仃详细介绍。命令通道状 态机我们一般都是开启的,所以位10耍设置为lo第八个,我们要介绍的是SDIO数据定时器寄存器(SDIO_DTIMER),该寄存器用存储 以卡总线时钟(SDIO.CK)为周期的数据超时时间,一个计数器将从SDIO_DTIMER寄存器加 我数值,并在数据通道状态机(DPSM)进入Wait_R或繁忙状态时进行递减计数,当DPSM处 在这些状态时,如果计数器减为0,则设置超时标志。这里的DPSM,即数据通道状态机, 类似CPSM,详细请参考STM32
24、中文参考手册V10的第372页。注意:在写入数据控制 寄存器,进行数据传输Z前,必须先写入该寄存器(SDIO_DTIMER)和数据长度寄存器 (SDIO_DLEN)!第九个,我们耍介绍的是SUIU数据长度奇存器(SUIU_LM±N),该奇存器低24位何效, 用设屋盂要传输的数据字节长度。对块数据传输,该寄器的数值,必须是数据块长度(通过SDIO_DCTRL设置)的倍数。第十个,我们要介绍的是SDIO数据控制寄存器(SDIO_DCTRL),该寄存器各位定义如 图144所示:31 30 29 28 27 26 25 21 23 22 21 20 19 18 17 16 15 14 13
25、12 11 10 9876543210位 31 12保留.始终读为0。位"SDIOEN SD I/O煥能功社(SO I/O enabl? functions) 如果设置了该位.则DPSM执厅SDIQ卡转处的操杵.位10RWMOD:读等待模式(Read wait mode) 0:停止SDIO_CK|liW渎等待: 1:使卅SDIO D2梓制渎等待位9RWSTOP;读尊待停止(Read wait stop) 0;如果设® trwstart执厅读尊待: 1:如果设» /RWSTART停止读等待.付8RWSTARTr it筹待开始(Read wait start) 设迓该
26、位开始渎等待掾作.位74DBLOCKSIZE:数据块 K® (Data block size)岀H择了決数拥传输模式.该域定义数据块K度:0000:块长=2° = 1 字节:1000:= 28 = 256字节:0001:块长反=227检1001:块长0010:块K/5 = 2 = 4字 加1010:= 2n = 1024字也0011,快长度=2】=8字节'1011.块长废=2” =2048字节,0100:(进制4)块=节:1100:块= 212 = 4096节:0101:(丨送制5片长厦=労=32字节,1101:块= 21> = 8192字节:0110;(十进
27、制6减长« = 2° = 64宁节,1110;坎长« = 214 = 16384?节,011b块长:演=2、128字仏1111:保宙.位3DMAEN; DMA佚能位(DMA enable bit) 0; XfflDMA;1:使能DMA。侍2dtmode:数粧竹轮棧工(Data transfer mode seiecuon) 0:烘放抵传煽:1;流数据传綸.位1DTDIR:政据传瑜方p (Data transfer dredion selection) 0:控別料至口1:卡至控制器。位0DTEMj 数掘传愉快能位(Data transfer enabed bit)如
28、果设迓该位为仁则开绐敦据传输.根据DTSI口与向位,DPSM进入Wait S戒Wait R状寒. 如里在传输的一开始吹设» rRWSTARTl:MDPSM注'读等持状态.水需要在憨传诒皓 来百淸陰忡能何.佢必循世改SDIO.DCTRL以允许斯的数驾传输.图1.4.4 SDIO_DCTRL寄存器位定义该寄存器,用丁控制数据通道状态机(DPSM),包括数据传输使能、传输方向、传输模 式、DMA使能、数据块长度等信息,都是通过该寄存器设置。我们需要根据自己的实际情 况,来配置该寄存器,才可正常实现数据收发。接下来,我们介绍几个位定义十分类似的寄存器,他们是:状态寄存器(SDIO_S
29、TA)、 淸除中断寄存器(SDIO_ICR)和中断屏蔽寄存器(SDIO_MASK),这三个寄存器每个位的疋 义都相同,只是功能各有不同。所以可以一起介绍,以状态寄存器(SDIO_STA)为例,该寄 存器各位定义如图145所示:31 30 29 28 27 26 25 24 23 22 21 20 19 IS 17 16 15 14 13 12 11 10 0 S 76543210位31"保国.曲络读为0.位23CEATAEND:在CMD61 接收到CE-ATA命令完或伝弓(CE-ATA command complebon signal received for CMD61>位2
30、2SDIOIT:枚到SDIO中断(SDIO mtemipt received)<421RXDVAL:在接收FIFO屮的数捱 nJ W (Data available r receive FFO)位20TXDVALx 在发送FIFO中的数据可用(Data available in transmit FIFO)位19RXFIFOE:按收FIFO主(Receive FIFO empty)位18TXFIFOEi 发送FIF0空仃ransmit FIFO empty)若使用了砍件流控端、气FIFO包含2个字时.TXFIFOE信号变为有效。位1了RXFIFOF:按收FIFO (Receive FIF
31、O ful) 若使用硬件漁控纵 当FIFO还差2个字澜儿RXFIFOF值号变为令效,位16TXFIFOFt 发iiFIFO» (Transmit FIFO fUI)位15RXFIFOHF:按收FIFO hrt (Receive FIFO half full): FIFO中至少还脊B个字。位TXFIFOHEr发送FIFO¥空仃侶nsmit FIFO half empty),FIFO”】至少还可以铃入8个字.位13RXACT:止在接收数能(Data receive in progress)位12TXACT?正在发送数据(Data transmt in progress)位11C
32、MDACT; if 在伶输命令(Command transfer in progress)位10dbckend:已友送/按块(CRC检槽成功)(Data block senvreceivea (CRC cnecK passed)19STBITERR:在宽总线模式.没有在所有数站信号上检测到起始位(Start bit not deieciea on all data signals in wide bus mode)位8dataend :数据结來(玫据汁数器.sdio.dcount = 0)(Data enc (data counter, SDIDCOUNT. is zero)侍7cmdsent
33、:命令已发歩(不需蛙胸 W) (command sent(no response requrea)位6CMDREND:已接枚到响|&(CRCQ膜成功)(Command response)位5RXOVERR:按收FIFO上沦锚戻(Received FIFO overrun error)位dTXUNDERR:发送FIFO下滋棉误仃ransmit FIFO underrun error)位3DTIMEOUT:数期轨叶(Data timeout)位2CTIMEOUT:命兮单 w超时(Command response timeout) 命令超时时咼是一个同定的值.为64个SDIO-CK时钟周期.
34、位1DCRCFAIL:己发必/接枚飯据块(CRC检测失败)(Data block senVreceived)ccrcfail:记收利命令轲wqrc检河矢敢)(commana response received)图1.4.5 SDIO_STA寄存器位定义状态寄存器町以用來査询SDIO控制器的半前状态,以便处理各种爭务。比如SDIO_STA 的位2表示命令响应超时,说明SDIO的命令响应出了问题.我们通过设置SDIOJCR的位2 则可以清除这个超时标志,而设置SDIO.MASK的位2,则可以开启命令响应超时中断,设 置为0关闭。其他位我们就不一一介绍了,请人家自行学习。最后,我们向人家介绍SDIO
35、的数据FIFO寄存器(SDIO_FIFO),数据FIFO寄存器包括接 收和发送FIFO,他们由_组连续的32个地址上的32个寄存器组成,CPU可以使用FIFO读 写多个操作数。例如我们耍从SD卡读数据,就必须读SDIO.FIFO寄心器,要写数据到SD卡, 则要写SDIO.FIFO寄存器。SDIO将这32个地址分为16个一组,发送接收各山一半。而我 们每次读写的时候,最多就是读取发送FIFO或写入接收FIFO的一半人小的数据,也就是8 个字(32个字节),这里特别提醒,我们操作SDIO.FIFO (不论读出还是写入)必狈是以4 字节对齐的内存进行操作,否则将导致出错!至此,sdio的相关寄存器介
36、绍,我们就介绍完了。还有儿个不常用的寄存器.我们没 仃介绍到,请人家参考STM32中文参考手册的SDIO寄存器介绍部分。1.5 SD卡初始化流程最后,我们來看看SD卡的初始化流程,耍实现SDIO驱动SD卡,最旋耍的步骤就是SD 卡的初始化,只耍SD卡初始化完成了,那么剩卜的(读写操作)就简单了,所以我们这里 班点介绍SD卡的初始化。从SD卡2.0协议(见光盘资料)文档,我们得到SD卡初始化流 程图如图151所示:CMD0CMOSCard reiuins responseUnusableVe<2IX) or later SD Meqnocy Cartj?Nor> cocnpabbfe
37、 votoge range or check panern rs not correcfConpagp wdtage tanyo and dwek pattern is caredCard returns readf可能为MMC gCCS 二CMD2CMD3ACMD41 with HCS=0ACMtMl wit) HCS»OorlStandard a»oatYCardbusyCbaid wilt con wbbte、Card return busyVer2 00 01SD Merray Card(volta99 rmsr uaich)or Ver1 X SD Mancry
38、Card o< not SD Mei no<Y CardUnuwwe CardVei2.00o( iatviSndrd CApac" C*jcards with non compafabU VOO99 range(ca(d goes Io *ma' stale) of bfiimut(no rwponse <x txi$y)Gard isCard returns toadytf host supports high capacty, HCS is lo 1/(:.vd iscards vwth non oorrpabble vcJIaQd range or
39、Mne out(no response or busy) occursVorZOOoc l抽 HighCd(XKity SO Meer图1.5.1SD卡初始化流程从图中,我们看到,不管什么卡(这里我们将卡分为4类:SD2.0高容駅卡(SDHC,最 大32G), SD2.0标准容最卡(SDSC,最大2G), SDl.x卡和MMC卡),首先我们要执行的是 卡上电(需要设置SDIO_POWER1:0=11), I 电后发送CMD0,対卡进行软复位,Z后发送 CMD8命令,用丁区分SD卡2.0,只仃2.0及以后的匸才支持CMD8命令,MMC匸和Vl.x 的卡,是不支持该命令的。CMD8的格式如表1.5
40、.1所示:Bit position474645:4039:2019:1615:87:10Width (bits)116204871Value01*001000*OOOOOh*XXX1*Descripti onstart bittransmission bitcommand indexreserved bitsvoltage supplied (VHS)check patter nCRC7end bit3< 1.5.1 CMD8命令格式这里,我们需要在发送CMD8的时候,通过其带的参数我们町以设置VHS位,以告诉SD卡,主机的供电情况,VHS位定义如表1.5.2所示:Voltage Sup
41、pliedValue Definition0000bNot Defined0001b2.7-3.6V0010bReserved for Low Voltage Range0100bReserved1000bReservedOthersNot Defined农1.5.2VHS位定义这世我们便用参数0X1AA,即告诉SD |<,主机供电为2.73.6VZ间,如果SD卡支打 CMD8, |支持该电斥范閘,则会通过CMD8的响by (R7)将参数部分原木返冋给主机,如 果不支持CMD&或者不支持这个电压范閑,则不响应。在发送CMD8后,发送ACMD41 (注意发送ACMD41 Z前要先发
42、送CMD55),來进-步 确认卡的操作电压范由,并通过HCS位來告诉SD卡,主机是不是支持高容磧卡(SDHC)o ACMD41的命令格式如表153所示:ACMD INDEXtypeargumentrespabbreviationcomma nd descriptionACMD41bcr31resered bit 30HCS(OCR 卩 0) 29:24reserved bits 23:0 Vdc Voltage Window(OCR23:ODR3SD_SEND_OP_CONDSends host capacity support information (HCS) and asks the a
43、ccessed card to send its operating condition register (OCR) content in the response on the CMD line. HCS is effective when card receives SENDF_COND command. Reserved bit snail be set to CCS bit is assigned to OCR301.衣1.5.3 ACMD41命令格式ACMD41得到的响应(R3)包含SD卡OCR寄存器内容,OCR寄存器内容定义如表1.5.4 所示:OCR bit positionO
44、CR Fields Definition0 6reserved7Reserved for Low Volitage Range8-14reserved1527-2.8162.829172.9-3.0183.0-3.1193.132203.2-33213.3-3.422343.5233.5-3624-29reserved30Card Capacity Status (CCS)131Card power up status bit (busy)*"VDD Voltage Window1) This bit is valid only whan the card power up stat
45、us bit is set.2) This bit set to LOW if the card has* not finished the power up routine.衣1.5.4 OCR寄心器定义对J:支持CMD8指令的卡,主机通过ACMD41的参数设'H HCS位为1,来告诉SD卡主 机支SDHC 如果设置为0,则衷示主机不支持SDHC SDHC卡如果接收到HCS为0, 则永远不会反回卡就绪状态。对丁不支持CMD8的卡,HCS位设置为0即可。SD卡在接收到ACMD4后,返冋OCR寄存器内容,如果是2.0的卡,主机町以通过判 断OCR的CCS位來判断是SDHC还是SDSC;如
46、果是1.x的K,则忽略该位。OCR窃心器的最 后一个位用丁告诉主机SD卡是否上电完成,如果上电完成,该位将会被宣对丁 MMC卡,则不支持ACMD41,不响应CMD55,对MMC E,我们只盂耍在发送CMD0 后,在发送CMD1 (作用同ACMD41),检杳MMC卡的OCR寄存器,实现MMC卡的初始化。至此,我们便实现了对SD卡的类型区分,图1.5.1中,最后发送了 CMD2和CMD3命 令,用丁获得卡CID寄存器数据和卡和对地址(RCA)oCMD2,用丁获得CID寄存器的数据,CID寄存器数据并位定义如表1.5.5所示:NameFieldWidthCID-sliceManufacturer I
47、DMID8127:120OEM/Application IDOID16119:104Product namePNM40|103:64Product revisionPRV63:56Product serial numberPSN32|55:24reserved423:20Manufacturing dateMDT1219:8CRC7 checksumCRC了7:1not used, always 1-10:0表1.5.5卡CID寄存器位定义SD卡在收到CMD2后,将返回R2长响应(136位),其中包含128位有效数据(CID寄 存器内容),存放在SDIO_RESP14等4个寄存器里面。通过读取
48、这四个窃存器,就町以获FJ SD卡的CID信息。CMD3,用于设置卡相对地址(RCA,必须为非0),对于SD卡(非MMC卡),在收到 CMD3后,将返回-个新的RCA给主机,方便主机寻址。RCA的存在允许一个SDIO接II挂 多个SD卡,通过RCA來区分主机耍操作的是哪个卡。而对T MMC卡,则不是±SD卡门动 返冋RCA,而是主机主动设置MMC卡的RCA,即通过CMD3带参数(高16位用J: RCA设 屋),实现RCA设置。同样MMC卡也支持一个SDIO接I I挂影个MMC卡,不同J: SD卡的 是所有的RCA都是由主机主动设置的,Iflj SD卡的RCA则是SD卡发给主机的。在获
49、得卡RCA之后,我们便可以发送CMD9 (带RCA参数),获得SD卡的CSD寄存器 内容,从CSD寄存器,我们可以得到SD卡的容駅和扇区大小等十分匝耍的信息。CSD寄存 器我们在这里就不详细介绍了,关J: CSD寄存器的详细介绍,请人家参考SD卡2.0协 议.pdf。至此,我们的SD卡初始化英木就结束了,最后通过CMD7命令,选中我们耍操作的SD 卡,即町开始对SD卡的读写操作了,SD卡的苴他命令和参数,我们这里就不再介绍了,请 人家参考SD卡2.0协议.pdf,里面何非常详细的介绍。2、硬件连接本文档源码改门标准例程的图片显示实验,标准例程用的是SPI驱动SD P,本文档用 的是SDIO,并
50、新增了 bmp截屏保存和sd卡写测试功能。功能简介:开机的时候先检测字库,然后检测SD卡是否存在,如果SD卡衣在,则初 始化SD卡,并通过串11 1打印SD氏相关借息,然后开始査找SD卡根目录卜的PICTURE 文件夹,如果找到则显示该文件夹下面的图片文件(支持bmp、jpg、jpeg或gif格式), 循坏显示,通过按KEY0和KEY2可以快速浏览卜一张和上一张,WK_UP按键用暂停/ 继续播放,DS1用指示当前是否处暂停状态。如果未找到PICTURE文件夹/任何图片 文件,则提示错误。DS0来指示程序正在运行。在正常显示图片的时候,我们可以通过串 I I,利用usmart 调JIJ bmp_
51、encode或怕stwrite函数,测试SDIO的耳功能。Jt,l, bmp_encode 用于截取屏幕区域部分内容保存为16位bmp图片,可以测试SDIO的单块写功能。而 testwrite函数,则町以实现在SD卡创建一个文件(方便测试,一般是.txt)实现SD卡单 块/多块写功能的测试。所耍用到的唤件资源如F:1)指示灯DS0、DS12)KEY0KEY1两个按键3)串I4)SDIO(外加一个SD卡)5)TFTLCD 模块战舰STM32开发板默认将SD K连接在SPI接II,所以,我们岛要将开发板上的P10 和P11排针用跳线帽连接起来,从而将SD R连接到SDIO接口上,如图2-1所示:o
52、° 000000 12PB14 OPl 2PD8V3d G8 D2 B15B13814 G6 GNDjilo O O O O O O !PD1Offl 1IOOO oop Bl "Jo o o o o nPD12PICPD14PllJTRGo OC10C11 02 C12C8 C9o跳线帽连接P13PG2OPG4PG6巧o o o o o o o图2.1 SDIO连接SD卡示意图将原來连接P10和P12的跳线帽,都设置到卜方,即实现SD卡与SDIO的连接。这也 是我们在锁件上唯一需要改动的地方,其他不需要做任何修改。3、软件实现本实验,我们在战舰STM32开发板标准实验42
53、的基础上修改,在HARDWARE组F 新建SDIO文件夹,并新建sdio sdcaid.c和sdio sdcaid.h两个文件存放SDIO驱动部分代码, 这里我们巫点分析sdio.sdcard c里面的部分代帀,其他 些修改细节就不细说了,详见战舰 STM32开发板扩展实验2的源码。在sdio_sdcard.c里面,代码比较多,在这里仅挑其屮晅耍的儿个西数进行讲解。首先是SD卡初始化函数:SD_Imt该函数代码如卜 1初始化SD卡返冋值:错谋代码;(o,无错误)SD Eitot SD Imt(void)SDError errorstatus=SD_OK;使能PORTC时钟 使能PORTD时钟
54、使能SDIO时钟使能DMA2时钟/SDIO IO I 1 初始化 RCC->APB2ENR|= 1 «4; RCC->APB2ENR|= 1 «5; RCC->AHBENR|= l«10;RCC->AHBENR|= 1«1;GPIOCXRH&=OXFFFOOOOO;GPIOC->CRH|=OXOOOBBBBB; /PC.8-12 复用输出GPIODXRL&=0XFFFFF0FF;GPIOD->CRL|=OXOOOOOBOO; /PD2 复用输出,PD7 I 拉输入 /SDIO外设寄存器设宣为默认值SDI
55、O->POWER=OxOOOOOOOO; SDIO->CLKCR=OxOOOOOOOO;SDIO->ARG=OxOOOOOOOO; SDIO->CMD=OxOOOOOOOO;SDIO->DTIMER=OxOOOOOOOO;SDIO->DLEN=OxOOOOOOOO; SDIO->DCTRL=OxOOOOOOOO;SDIO->ICR=0x00C007FF; SDIO->MASK=OxOOOOOOOO;MY_NlC_Imt(0,0,SDIO_IRQChannel,2)/SDIO 中断配置 errorstatus=SD_PoweiON0;/SD 卡上电if(enoi-status=SD_OK)enorstatus=SD_InitializeCaidsO;/初始化 SD E if(eiTOi*status=SD_OK)errorstatus=SD_GetCardIiifd( &SDCardInfo); 获得卡信息 if(errorstatu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论