sd卡工作原理分析完整版Word格式.docx
《sd卡工作原理分析完整版Word格式.docx》由会员分享,可在线阅读,更多相关《sd卡工作原理分析完整版Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
①首先将此寄存器和~0x0008与,来操作GPPMB;
GPCTL3(bit3)位控制管脚PIOB[4]和PIOB[1:
0]的功能,设置如下:
GPCTL3=“0”原始功能)
GPCTL3=“1”第。
功能)
Function
In/Out
PIOB[0]
DREQ0
Input
PIOB[1]
DREQCLR0
Output
PIOB[4]
TCOUT0
②然后将此寄存器和0x0100或,来操作GPPME。
GPCTL9(bit9)位控制管脚的功能,它的第二功能是ssio
GPCTL9=“0”原始功能)
GPCTL9=“1”第匚功能)
PIOE[3]
SDA
PIOE[4]
SCL
2)端口模式寄存器——GPPMA,GPPMB,GPPMC,GPPMD,GPPME地址:
0xB7A01008~0xB7A01088
这些寄存器指定相应管脚的I/O流向(PIOA[7:
0],PIOB[7:
0],PIOC[7:
0],PIOD[7:
0]andPIOE[9:
0]);
CPU可以对这个寄存器进行读/写访问;
复位后的默认值是0x0000。
Atreset
GPPMA[7:
0]/GPPMB[7:
0]/GPPMC[7:
0]/GPPMD[7:
0](bits0to7)/GPPME[9:
0](bits0to9):
这些位置0时表示input;
置1时表示output。
-*-*-*-
0]/GPPMC[7:
0]/
GPPMD[7:
0]/GPPME[9:
0],
GPPMEusesbit9&
bit8.
ForotherGPPMx,bit9&
bit8are-*”.'
GPPM*
15~109876543210
0000000000
这里对寄存器GPPMB和0x0002,将PIOB[2]作为输出,作用是CPLD的片选
对寄存器GPPME^fe后进行了三步操作:
1首先将寄存器和0x0001或
将PIOE[0]作为输出,该管脚输出时钟clock0
2再次将寄存器和0xfffd与
将PIOE[1]作为输入,该管脚为SDI,即SD卡的输入。
3最后将寄存器和0x0004或
将PIOE[4]作为输出,该管脚为SDO,即SD卡的输出。
3)同步SIO控制寄存器——SSIOCON
0xB7B01010
SSIOCON寄存器用来控制收发操作。
这个寄存器可以通过程序来进行读或者写。
如果SSIOCON寄存器被修改,那么变化会在收发操作结束后生效。
如果SSIOCON在传送过程中被修改,那么当前的操作将不能正确的执行。
7
6
5
4
3
2
1
SSIOCON
-*
SLMSB
SFTSLV
SFTCLK[1:
0]
注意:
-*是保留位,这些位总是被写0,如果这些位被写1,正常操作无法被保证。
位说明:
1SFTCLK[1:
0](bit1tobit0)
这两位选择同步时钟,操作必须在主模式(mastermode^,从模式(slavemode)
被禁止。
bit[1:
0]]=00时,1/8HCLK;
0]]=01时,1/16HCLK
0]]=1x时,1/32HCLK
2SFTSLV(bit4)
这位用来选择主从模式
bit[4]=0时,Mastermode
bit[4]=1时,Slavemode
3SLMSB(bit5)
这位用来选择在收发数据过程中最低有效位在前(LSBfirst)还最高有效位在前
(MSBfirst)
bit[5]=0时,LSBfirst
bit[5]=1时,MSBfirst
这里将其存器设置成0x22,选择了主模式Master|最高有效位在前MSB|1/32HCLK。
4)同步SIO状态寄存器——SSIOST地址:
0xB7B01004
SSIOST寄存器指示同步SIO的操作状态,通过程序可以读写OERR和BUSY。
寄存器的SFTCT[2:
0]位是只读的,写这些位无效,当写这些位是,将写0。
SSIOST
SFTCT[2:
OERR
BUSY
-*位是保留位,总是向这些位写0,如果写1,正常德操作将无法保证。
1BUSY(bit0)
这位指示数据正在被收发,这位在数据收发时自动置1,操作完成时自动活00当置1时,意味着数据正在被传送,在传送的过程中写0,可能会终止收发操作并且重新初始化SSIO。
如果在空闲时写0,操作是无效的。
当bit[0]=0,Transmit-receiveidle
当bit[0]=1,Transmit-receiveinprogress
2OERR(bit1)
这位指示overrunl昔误是否发生。
如果当前接收的数据没有被读,CPU该位置1。
一旦被置1,这位不会活0,即使在下一个接受操作中没有overrun!
昔误发生。
因此有必要在程序中活0,写0该位被活0,但写1也被置1。
当bit[1]=0,Nooverrunerror
当bit[1]=1,Overrunerror
3SFTCT[2:
0](bit7tobit5)
这个位指示3位移位计数器的当收发时的计数值。
当没有数据收发时计数器被设置成000(二进制)。
每次收发数据时有移位,计数器增1。
当收发操作结束时
或者BUSY位在接收数据过程中写0时,寄存器返回000。
这里这个寄存器被写0x00活除状态。
5)同步SSIO测试控制寄存器——SSIOTSCON
0XB7B01014
SSIOTSCON是一个可以设计简单的同步SIO内部测试的寄存器,寄存器可以有程序读写。
在普通操作中,设置SSIOTSCON为0x00,收发数据时不覆盖此寄存器的内容。
LBTST
-
*
-*
SSIOTSCON
-*位是保留位,这些位总是写0,如果写1,正常的操作无法保证。
LBTST(bit7)
这个位使能循环回侧函数,当循环回侧函数使能时,发送信号作为接收信号被读回。
当bit[7]=0,Loopbacktestfunctiondisabled(normalmode)
当bit[7]=1,Loopbacktestfunctionenabled(testmode)
这里这个寄存器被写0x80,循环回侧函数使能,进行虚拟发送数据0xff并接
6)同步SIO收发缓冲寄存器一一SSIOBUF
0XB7B01000
SSIOBUF寄存器在收发操作过程中保存收发的数据,寄存器可以通过程序读/写。
当写时,寄存器作为发送缓冲区;
读时,寄存器作为接收缓冲区。
当接收SSIOBUF的内容时,数据保存直到下次接收操作完成。
转换并行发送数据为申行数据和转换申行接收数据为并行数据时SSIOREG寄存器被配置成
移位寄存器。
在发送操作中,发送数据写到SSIOBUF中,SSIOBUF中的数据自动传送给SSIOREG。
在接收操作中,当接收完最后一位时,SSIOREG数据传送给SSIOBUF。
寄存器SSIOREG不能在程序中读/写。
7)同步SIO中断申请寄存器——SSIOINT地址:
0XB7B01008
TREMP
RXCMP
TXCMP
SSIOINT寄存器设定一个同步SIO中断请求,可以通过程序读写寄存器,向一位写1来活除该位。
SSIOINT
-*作为保留位,这些位总是写0,如果这些位被写1,正常德操作无法保证
1TXCMP(bit0)
当发送完成时这位被设置。
当bit[0]=0,Transmissionnotcomplete
当bit[1]=1,Transmissioncomplete
2RXCMP(bit1)
当接收完成时这位被设置。
当bit[1]=0,Receptionnotcomplete
当bit[1]=1,Receptioncomplete
3TREMP(bit2)
当收发缓冲区寄存器的数据被传送到移位寄存器并且收发缓冲区为空时这位被置位。
当bit[2]=0,Transmitdatanottransferred
当bit[2]=1,Transmitdatatransferred
这里将此寄存器写入0x07,将3个标志位置1,活除中断作为初始状态。
8)同步SIO中断使能寄存器——SSIOINTEN
0XB7B0100C
SSIOINTEN寄存器可以使能同步SIO中断,可以通过程序读写寄存
SSIOINTEN
-*是保留位,总是对这些位写0,如果写1,正常操作无法保证
1TXCMPEN(bit0)
这位使能发送完成时的中断请求。
当bit[0]=0,Transmitcompleteinterruptrequestmasked
当bit[0]=1,Transmitcompleteinterruptrequestenabled
2RXCMPEN(bit1)
这位使能接受完成时的中断请求。
当bit[1]=0,Receivecompleteinterruptrequestmasked
当bit[1]=1,Receivecompleteinterruptrequestenabled
3TREMPEN(bit2)
这位使能收发缓冲区为空时的中断请求。
当bit[2]=0,Transmit-receivebufferemptyinterruptrequestmasked
当bit[2]=1,Transmit-receivebufferemptyinterruptrequestenabled
这里将此寄存器写入0x00,禁止所有中断
2CPLD片选
先读入地址0xf800000e中的值
如果选中片选,向地址0xf8000002写0,拉低电平;
如果为选中片选,向地址0xf8000002写1,拉高电平
3第三步,ssio收发字符相关
1首先读取SSIOINT中的内容,SSIOINT在这里是状态寄存器,中断已经屏蔽,因此与中断无关。
然后与3个宏定义比较
SSIOCON_TXCMPEN0x01/*transmitcomplete*/
SSIOCON_RXCMP0x02/*receivecomplete*/
SSIOCON_TREMP=0x04/*transmitempty*/
3个宏分别N示SSIOINT的后3位置1,比较结果哪位置1证明此时操作已经完成,但由丁屏蔽了中断,不产生中断。
2其次将3个宏定义的值相应的写入SSIOINTo
3最后根据操作要求向SSIOBUF写数据或者读出SSIOBUF中的数据。
二数据包的封装与命令协议相关
1sd卡指令数据包
s仆的指令被封装成48位的数据包,每次传送这48位的数据包。
数据包的内容
包括起始位、结束位、传输位、命令索引、传输参数和7位CRC校验码。
其具
体格式分布如下图
Bit位置
47
46
[45:
40]
[39:
08]
[07:
01]
00
Bit宽度
32
值
“0”
“1”
x
说明
Startbit
Transmissionbit
Commandindex
Argument
CRC7
Endbit
其中的命令索引位是[45:
40],里面可以封装各种命令,具体的命令表将在下面给出。
不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格
式,在命令表中的选项会给出。
2sd卡命令索引表
CMD
简略语
指令说明
SPI模式
自变量
回应
GO_IDLE_STATE
这是使car刑始化到Idle状态的指令.CS信号设在Low的状态时,接到本指令后,card将转换到SPI模式.
None
R1
SEND_OP_COND
接到本指令
后,card务做R3回应(含有OCR数据).根据OCR值,可以得知cardt工作电压范围.OCR数据最局值位的1bit是用来确认card内部处理是否结束(Ready/Busy^询).
ALL_SEND_CID
接到本指令后,处丁Read/犬态的cardW传送
CID数据.在
MMC模式下,数据被送到CMD信号,在CID数据的每1bit传送后,CMD信号状态财与该card内
部状态相比较,如果不一致,将中止数据传送,carcte回到Ready犬态.如果相一致,该card将认为已被选中,然后转换到Identification状态.
SET_RELATIVE_ADDR
本指令会为已转换至UIdentification状态的car盼配一个相对cardft址(RCA).当RCA分配后,cartfB转换到Stand-by状态,对以后的CMD2和CMD3不回应.
NOP
这是用来设定DSR(DriveState寄存器)的指令,但是本car^支持DSR.
SELECT/DESELECT_CARD
本指令是用来选择一张card,让它在Stand-by犬态和Transfej犬态之间转换的指令.如果给cardiS定已分配到的RCA地址,cardW从Stand-by犬态转换到Transfer!
犬态,并将回应以后的读取指令及其他指令.如果给card设定RCA以外的地址,cardW转换到Stand-by状态。
当
RCA=0000h
时,cardW无条件地转换到Stand-by状态.
9
SEND_CSD
接到本指令后,将传送CSD数据.
10
SEND_CID
接到本指令后,将传送CID数据.
11
READ_DAT_UNTIL_STOP
接到本指令后,将从设定的地址传送P2ROM数据,直到接到指令CMD12为止.
12
STOP.TRANSMISSION
本指令强行终止
CMD11和
CMD18的处理
13
SEND_STATUS
接到本指令后,将传送状态寄存器的信息.
R2
15
GO_INACTIVE_STATE
接到本指令后,将转换到休止
(inactive)状态.
16
SET_BLOCKLEN
本指令用来设定
Block长度.对象
是以后的指令
CMD17和
CMD18.
31:
00]blocklength
17
READ_SINGLE_BLOCK
接到本指令后,将从自变量设定的地址传送1个block长度的数据.(block长度由指令CMD16设定).
[31:
00]dataaddress
18
READ_MULTIPLE_BLOCK
接到本指令后,将从自变量设定的地址连续传送block长度的数据,直到接到指令
CMD12为
止.(block长度由指令CMD16设定).
23
SET_BLOCK_COUNT
本指令是给紧跟
的指令CMD18
设定要传送的
block数量.
16]setto0[15:
00]numberofblock
24
WRITE_BLOCK
接到本指令后,将写1个block长度的数据到自变量
设定的地
址.(block长度由指令CMD16设
定).
0]dataaddress
25
WRITE_MULTIPLE_BLOCK
接到本指令后,将连续写block长度的数据到自变量设定的地址,直到接到指令CMD12为止.(block长度由指令CMD16设定).
58
READ_OCR
后,Card将传送
OCR数据.
R3
59
CRC_ON_OFF
本指令是用来设定CRC选项为
ON或OFF.在SPI模式下,CRC的初始值设定为
OFF.[CRC选项[bit=1]表示CRCON;
[CRC选项[bit=0]表示CRCOFF.
01]stuffbits[00:
00]CRCoption
3命令回应repond
1)R1模式
对象指令
CMD0:
GO_IDLE_STATE
CMD1:
SEND_OP_COND
CMD9:
SEND_CSD
CMD10:
SEND_CID
CMD12:
STOP_TRANSMISSION
CMD16:
SET_BLOCKLEN
CMD17:
READ_SINGLE_BLOCK
CMD18:
READ_MULTIPLE_BLOCK
CMD23:
SET_BLOCK_COUNT
CMD59:
CRC_ON_OFF
76543210
2)R2模式
CMD13:
SEND_STATUS
1514131211109876543210
3)R3模式
CMD58:
READ_OCR
39383736353433320
OCR
三命令的控制与实现
1程序中调用的sd卡命令
在程序中的sd的命令发送响应主要通过函数UCS_DRSD_niCommandRespond
来实现。
其他函数通过调用这个函数完成对sd卡独作,成里主要有3个函
数:
sd卡驱动程序初始化、读sd卡操作和写sd卡操作函数,下面分别对这些函数具体分析:
1)命令响应函数UCS_DRSD_niCommandRespond
UCS_DRSD_niCommandResponc(WiCmd,UWuiArg,UB*pucRsp)
参数务别表示:
icmd一命令号
uiArg—命令参数
pucRsp—命令响应的存储地址
本函数分别涉及到了命令的处理
CMD9、CMD10:
接收sd卡的CSD和CID信息。
CMD17、CMD24:
读写单个block数据,CMD18、CMD25:
读写多个block数
读取sd卡OCR信息。
2)sd卡驱动程序初始化——UCS_DRSD_giSdIdentify
在mainTask中最开始调用,进行sd卡驱动的上电初始化。
次函数调用上面的函数实现命令的设置,顺序进行了如下设置:
设置sd卡的工作电压
UCS_DRSD_niCommandRespond(C