2017年11月23日 星期四

DIY - ESP8266:ESP-12F 計算 SD Card 內存容量(四十八)

DIY - ESP8266:ESP-12F 計算 SD Card 內存容量(四十八):

SD Card 的記億容量資料是儲存在內部寄存器,資料是儲存在 CSD(Card-Specific Data Register)寄存器內,通過 CMD9 指令,取得 CSD 寄存器資料內的 C_SIZE 數據,通過計算,才會得到正確的 SD 記億容量。

SanDisk 2GB SD Card
CSD Register (CSD Version 1.0)
名稱
數據寬度
單元類型
CSD劃分
CSD結構
CSD_STRUCTURE
2
R
[127:126]
保留
-
6
R
[125:120]
資料讀取時間1
TAAC
8
R
[119:112]
資料在CLK週期內讀取時間2NSAC*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%
天氣:大致多雲

沒有留言:

張貼留言