SD卡具有安全加密功能,內(nèi)置128bit加密位,在加密狀態(tài)下,用戶需提供密碼才可以訪問卡內(nèi)的數(shù)據(jù)。
在卡上電時,若卡包含密碼,卡自動進入鎖定狀態(tài),讀寫命令均返回錯誤,以保護卡內(nèi)容不被讀出及修改。
密碼設(shè)置功能由CMD42實現(xiàn),其數(shù)據(jù)包中包括該命令中所有的信息。
Byte
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
Erase
Card
Lock/UnLock
ClrPwd
SetPwd
1
Psw_Length
2
Pwd
Data
PwdLen+1
擦除:此位置1時,卡的密碼和內(nèi)容會被強制擦除,在遺忘密碼時可使用此功能。
鎖定/解鎖:此位置1時,表示命令結(jié)束后狀態(tài)為鎖定,為0,表示卡解鎖。
清除密碼:此位置1,表示清除卡的舊密碼,此時數(shù)據(jù)中必須包含舊密碼的正確內(nèi)容。
加密:此位置1,表示設(shè)置卡的新密碼,數(shù)據(jù)中必須包含新密碼內(nèi)容;更改密碼時,新密碼緊跟隨舊密碼內(nèi)容。
注:在CMD42命令之前,首先要使卡工作在傳輸狀態(tài),在SD模式下可使用CMD7進行狀態(tài)轉(zhuǎn)換,在SPI模式下,可使用初始化序列進行狀態(tài)切換。
在任意刻,主機可以通過CMD13命令讀取卡的內(nèi)部狀態(tài),判斷其鎖定狀態(tài)。定義如下:
[if
!vml]
圖略
[endif]
bit0置1表示卡處于鎖定狀態(tài)。
1、設(shè)置密碼
使用CMD16設(shè)置Block長度為密碼長度為PWD_LEN+2;
發(fā)送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
發(fā)送命令數(shù)據(jù):0x01,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢復原Block長度。
2、清除密碼
使用CMD16設(shè)置Block長度為PWD_LEN+2;
發(fā)送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
發(fā)送命令數(shù)據(jù):0x02,LEN,CMD_DATA0,CMD_DATA1……,0xFF,0xFF;
使用CMD16恢復原Block長度。
3、卡的鎖定、解鎖
使用CMD16設(shè)置Block長度為PWD_LEN+2;
發(fā)送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
發(fā)送命令數(shù)據(jù):0x04,LEN,密碼[LEN]……,0xFF,0xFF;
使用CMD16恢復原Block長度。
4、修改密碼
使用CMD16設(shè)置Block長度為OLD_PWD_LEN+NEW_PWD_LEN+2;
發(fā)送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
發(fā)送命令數(shù)據(jù):0x05,LEN,舊密碼[n],新密碼[m]……,0xFF,0xFF;
使用CMD16恢復原Block長度。
5、卡擦除
使用CMD16設(shè)置Block長度為1;
發(fā)送CMD42命令:0x6A,0x00,0x00,0x00,0x00,0x95;
發(fā)送命令數(shù)據(jù):0x08,0xFF,0xFF;
使用CMD16恢復原Block長度。