SD Card 的記億容量資料是儲存在內部寄存器,資料是儲存在 CSD(Card-Specific Data Register)寄存器內,通過 CMD9 指令,取得 CSD 寄存器資料內的 C_SIZE 數據,通過計算,才會得到正確的 SD 記億容量。
SanDisk 2GB SD Card |
名稱
|
域
|
數據寬度
|
單元類型
|
CSD劃分
|
CSD結構
|
CSD_STRUCTURE
|
2
|
R
|
[127:126]
|
保留
|
-
|
6
|
R
|
[125:120]
|
資料讀取時間1
|
TAAC
|
8
|
R
|
[119:112]
|
資料在CLK週期內讀取時間2(NSAC*100)
|
NSAC
|
8
|
R
|
[111:104]
|
最大資料傳輸率
|
TRAN_SPEED
|
8
|
R
|
[103:96]
|
卡命令集合
|
CCC
|
12
|
R
|
[95:84]
|
最大讀取資料塊長
|
READ_BL_LEN
|
4
|
R
|
[83:80]
|
允許讀的部分塊
|
READ_BL_PARTIAL
|
1
|
R
|
[79:79]
|
非線寫塊
|
WRITE_BLK_MISALIGN
|
1
|
R
|
[78:78]
|
非線讀塊
|
READ_BLK_MISALIGN
|
1
|
R
|
[77:77]
|
DSR條件
|
DSR_IMP
|
1
|
R
|
[76:76]
|
保留
|
-
|
2
|
R
|
[75:74]
|
設備容量
|
C_SIZE
|
12
|
R
|
[73:62]
|
最大讀取電流@VDD min
|
VDD_R_CURR_MIN
|
3
|
R
|
[61:59]
|
最大讀取電流@VDD max
|
VDD_R_CURR_MAX
|
3
|
R
|
[58:56]
|
最大寫電流@VDD min
|
VDD_W_CURR_MIN
|
3
|
R
|
[55:53]
|
最大寫電流@VDD max
|
VDD_W_CURR_MAX
|
3
|
R
|
[52:50]
|
設備容量乘子
|
C_SIZE_MULT
|
3
|
R
|
[49:47]
|
擦除單塊使能
|
ERASE_BLK_EN
|
1
|
R
|
[46:46]
|
擦除磁區大小
|
SECTOR_SIZE
|
7
|
R
|
[45:39]
|
防寫群大小
|
WP_GRP_SIZE
|
7
|
R
|
[38:32]
|
防寫群使能
|
WP_GRP_ENABLE
|
1
|
R
|
[31:31]
|
保留
|
-
|
2
|
R
|
[30:29]
|
寫速度因數
|
R2W_FACTOR
|
3
|
R
|
[28:26]
|
最大寫資料塊長度
|
WRITE_BL_LEN
|
4
|
R
|
[25:22]
|
允許寫的部分部
|
WRITE_BL_PARTIAL
|
1
|
R
|
[21:21]
|
保留
|
-
|
5
|
R
|
[20:16]
|
檔系統群
|
FILE_OFRMAT_GRP
|
1
|
R/W
|
[15:15]
|
拷貝標誌
|
COPY
|
1
|
R/W
|
[14:14]
|
永久防寫
|
PERM_WRITE_PROTECT
|
1
|
R/W
|
[13:13]
|
暫時防寫
|
TMP_WRITE_PROTECT
|
1
|
R/W
|
[12:12]
|
檔系統
|
FIL_FORMAT
|
2
|
R/W
|
[11:10]
|
保留
|
-
|
2
|
R/W
|
[9:8]
|
CRC
|
CRC
|
7
|
R/W
|
[7:1]
|
未用,始終為1
|
-
|
1
|
[0:0]
|
CSD 寄存器設備容量 C_SIZE [73:62] :
此參數用於計算用戶的 SD Card 數據卡容量(不包括安全保護區域)。存儲容量是從 C_SIZE [73:62],C_SIZE_MULT [49:47] 和 READ_BL_LEN [25:22] 計算的,如下所示:
內存容量 = BLOCKNR * BLOCK_LEN
BLOCKNR =(C_SIZE 1)* MULT
MULT = 2C_SIZE_MULT 2(C_SIZE_MULT<8) BLOCK_LEN = 2
READ_BL_LEN,(READ_BL_LEN<12)
要指示 2GB 的卡,BLOCK_LEN應為1024字節。
因此,可以編碼的最大容量是4096 * 512 * 1024 = 2 G字節。
例如:一個 32MB 的BLOCK_LEN = 512卡可以用 C_SIZE_MULT = 3 和 C_SIZE = 2000 編碼。
首先是 ESP8266 發出 ACMD9 讀取 CSD 寄存器(卡特殊數據寄存器)的資料,然後抽取 C_SIZE [73:62],C_SIZE_MULT [49:47] 和 READ_BL_LEN [25:22] ,便可以計算出 SD Card 數據卡容量。
SD Card 內存容量計算,(Version 1.0):
// Device Size =
(C_SIZE+1)*MULTI
// Max Device Size =
4096*512*2048 = 4GB
// Example 2GB = 0x3AE2 =
3770+1 = 3771
C_SIZE = ((((uint16)response[9]
& 0x03) <<10) + ((uint16)response[8] <<2) + (response[7]>>6)) + 1;
// C_SIZE_MULTI
SD_MULTI=( (response[6]&0x03) <<1 | response[5] >>7)
+ 2;
// BLOCK LEN
SD_BLOCK=(response[10] & 0x0F);
// C_SIZE_MULTI + BLOCK LEN
i=(response[10] & 0x0F) + ( (response[6]&0x03) <<1 | response[5] >>7)
+ 2;
// C_SIZE_MULTI + BLOCK LEN
SD_SIZE = (uint32)C_SIZE<< i;
os_sprintf(dsp_buffer, "SD V1.0 Size =
%dByte\r\n",SD_SIZE);
at_port_print(dsp_buffer);
// C_SIZE_MULTI + BLOCK LEN
SD_SIZE = (uint32)C_SIZE<< (i-10);
os_sprintf(dsp_buffer, "SD V1.0 Size -10 =
%dkByte\r\n",SD_SIZE);
at_port_print(dsp_buffer);
|
SanDisk 2GB SD Card 內存容量計算結果 |
2017年 11月 23日 天氣報告
氣溫:18.8度 @ 19:40
相對濕度:百分之 63%
天氣:大致多雲
沒有留言:
張貼留言