sd卡驱动工作原理分析完整版Word文档格式.docx
- 文档编号:22340451
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:30
- 大小:177.10KB
sd卡驱动工作原理分析完整版Word文档格式.docx
《sd卡驱动工作原理分析完整版Word文档格式.docx》由会员分享,可在线阅读,更多相关《sd卡驱动工作原理分析完整版Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
命令响应函数UCS_DRSD_niCommandRespond
sd卡驱动程序初始化一一UCS_DRSD_giSdldentify读sd卡操作函数
写sd卡操作函数
四sd卡的配置信息和相关结构体
1卡识别寄存器
2卡特性寄存器
CID(cardidentificationregister)CSD(cardspecificdataregister)
6
7
10
11
12
13
15
16
17
一CPU相关,ssio的连接和设置
1)端口功能选择寄存器一一GPCTL
地址:
0xB7000000
功能描述:
这个寄存器配置各组GPIO的管教原始功能或者第二功能;
CPU可以对这个寄存器进行读/写访问;
复位后的默认值是0x0000。
Atreset
这里对这个寄存器有两处操作
1首先将此寄存器和-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
2然后将此寄存器和0x0100或,来操作GPPME。
GPCTL9(bit9)位控制管脚的功能,它的第二功能是ssio
GPCTL9=“
O'
原始功能)
'
1”第二功能)
Function
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。
GPPMA[7:
0]/GPPMB[7:
0]/GPPMC[7:
0]/GPPMD[7:
0](bits0to7)/GPPME[9:
0](bits0to9):
,这些位置0时表示input;
置1时表示output。
15-109876543210
0]/GPPMC[7:
0]/GPPMD[7:
0]/GPPME[9:
0],
GPPMEusesbit9&
bit8.
ForotherGFPMx,bit9&
bit8are-”■“
这里对寄存器GPPMB和0x0002,将PIOB[2]作为输出,作用是CPLD的片选。
对寄存器GPPME先后进行了三步操作:
1首先将寄存器和0x0001或
将PIOE[0]作为输出,该管脚输出时钟clock。
2再次将寄存器和0xfffd与
将PIOE[1]作为输入,该管脚为SDI,即SD卡的输入。
3最后将寄存器和0x0004或
将PIOE[4]作为输出,该管脚为SDO,即SD卡的输出。
3)同步SIO控制寄存器——SSIOCON
0xB7B01010
SSIOCON寄存器用来控制收发操作。
这个寄存器可以通过程序来进行读或者写。
如果SSIOCON寄存器被修改,那么变化会在收发操作结束后生效。
如果SSIOCON在传送过程中被修改,那么当前的操作将不能正确的执行。
1
*
SLMSB1
SFTSLV
SFTCLK[1:
0]
SSIOCONAtreset
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
SFTCT[2:
OERR
BUSY
正常德操作将无法保证。
SSIOST寄存器指示同步SIO的操作状态,通过程序可以读写OERR和BUSY。
寄存器的SFTCT[2:
0]位是只读的,写这些位无效,当写这些位是,将写0。
注意:
-*位是保留位,总是向这些位写0,如果写1,
位说明:
1BUSY(bit0)
1,操作完成时自动清0。
0,可能会终止收发操作
这位指示数据正在被收发,这位在数据收发时自动置
当置1时,意味着数据正在被传送,在传送的过程中写
并且重新初始化SSIO。
如果在空闲时写0,操作是无效的。
当bit[0]=0,Transmit-receiveidle
当bit[0]=1,Transmit-receiveinprogress
2OERR(bit1)
这位指示overrun错误是否发生。
如果当前接收的数据没有被读,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并接
收。
SSIOBUF
同步SIO收发缓冲寄存器
0xB7B01000
SSIOBUF寄存器在收发操作过程中保存收发的数据,寄存器可以通过程序读/写。
当写时,寄存器作为发送缓冲区;
读时,寄存器作为接收缓冲区。
当接收SSIOBUF的内容时,数据保存直到下次接收操作完成。
转换并行发送数据为串行数据和转换串行接收数据为并行数据时SSIOREG寄存器被配置成
移位寄存器。
在发送操作中,发送数据写到SSIOBUF中,SSIOBUF中的数据自动传送给SSIOREG。
在接收操作中,当接收完最后一位时,SSIOREG数据传送给SSIOBUFo寄存器SSIOREG不能在程序中读/写。
SSIOINT
同步SIO中断申请寄存器
0xB7B01008功能描述:
SSIOINT寄存器设定一个同步SIO中断请求,可以通过程序读写寄存器,向一位写1来清除该位。
TREMP
RXCMP
TXCMP
-*作为保留位,这些位总是写0,如果这些位被写1,正常德操作无法保证
1TXCMP(bit0)
当发送完成时这位被设置。
当bit[0]=0,Transmissionnotcompiete
当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中断,可以通过程序读写寄存器。
-*是保留位,总是对这些位写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个宏定义的值相应的写入SSIOINT0最后根据操作要求向SSIOBUF写数据或者读出SSIOBUF中的数据。
3个宏分别表示SSIOINT的后3位置1,比较结果哪位置1证明此时操作已经完成,但由于屏蔽了中断,不产生中断。
②
③
数据包的封装与命令协议相关
1sd卡指令数据包
SC卡的指令被封装成48位的数据包,每次传送这48位的数据包。
数据包的内容包括起始位、结束位、传输位、命令索引、传输参数和7位CRC校验码。
其具
体格式分布如下图
Bit位置
47
46
[45:
40]
[39:
08]
[07:
01]
00
Bit宽度
32
值
“0”
“1”
x
“1”
说明
Startbit
Transmissionbit
Commandindex
Argument
CRC7
Endbit
其中的命令索引位是[45:
40],里面可以封装各种命令,具体的命令表将在下面给出。
不同的命令会对应不同的回应(respond),回应有三种(R1,R2,R3)格
式,在命令表中的选项会给出。
2sd卡命令索引表
CMD
简略语
指令说明
SPI模式
自变量
回应
GO_IDLE_STATE
这是使card初始化到Idle状态的指令.CS信号设在Low的状态时,接到本指令
后,card将转换到SPI模式.
None
R1
SEND_OP_COND
接到本指令
后,card将做R3回应(含有OCR数据)根据OCR值,可以得知card能工作电压范
围.OCR数据最高值位的1bit是用来确认card内部处理是否结束
(Ready/Busy轮询).
None
ALL_SEND_CID
接到本指令后,处于Ready犬态
的card将传送
CID数据.在
MMC模式下,数据被送到CMD信号,在CID数据的
每1bit传送
后,CMD信号状态将与该card内
SET_RELATIVE_ADDR
NOP
SELECT/DESELECT_CARD
部状态相比较,如果不一致,將中止数据传送,carc返回到Ready犬态.如果相一致,该card将认为已被选中,然后转换到Identification状态.
本指令会为已转换至UIdentification状态的card分配一个相对care地址(RCA).当RCA分配后,card将转换到Stand-by状态对以后的CMD2和CMD3不回应.
这是用来设定DSR(DriveState寄存器)的指令,但是本car不支持
DSR.
本指令是用来选择一张card,让它在Stand-by犬态和Transfei状态之间转换的指令.如果给card设定已分配到的RCA地址,card将从Stand-by犬态转换到Transfe狀态,并将回应以后的读取指令及其他指令.如果给card设定RCA以外的地址,card将转换到Stand-by状态。
当
RCA=0000h时,card将无条件地转换到Stand-by状态.
9
SEND_CSD
接到本指令后,将传送CSD数据.
SEND_CID
接到本指令后,将传送CID数据.
READ_DAT_UNTIL_STOP
接到本指令后,将从设定的地址传
送P2ROM数据,
直到接到指令
CMD12为止.
STOP_TRANSMISSION
本指令强行终止
CMD11和
CMD18的处理
SEND_STATUS
接到本指令后,将传送状态寄存器的信息.
R2
GO_INACTIVE_STATE
接到本指令后,将转换到休止
(inactive)状态.
SET_BLOCKLEN
本指令用来设定
Block长度.对象
是以后的指令
CMD17和
CMD18.
31:
00]blocklength
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
CMD1
CMD9
CMD10
CMD12
CMD16
CMD17
CMD18
CMD23
CMD59
GO_IDLE_STATESEND_OP_CONDSEND_CSD
STOP_TRANSMISSIONSET_BLOCKLENREAD_SINGLE_BLOCKREAD_MULTIPLE_BLOCKSET_BLOCK_COUNTCRC_ON_OFF
inidlestate
illegalcommand
communicationCRC
addresserror
parametererror
2)R2模式
CMD13:
1514
131211109876543210
3)R3模式
CMD58:
READOCR
OCR
3938373635343332
三命令的控制与实现
1程序中调用的sd卡命令
在程序中的sd的命令发送响应主要通过函数UCS_DRSD_niCommandRespond
来实现。
其他函数通过调用这个函数完成对sd卡的操作,这里主要有3个函
数:
sd卡驱动程序初始化、读sd卡操作和写sd卡操作函数,下面分别对这些函数具体分析:
1)命令响应函数UCS_DRSD_niCommandRespond
UCS_DRSD_niCommandRespond(WiCmd,UWuiArg,UB*pucRsp)参数分别表示:
icmd—命令号
uiArg—命令参数
PucRsp—命令响应的存储地址
本函数分别涉及到了命令的处理
CMD9、CMD10:
接收sd卡的CSD和CID信息。
CMD17、CMD24:
读写单个block数据,CMD18、CMD25:
读写多个block数据。
读取sd卡OCR信息。
2)sd卡驱动程序初始化——UCS_DRSD_giSdldentify
在mainTask中最开始调用,进行sd卡驱动的上电初始化。
厂START
<
丿
END
次函数调用上面的函数实现命令的设置,顺序进行了如下设置:
CMD1:
设置sd卡的工作电压
UCS_DRSD_niCommandRespond(CMD1,UCS_DRSD_OCR_\A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sd 驱动 工作 原理 分析 完整版
![提示](https://static.bdocx.com/images/bang_tan.gif)