sd卡工作原理分析完整版.docx

上传人:b****5 文档编号:8637727 上传时间:2023-02-01 格式:DOCX 页数:21 大小:37.38KB
下载 相关 举报
sd卡工作原理分析完整版.docx_第1页
第1页 / 共21页
sd卡工作原理分析完整版.docx_第2页
第2页 / 共21页
sd卡工作原理分析完整版.docx_第3页
第3页 / 共21页
sd卡工作原理分析完整版.docx_第4页
第4页 / 共21页
sd卡工作原理分析完整版.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

sd卡工作原理分析完整版.docx

《sd卡工作原理分析完整版.docx》由会员分享,可在线阅读,更多相关《sd卡工作原理分析完整版.docx(21页珍藏版)》请在冰豆网上搜索。

sd卡工作原理分析完整版.docx

sd卡工作原理分析完整版

sd卡工作原理分析

侯会明

2005-11-22

一CPU相关,ssio的连接和设置2

1硬件初始化,ssio的相关配置2

1)端口功能选择寄存器一一GPCTL2

2)端口模式寄存器——GPPMA,GPPMB,GPPMC,GPPMD,GPPME2

3)同步SIO控制寄存器——SSIOCON3

4)同步SIO状态寄存器——SSIOST3

5)同步SSIO测试控制寄存器一一SSIOTSCON4

6)同步SIO收发缓冲寄存器一一SSIOBUF5

7)同步SIO中断申请寄存器——SSIOINT5

8)同步SIO中断使能寄存器——SSIOINTEN5

2CPLD片选6

3第三步,ssio收发字符相关6

二数据包的封装与命令协议相关6

1sd卡指令数据包6

2sd卡命令索弓I表7

3命令回应repond10

1)R1模式10

2)R2模式11

3)R3模式11

三命令的控制与实现12

1程序中调用的sd卡命令12

1)命令响应函数UCS_DRSD_niCommandRespond12

2)sd卡驱动程序初始化——UCS_DRSD_giSdIdentify13

3)读sd卡操作函数15

4)写sd卡操作函数15

四sd卡的配置信息和相关结构体16

1卡识另U寄存器CID(cardidentificationregister)16

2卡特性寄存器CSD(cardspecificdataregister)17

一CPU相关,ssio的连接和设置

1硬件初始化,ssio的相关配置

1)端口功能选择寄存器一一GPCTL

地址:

0XB7000000

功能描述:

这个寄存器配置各组GPI。

的管教原始功能或者第二功能;CPU可

以对这个寄存器进行读/写访I可;复位后的默认值是0X00000

这里对这个寄存器有两处操作

①首先将此寄存器和~0x0008与,来操作GPPMB;

GPCTL3(bit3)位控制管脚PIOB[4]和PIOB[1:

0]的功能,设置如下:

GPCTL3=“0”原始功能)

GPCTL3=“1”第。

功能)

Function

In/Out

Function

In/Out

PIOB[0]

In/Out

DREQ0

Input

PIOB[1]

In/Out

DREQCLR0

Output

PIOB[4]

In/Out

TCOUT0

Output

②然后将此寄存器和0x0100或,来操作GPPME。

GPCTL9(bit9)位控制管脚的功能,它的第二功能是ssio

GPCTL9=“0”原始功能)

GPCTL9=“1”第匚功能)

Function

In/Out

Function

In/Out

PIOE[3]

In/Out

SDA

In/Out

PIOE[4]

In/Out

SCL

Output

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。

-*-*-*-

GPPMA[7:

0]/GPPMB[7:

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

0

SSIOCON

-*

-*

SLMSB

SFTSLV

-*

-*

SFTCLK[1:

0]

Atreset

0

0

0

0

0

0

0

0

注意:

-*是保留位,这些位总是被写0,如果这些位被写1,正常操作无法被保证。

位说明:

1SFTCLK[1:

0](bit1tobit0)

这两位选择同步时钟,操作必须在主模式(mastermode^,从模式(slavemode)

被禁止。

bit[1:

0]]=00时,1/8HCLK;

bit[1:

0]]=01时,1/16HCLK

