說起SD NAND /SD卡寫保護的問題,我們先分析一下出現寫保護的一些原因
首先,我們先除去SD大卡的物理開關的問題,目前TF卡和SD NAND都是通過軟件進行寫保護的開關。
讀寫中意外斷電、未“安全移除”、長期使用產生壞塊、空間已滿等,系統為避免進一步數據損壞,可能將卡自動掛為“只讀”。
惡意程序篡改分區表、文件系統設置,甚至設置隱藏的只讀/寫保護屬性,導致無法寫入或格式化。
如?Windows?驅動不兼容、用戶權限不足、注冊表項(如 Storage Device Policies的?Write Protect)被修改,系統層將設備設為“只讀”。
閃存磨損達到設計壽命或主控/電路異常,主控可能啟用只讀保護,防止數據進一步損壞
電壓不足、掉電、浪涌等導致讀寫中斷或文件系統損壞,進而觸發只讀/寫保護現象。這個問題目前是比較常見的,所以供電電壓的穩定性很重要,且要高估存儲卡的峰值電流和浪涌,這樣會導致電壓瞬間的變化。
所以保證穩定供電,避免低電量設備中長時間寫入;必要時使用穩壓與浪涌抑制設計。

寫保護開關和密碼設定主要是存儲芯片命令集中的CMD42來執行,我們也簡單學習一下CMD42的功能。
CMD42功能與用途?
CMD42(Class 7,Lock Card commands)是 SD規范中用于卡片安全與鎖定的命令,可在卡內維護的寄存器(如?PWD、PWD_LEN)上執行:設置/清除密碼、鎖定/解鎖卡片,以及在必要時執行“強制擦除”(擦除卡內數據與密碼)。當卡內設置了密碼(PWD_LEN ≠ 0)時,卡在上電后會自動進入鎖定狀態,此時常規讀寫將被拒絕,直到通過 CMD42正確解鎖。該命令是實現“密碼保護芯片”的核心機制。
?關鍵約束與差異?
塊長度設置:執行 CMD42前需用 CMD16設置數據塊長度。塊長度必須≥命令數據結構長度(至少為?PWD_LEN+2? 字節)。在?SD模式下可設為任意合法偶數值;在?SPI模式下,CMD42的塊長度應取偶數,很多實現會直接用?1字節或?PWD_LEN+2。
密碼長度限制:PWD_LEN 最多為?16字節;修改密碼時“舊密碼+新密碼”的總長度最多 ?32字節。
卡片自動鎖定:若上電時?PWD_LEN ≠ 0,卡會自動進入鎖定狀態。
模式差異:CMD42屬于 SD應用命令集,SD模式下需通過應用命令路徑(先發 CMD55再發 CMD42);SPI模式下通常可直接發送 CMD42。
寫保護區分:CMD42 是“密碼鎖卡”能力;而按扇區/組的軟件寫保護由?CMD28/CMD29/CMD30? 管理,且?SDHC/SDXC? 不支持這些寫保護命令(不響應)。
強制擦除:設置數據塊長度為?1? 并在 CMD42數據中僅置位 ERASE位,可清除卡內數據與密碼(忘記密碼時的最后手段)
。
?字段與響應說明?
CMD42數據塊格式(按字節):
Byte0:標志位,bit7~4保留(置 0),bit3 ERASE,bit2 LOCK/UNLOCK,bit1 CLR_PWD,bit0 SET_PWD。
Byte1:PWD_LEN(密碼長度,單位字節)。
Byte2…:密碼數據(按“舊密碼在前、新密碼在后”的順序提供,僅在相應標志置位時有效)。
末尾:附加?16位 CRC?(SPI模式)。
狀態查詢與結果:
用 CMD13(SEND_STATUS)查詢卡狀態,bit0(CARD_IS_LOCKED)為 1表示卡處于鎖定。
CMD42執行失敗會在狀態寄存器置位?LOCK_UNLOCK_FAILED?(bit24);若強制擦除失敗會置位?LOCK_UNLOCK_FAILED。
塊長度與 CRC的細節:CMD42的數據塊長度由主機在 CMD16設定;SPI模式下該數據塊需包含 16位 CRC。CMD16的長度參數在 CMD42場景下應≥PWD_LEN+2
。
?典型操作流程(SPI模式示例)??
準備:確保卡處于傳輸狀態(SD模式用 CMD7選中;SPI 模式按初始化流程完成選中)。
設置塊長度:CMD16(ARG=塊長度,RESP=R1)。CMD42的塊長度應≥PWD_LEN+2;SPI實踐中常用?1? 或?PWD_LEN+2?(偶數)。
設置密碼(首次設置):
CMD16(ARG=PWD_LEN+2)
發送 CMD42(CMD=0x6A, ARG=0x00000000, CRC=0x95)
數據塊:0x01(SET_PWD),PWD_LEN,舊密碼(無則填 0),新密碼
結束:附加 0xFF 填充至整塊,發送 16位 CRC
用 CMD16恢復塊長度為 512(如需后續常規讀寫)
鎖定卡片:
CMD16(ARG=PWD_LEN+2)
CMD42數據:0x04(LOCK),PWD_LEN,當前密碼
解鎖卡片:
CMD16(ARG=PWD_LEN+2)
CMD42數據:0x08(UNLOCK),PWD_LEN,當前密碼
清除密碼:
CMD16(ARG=PWD_LEN+2)
CMD42數據:0x02(CLR_PWD),PWD_LEN,當前密碼
修改密碼:
CMD16(ARG=OLD_LEN+NEW_LEN+2)
CMD42數據:0x05(SET_PWD|CLR_PWD),OLD_LEN+NEW_LEN,舊密碼,新密碼
強制擦除(忘記密碼時,會清空數據與密碼):
CMD16(ARG=1)
CMD42數據:0x08(ERASE),0xFF, 0xFF
狀態查詢:CMD13(R1),檢查 bit0(CARD_IS_LOCKED)
以上流程與字段取值符合 SD規范對 CMD42的定義與示例實現。
常見坑與建議?
必須在“傳輸狀態”下執行 CMD42;在 SD 模式下未正確選卡(CMD7)會導致失敗。
CMD42的數據塊長度不要小于?PWD_LEN+2;SPI模式下塊長度請用偶數(1或 PWD_LEN+2)。
設置/修改密碼時,舊密碼不正確會置位 ?LOCK_UNLOCK_FAILED? 且不改變 PWD;長度為 0或 >16也會失敗。
上電若?PWD_LEN ≠ 0,卡會自動鎖定;應用需在啟動時檢測 CARD_IS_LOCKED并按需解鎖。
忘記密碼不可逆恢復數據;“強制擦除”會清除數據與密碼,慎用。
不要將 CMD42的“鎖定/解鎖”與 CMD28/29/30的“扇區寫保護”混淆;后者為可選的按組寫保護,且 ?SDHC/SDXC? 不支持
審核編輯 黃宇
-
存儲
+關注
關注
13文章
4832瀏覽量
90169 -
SD NAND
+關注
關注
0文章
118瀏覽量
1850
發布評論請先 登錄
從NOR Flash 到 NAND Flash 和SD NAND,從底層結構到應用差異
CS創世 SD NAND測試報告
從NOR Flash到NAND Flash和SD NAND,從底層結構到應用差異
SD NAND、TF卡、SD卡的應用領域大揭秘
解鎖SD NAND、TF卡、SD卡的應用密碼
SD NAND 接口協議解析:SPI 與 SDIO 模式區別及適配方法
一文秒懂XTX SD NAND
解鎖存儲密碼:SD NAND、TF卡、SD卡的應用全景
CS SD NAND 在AI領域的應用和注意事項
SD卡—雷龍 SD NAND
T-Box智能升級:NXP S32K146攜手SD NAND(嵌入式SD卡)的創新應用
SD NAND寫保護問題的分析
評論