作者:下家山
5.3 以塊方式寫10個字節
5.3.1 CMD53配置
rSDICARG == 0x98000002;
rSDICCON == 0x00000B75;
響應
rSDICSTA == 0x00000A35;
rSDIRSP0 == 0x00001000;
rSDIDSTA == 0x00000010;
解讀0x00000B75(略)
解讀0x00000A35(略)
解讀0x00001000(OK)
解讀0x00000010(發送完成)
5.4 Stream Mode存在的問題(具體操作略)
其實,最開始我以簡單起見,一直都是以Stream Mode方式操作的。
先寫20個字節,好像也沒發現什麼異常,但,發現讀時DMA中斷不能發生。這是何故呢?
在傳送數據時還有個數據狀態寄存器rSDIDSTA(其實,我每發送一個命令把所有的狀態寄存器讀打印出來了),發現在寫塊後,其值老爲0x00000002,表示數據正在發送。明明發送完了,命令也正確響應,爲什麼還在發送呢?再後來,我又去掉寫動作,只讀,發現雖然把數據讀出來,但數據狀態寄存器rSDIDSTA老是0x00000001,表示正在接收。
在此,我徘徊了很久,而且百思不得其解!
一次偶然,我從Block Mode轉到Stream Mode時忘了清S3c2410 SDIO 的數據控制寄存器rSDIDCON的【17】位,即Block Mode位,發現竟然讀出了我想要的20個數據。我茫然,怎麼會這樣呢?既然是以Stream Mode方式,爲什麼S3C2410 SDIO數據控制寄存器要設成Block Mode方式呢?這難道是sumsung s3c2410 datasheet對SDIO部分介紹不夠專業的原因?
5.5 s3c2410 sdio 塊傳輸相關寄存器設置
只需注意rSDIDCON(數據控制寄存器)的設置:
寫時設置爲rSDIDCON = 0x0033b002;
讀時設置爲rSDIDCON = 0x002ba002;
六 SDIO協議規範—與—S3C2410寄存器對應關係
6.1 CMD5剖析
Cmd5 協議規範
S |
D |
Command Index 000101b |
Stuff bits |
I/O OCR
|
CRC7 |
E |
1 1 6 8 24 7 1
S(tart bit): Start bit. Always 0
D(irection): Direction. Always 1 indicates transfer from host to card
Command Index: Identifies the CMD5 command with a value of 000101b
Stuff Bits: Not used, shall be set to 0
I/O OCR: Operation Conditions Register. The supported minimum and maximum values for VDD. The layout of the OCR is shown follow
I/O OCR bit position |
VDD voltage window (in Volts) |
0-3 |
Reserved |
4 |
Reserved |
5 |
Reserved |
6 |
Reserved |
7 |
Reserved |
8 |
2.0-2.1 |
9 |
2.1-2.2 |
10 |
2.2-2.3 |
11 |
2.3-2.4 |
12 |
2.4-2.5 |
13 |
2.5-2.6 |
14 |
2.6-2.7 |
15 |
2.7-2.8 |
16 |
2.8-2.9 |
17 |
2.9-3.0 |
18 |
3.0-3.1 |
19 |
3.1-3.2 |
20 |
3.2-3.3 |
21 |
3.3-3.4 |
22 |
3.4-3.5 |
23 |
3.5-3.6 |
Table 1
CRC7: 7bits of CRC data
E(nd bit): End bit, always 1
在S3C2410中要發送CMD5需要設置rSDICARG ,rSDICCON ,兩個寄存器。
rSDICARG:SDI 命令參數寄存器;
rSDICCON:SDI 命令控制寄存器;
這兩個寄存器合起來構成SDIO協議規範中的CMD5命令。其中:
rSDICARG[24:0]=====================CMD5[31:8] 高8bit無效
rSDICCON[7:0]======================CMD5[47:40]
個人觀點: CMD5的stuff bit ,CRC7bit ,Endbit可以不管。因爲他們的值固定,s3c2410已把他們做到SDIO控制器裏面去了,實際發送命令時,這些位都傳過去了,只是我們看不到而已。