bit[1:

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。

7

6

5

4

3

2

1

0

SSIOST

SFTCT[2:

0]

-*

-*

-*

OERR

BUSY

Atreset

0

0

0

0

0

0

0

0

注意:

-*位是保留位,总是向这些位写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,收发数据时不覆盖此寄存器的内容。

7

6

5

4

3

2

1

0

LBTST

-

*

-

*

-

*

-

*

-

*

-

*

-*

0

0

0

0

0

0

0

0

SSIOTSCON

Atreset

注意:

-*位是保留位,这些位总是写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

7

6

5

4

3

2

1

0

-*

-*

-*

-*

-*

TREMP

RXCMP

TXCMP

0

0

0

0

0

0

0

0

功能描述:

SSIOINT寄存器设定一个同步SIO中断请求,可以通过程序读写寄存器,向一位写1来活除该位。

SSIOINT

Atreset

注意:

-*作为保留位,这些位总是写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中断,可以通过程序读写寄存

7

6

5

4

3

2

1

0

-*

-*

-*

-*

-*

TREMP

RXCMP

TXCMP

0

0

0

0

0

0

0

0

SSIOINTEN

Atreset

注意:

-*是保留位,总是对这些位写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宽度

1

1

6

32

7

1

“0”

“1”

x

x

x

“1”

说明

Startbit

Transmissionbit

Commandindex

Argument

CRC7

Endbit

其中的命令索引位是[45:

40],里面可以封装各种命令,具体的命令表将在下面给出。

不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格

式,在命令表中的选项会给出。

2sd卡命令索引表

CMD

简略语

指令说明

SPI模式

自变量

回应

0

GO_IDLE_STATE

这是使car刑始化到Idle状态的指令.CS信号设在Low的状态时,接到本指令后,card将转换到SPI模式.

None

R1

1

SEND_OP_COND

接到本指令

后,card务做R3回应(含有OCR数据).根据OCR值,可以得知cardt工作电压范围.OCR数据最局值位的1bit是用来确认card内部处理是否结束(Ready/Busy^询).

None

R1

2

ALL_SEND_CID

接到本指令后,处丁Read/犬态的cardW传送

CID数据.在

MMC模式下,数据被送到CMD信号,在CID数据的每1bit传送后,CMD信号状态财与该card内

部状态相比较,如果不一致,将中止数据传送,carcte回到Ready犬态.如果相一致,该card将认为已被选中,然后转换到Identification状态.

3

SET_RELATIVE_ADDR

本指令会为已转换至UIdentification状态的car盼配一个相对cardft址(RCA).当RCA分配后,cartfB转换到Stand-by状态,对以后的CMD2和CMD3不回应.

4

NOP

这是用来设定DSR(DriveState寄存器)的指令,但是本car^支持DSR.

7

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数据.

None

R1

10

SEND_CID

接到本指令后,将传送CID数据.

None

R1

11

READ_DAT_UNTIL_STOP

接到本指令后,将从设定的地址传送P2ROM数据,直到接到指令CMD12为止.

12

STOP.TRANSMISSION

本指令强行终止

CMD11和

CMD18的处理

None

R1

13

SEND_STATUS

接到本指令后,将传送状态寄存器的信息.

None

R2

15

GO_INACTIVE_STATE

接到本指令后,将转换到休止

(inactive)状态.

16

SET_BLOCKLEN

本指令用来设定

Block长度.对象

是以后的指令

CMD17和

CMD18.

31:

00]blocklength

R1

17

READ_SINGLE_BLOCK

接到本指令后,将从自变量设定的地址传送1个block长度的数据.(block长度由指令CMD16设定).

[31:

00]dataaddress

R1

18

READ_MULTIPLE_BLOCK

接到本指令后,将从自变量设定的地址连续传送block长度的数据,直到接到指令

CMD12为

止.(block长度由指令CMD16设定).

[31:

00]dataaddress

R1

23

SET_BLOCK_COUNT

本指令是给紧跟

的指令CMD18

设定要传送的

block数量.

[31:

16]setto0[15:

00]numberofblock

R1

24

WRITE_BLOCK

接到本指令后,将写1个block长度的数据到自变量

设定的地

址.(block长度由指令CMD16设

定).

[31:

0]dataaddress

R1

25

WRITE_MULTIPLE_BLOCK

接到本指令后,将连续写block长度的数据到自变量设定的地址,直到接到指令CMD12为止.(block长度由指令CMD16设定).

[31:

0]dataaddress

R1

58

READ_OCR

接到本指令

后,Card将传送

OCR数据.

None

R3

59

CRC_ON_OFF

本指令是用来设定CRC选项为

ON或OFF.在SPI模式下,CRC的初始值设定为

OFF.[CRC选项[bit=1]表示CRCON;[CRC选项[bit=0]表示CRCOFF.

[31:

01]stuffbits[00:

00]CRCoption

R1

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

0

0

0

2)R2模式

对象指令

CMD13:

SEND_STATUS

1514131211109876543210

0

0

0

0

0

0

0

0

0

0

3)R3模式

对象指令

CMD58:

READ_OCR

39383736353433320

0

0

0

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数

CMD58:

读取sd卡OCR信息。

2)sd卡驱动程序初始化——UCS_DRSD_giSdIdentify

在mainTask中最开始调用,进行sd卡驱动的上电初始化。

次函数调用上面的函数实现命令的设置,顺序进行了如下设置:

CMD1:

设置sd卡的工作电压

UCS_DRSD_niCommandRespond(C

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1