S3C2440讀寫(xiě)大容量SD卡
先了解一下SD卡協(xié)議方面的東西
一、SD卡協(xié)議概要
命令(Command):在CMD線上,由主機(jī)發(fā)出
響應(yīng)(Response):在CMD線上,由被尋址的卡發(fā)出。
數(shù)據(jù)(data): 在數(shù)據(jù)線上,用DAT0或DAT0~DAT3。
CRC校驗(yàn)響應(yīng)及忙指示(The CRC status response and Busy indication)只能經(jīng)過(guò)DAT0發(fā)送
二、命令格式:
高位,第48位 低位,第1位
0
1
contents
CRC7
1
起始位,總為0
傳輸方向,
1:主機(jī)發(fā)出
0:設(shè)備發(fā)出
內(nèi)容,由具體命令決定
七位CRC
終止位,
總為1
響應(yīng)格式:R1、R3、R6與命令格式同,只是第47位為0;而R2為136位,只是contents與上表的位數(shù)多而已。
四條數(shù)據(jù)線時(shí)的傳輸格式:略
數(shù)據(jù)經(jīng)過(guò)總線的順序:高位在前,低位在后。
SD卡寄存器:
名稱(chēng)
寬度
說(shuō)明
CID
128
Card identification number; 卡標(biāo)識(shí)
RCA
16
Relative card address; 局部地址,在初始化時(shí)由主機(jī)和卡決定
DSR
16
Driver Stage Register;配置卡的輸出驅(qū)動(dòng)
CSD
128
Card Specific Data; 關(guān)于卡的操作信息
SCR
64
SD Configuration Register; 卡配置信息
OCR
32
Operation conditions register
SSR
512
SD Status; information about the card proprietary features
CSR
32
Card Status; information about the card status
紅色為V2.0曾加的寄存器。綠色為SPI用,藍(lán)色為V1.0用
三、命令種類(lèi):廣播命令、點(diǎn)對(duì)點(diǎn)尋址命令。
操作模式:標(biāo)識(shí)卡模式、數(shù)據(jù)傳輸模式。
卡的標(biāo)識(shí)過(guò)程:1、復(fù)位。上電或發(fā)送CMD0使卡進(jìn)入空閑狀態(tài)。
2、發(fā)ACMD41、CMD2、CMD3使之進(jìn)入數(shù)據(jù)傳輸模式的等待狀態(tài)。
對(duì)于大容量的SD卡,在發(fā)送ACMD41后要檢查CCS是否為1來(lái)確定大容量SD卡否。為了能夠識(shí)別各種卡,最始的時(shí)鐘設(shè)置不能高于400kHz
數(shù)據(jù)傳輸:
對(duì)大容量SD卡操作的差異
存儲(chǔ)器訪問(wèn)命令包括讀塊命令(CMD17、CMD18)、寫(xiě)塊命令(CMD24、CMD25)及塊擦除命令(CMD32、CMD33)。
下面是標(biāo)準(zhǔn)容量SD卡和大容量SD卡在存儲(chǔ)器訪問(wèn)時(shí)的功能差別:
1 . 命令變量
大容量SD卡,存儲(chǔ)器訪問(wèn)命令的32位變量是對(duì)塊尋址的存儲(chǔ)器訪問(wèn)(是決定塊的塊變量)。塊的固定大小為512字節(jié)。而標(biāo)準(zhǔn)容量的SD卡,32位變量是對(duì)字節(jié)尋址,塊長(zhǎng)度由CMD16命令決定。
即:
(a),標(biāo)準(zhǔn)容量的SD卡,變量0001h是對(duì)0001h字節(jié)單元尋址,而在大容量SD卡中是對(duì)0001h塊尋址。
(b),標(biāo)準(zhǔn)容量的SD卡,變量0002h是對(duì)0002h字節(jié)單元尋址,而在大容量SD卡中是對(duì)0002h塊尋址。
2. 局部尋址和非對(duì)齊尋址。在大容量SD卡中,不允許作為塊尋址的局部尋址和非對(duì)齊尋址(跨躍塊邊界),只允許對(duì)整個(gè)塊尋址。
3.設(shè)置塊長(zhǎng)度
當(dāng)使用塊尋址模式的存儲(chǔ)器讀寫(xiě)命令,塊長(zhǎng)度為512字節(jié),不關(guān)心CMD16設(shè)置的塊長(zhǎng)度。塊長(zhǎng)度設(shè)置對(duì)存
儲(chǔ)器訪問(wèn)命令無(wú)效。CMD42不屬于存儲(chǔ)器訪問(wèn)命令。CMD16指定的數(shù)據(jù)塊大小和塊長(zhǎng)度,置為512字節(jié)。大于
512字節(jié)將里將置位BLOCK_LEN_ERROR,且忽略卡容量。
4. 寫(xiě)保護(hù)分組
大容量SD卡不支持。發(fā)送命令CMD28、CMD29和CMD30將產(chǎn)生ILLEGAL_COMMAND錯(cuò)誤
5、讀寫(xiě)超時(shí)檢查
讀:對(duì)標(biāo)準(zhǔn)容量的SD卡,讀超時(shí)的時(shí)間設(shè)定為大于典型讀出時(shí)間的100倍,或者設(shè)置為100mS??▍?shù)的讀時(shí)間為:CSD中的TAACT NSAC參數(shù)的兩倍。
寫(xiě):對(duì)標(biāo)準(zhǔn)容量的SD卡,寫(xiě)超時(shí)的時(shí)間設(shè)定為大于典型編程時(shí)間的100倍,或者設(shè)置為250mS。卡參數(shù)的寫(xiě)時(shí)間為:CSD中的R2W_FACTOR
對(duì)于大容量卡,CSD中的參數(shù)為因定值,因此最好使用>100mS作為讀超時(shí),>250mS作為寫(xiě)超時(shí)。
四、命令格式
位序
47
46
[45:40]
[39:8]
[7:1]
0
寬度
1
1
6
32
7
1
數(shù)值
‘0’
‘1’
x
x
x
‘1’
備注
起始位
1發(fā)送、0接收
命令索引
變量
CRC7
終止位
五、關(guān)于命令索引
“命令索引”在SD協(xié)議中并沒(méi)有明確指出,但綜合參考三星程序及網(wǎng)上文章,認(rèn)為這種說(shuō)法是正確的:“命令索引”中的數(shù)字就是其“索引值”。對(duì)于ACMD類(lèi)的命令,可以看作為“復(fù)合命令”,即在執(zhí)行時(shí),前面先執(zhí)行CMD55,然后再執(zhí)行“去掉ACMDn前的‘A’的命令”
二、S3C2440手冊(cè)中關(guān)于SD卡的操作說(shuō)明
串行時(shí)鐘對(duì)數(shù)據(jù)線的信息進(jìn)行移位同步并采樣,設(shè)置SDIPRE來(lái)控制傳輸頻率。
基本編程過(guò)程:1、設(shè)置SDICON來(lái)選擇時(shí)鐘和中斷。
2、將SDIPRE設(shè)置為適當(dāng)?shù)臄?shù)值。
3、等待74個(gè)SDCLK,讓SD卡初始化完畢
命令的發(fā)送過(guò)程: 1、寫(xiě)32位命令變量到SDICmdArg
2、設(shè)置SDICmdCon寄存器,選擇命令類(lèi)型并啟動(dòng)傳輸
3、檢查SDICmdSta的指定位是否置位,判斷命令是否傳輸完畢。
4、若有響應(yīng),檢查響應(yīng)寄存器SDIRSPn
5、對(duì)SDICmdSta寄存器相應(yīng)的位寫(xiě)1,清除標(biāo)志位
數(shù)據(jù)通道編程:1、寫(xiě)超時(shí)寄存器SDIDTimer
2、寫(xiě)入要操作的塊大小到SDIBSize
3、設(shè)置塊模式,總線寬度,DMA等,設(shè)置SDIDatCon.啟動(dòng)傳輸
4、發(fā)送數(shù)據(jù)時(shí),當(dāng)TCFIFO有效、過(guò)半、空時(shí),將數(shù)據(jù)寫(xiě)入SDIDAT中,
5、接收數(shù)據(jù)時(shí),當(dāng)RXFIFO有效、過(guò)半、空時(shí),將數(shù)據(jù)寫(xiě)入SDIDAT中,
6、確認(rèn)數(shù)據(jù)是否傳送完畢。
7、清除SDIDatSta中相應(yīng)的標(biāo)志
一、初始化命令的差別:
1、加入CMD8命令,以識(shí)別是否為大容量卡,如果是,則響應(yīng)為R7,返回可接受的電源范圍及和發(fā)送一致的檢驗(yàn)碼。
2、ACMD41與V1.0版本稍有不同,它的響應(yīng)一般是rSDIRSP0=0xc0ff8000,為了兼容要多增加一個(gè)分支。
3、發(fā)送CMD2,響應(yīng)為CID。如某卡的rSDIRSP0:rSDIRSP1:rSDIRSP2:rSDIRSP3值為:0x1b534d30:0x30303030:0x10b1846c:0xdc00879d意義如下:
127 0
位數(shù)
8
16
40
8
32
4
12
7
1
值
1b
534d
3030303030
10
b1846cd
c
008
79d
意義
MID
“SM
00000”
PRV
PSN
RSV
MDT
CRC
二、讀寫(xiě)差別
V2.0是對(duì)塊操作,每塊512字節(jié)。V1.0是可以對(duì)字節(jié)操作,用CMD16設(shè)置塊的大小。用CMD17,CMD18分別對(duì)單個(gè)塊、多塊操作。
值得注意的是,三星的例程比較經(jīng)典,但不能讀大容量SD卡,原因是沒(méi)有設(shè)置SDI Data Control Register,對(duì)于大容量卡,一定要設(shè)置該寄存器,使之等于0x200,且必須是此值。
以下是對(duì)某大容量卡的起始扇區(qū)的讀出數(shù)據(jù):
0x 0: Rx-0xeb068005,0x2039ffff,0xe800005b,0xc1eb048c
0x 4: Rx-0xc801c38e,0xdb536a19,0xcbf60602,0x 4740f
0x 8: Rx-0x31c08ec0,0xbffc0566,0xb8445543,0x4566ab68
0x c: Rx-0x 2017bc,0x 9031c9,0x51ba8000,0x52b408f9
0x 10: Rx-0xcd135a58,0x16077217,0x80e13ff9,0x741191b4
0x 14: Rx-0x 289c531,0xdb4152f9,0xcd135a72,0x 2f6dc0e
0x 18: Rx-0x1f9c31f6,0x31ffb9df,0x fcf3a5,0xbbfc1966
0x 1c: Rx-0xb8475255,0xaaea7a00,0x 20161f,0x66390775
0x 20: Rx-0x549d723c,0x e1fad88,0xe6ad89c1,0x243f741f
0x 24: Rx-0x29e848f6,0xd8bf0300,0xb4026800,0x d0731db
0x 28: Rx-0x60cd1361,0x730a6031,0xc0cd1361,0x4f75e9f9
0x 2c: Rx-0xe8c50977,0x2883c60c,0x81fefe01,0x72c67715
0x 30: Rx-0xbeb231b4,0x 89952cd,0x13587209,0x9991243f
0x 34: Rx-0x740341eb,0xc0be5101,0xe86f00eb,0xfe1e0666
0x 38: Rx-0x608cc3fa,0x f011660,0x a0f20c0,0x c010f22
0x 3c: Rx-0xc0be0800,0x8ec66631,0xf66631ff,0x66b90024
0x 40: Rx-0x fcf3,0x66a5be10,0x 8ec624,0xfe0f22c0
0x 44: Rx-0x8ec3b900,0x 231f656,0xbf007c57,0x 61f5607
0x 48: Rx-0xfcf3a5bf,0x107ebe00,0x ab91e00,0xfcf3662e
0x 4c: Rx-0xa5061ffb,0xcbfab800,0x208ed0bc,0xdc8ffb66
0x 50: Rx-0x61071fe9,0x6fffb40e,0xcd102eac,0x3c0075f6
0x 54: Rx-0xc30d0a4d,0x69737369,0x6e67204d,0x42522d68
0x 58: Rx-0x656c7065,0x722e0000,0x 0,0x 0
0x 5c: Rx-0x 0,0x 0,0x 0,0x 0
0x 60: Rx-0x 0,0x 0,0x 0,0x 0
0x 64: Rx-0x 0,0x 0,0x 0,0x 0
0x 68: Rx-0x 0,0x 0,0x 0,0x 0
0x 6c: Rx-0x 0,0x 0,0x9bb43b00,0x 8001
0x 70: Rx-0x 1000cfe,0x7ff23f00,0x c17f,0x7a000000
0x 74: Rx-0x 0,0x