色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > 詳解 STM32 之 SD 卡(1)

          詳解 STM32 之 SD 卡(1)

          發(fā)布人:魚鷹談單片機 時間:2022-12-21 來源:工程師 發(fā)布文章

          看到一篇寫的比較好的筆記,分享給大家


          一、SD卡概述

            1、定義

            2、容量等級

            3、SD卡框圖

            4、SD卡與TF卡的區(qū)別

          二、 SD卡內(nèi)部結(jié)構(gòu)

            1、 SD卡內(nèi)部結(jié)構(gòu)簡圖

            2、 存儲陣列結(jié)構(gòu)圖

            3、Buffer 

            4、“存儲陣列Block”--最小的存儲單元

            5、SD卡的特殊功能寄存器

          三、SDIO接口 

          四、SD卡協(xié)議的核心--數(shù)據(jù)讀、寫、擦除

            1、SD卡寫數(shù)據(jù)塊

            2、SD卡讀數(shù)據(jù)塊 

            3、擦除SD卡

          五、SD卡物理層協(xié)議

            1、接口 

            2、命令格式

            3、響應(yīng)格式

            4、SD卡的工作狀態(tài)

            5、SD卡的兩種狀態(tài)信息

          六、STM32與SD卡相配的外設(shè)--SDIO適配器

            1、SDIO adapter 結(jié)構(gòu)圖 

            2、命令狀態(tài)機(CPSM)

            3、數(shù)據(jù)通道狀態(tài)機(DPSM)

            4、SDIO的FIFO 

            5、SDIO的特殊功能寄存器

          七、SD卡編程 

            1、SD卡編程的內(nèi)容

            2、SD卡初始化 

            3、讀SD卡的一個塊

            4、寫SD卡的一個塊 

          八、SD卡疑惑

            1、SD卡擦除后,其中的內(nèi)容是0,還是1 ? 

            2、在SDIO_DCTRL中設(shè)置傳輸Block的要求

              3、STM32固件庫“stm32_eval_sdio_sd.c version v4.5.0”偶遇BUG

              4、SD卡寫B(tài)lock是怎樣進行的?

          九、SD卡參數(shù)測試

           

          一、SD卡概述

          1、定義

            SD卡(安全數(shù)碼卡),是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,它被廣泛地于便攜式裝置上使用,例如數(shù)碼相機、個人數(shù)碼助理(外語縮寫PDA)和多媒體播放器等。

          2、容量等級

          容量等級

          容量范圍

          磁盤格式

          SD

          上限至2GB

          FAT 12, 16

          SDHC

          2GB至 32GB

          FAT 32

          SDXC

          32GB至2TB

          exFAT

          3、SD卡框圖

          圖片

           引腳說明:

          圖片

          4、SD卡與TF卡的區(qū)別

            TF卡又名micro SD卡,個頭是比SD卡的1/4還小,可以通過“TF轉(zhuǎn)SD卡套”轉(zhuǎn)換成SD卡。

            詳細區(qū)別參考:SD卡與TF卡的區(qū)別  

          二、 SD卡內(nèi)部結(jié)構(gòu)

           ?。ㄕ許anDisk Secure Digital Card Product Manual Version 1.9)

          1、 SD卡內(nèi)部結(jié)構(gòu)簡圖

             由SD卡控制器和存儲陣列組成,SD卡與外界的通訊接口是SD Bus或者SPI Bus。

          圖片

          2、 存儲陣列結(jié)構(gòu)圖

          圖片

          Block:      

            讀寫時的單元(數(shù)據(jù)傳輸單元),它的單位是“字節(jié)”。

          Sector:     

            如果CSD寄存器ERASE_BLK_EN = 0時,Sector是最小的擦除單元,它的單位是“塊”。Sector的值等于CSD寄存器中的SECTOR_SIZE的值+1。

          WP Group:   

            最小的寫保護單元,它的單位是“扇區(qū)”。

          3、Buffer

          圖片

            SD Card的Buffer最大容量定義在CSD寄存器的READ_BL_LEN和WRITE_BL_LEN。它們的值是一樣的,而且有可能超過512字節(jié),盡管這樣Block還是要設(shè)置成512字節(jié),因為512字節(jié)是數(shù)據(jù)邊界(這句話不是太理解)。也就是SD卡上有數(shù)據(jù)傳輸緩沖器Buffer,不同的產(chǎn)品可能不一樣,但是在使用時要將Buffer設(shè)置成512字節(jié)。

          參考資料:  

            The card buffer size is described as maximum block length in the Card Specif ic Data (CSD) register for memory cards (for cards compliant with the Physical Layer Specification, READ_BL_LEN and WRITE_BL_LEN shall be the same) and in the Card Information Structure (CIS) for SDIO cards. Physical Layer Specification re-defines that maximum block length is only used to calculate capacity of memory card. Even though it indi cates larger than 512 bytes, block length shall be set to 512 byte for data transfer. This is because 512 bytes block l ength is required to keep compatibility with 512 bytes data boundary.

          (摘自《Simplified_SD_Host_Controller_Spec.pdf》)

          4、“存儲陣列Block”--最小的存儲單元

            資料上的Block通通指的是數(shù)據(jù)傳輸時的最小單元,定義這個數(shù)值是為了數(shù)據(jù)傳輸、CRC校驗等。

            存儲陣列通常采用NandFlash的結(jié)構(gòu),顯然不能按字節(jié)存取,而這里討論的“存儲陣列Block”就是指這個概念。可惜的是目前,我還沒有找到資料討論這個問題,所以這一章節(jié)是筆者自己的推測。

            據(jù)我推測存儲陣列Block應(yīng)該是512Byes,因為眾多的數(shù)據(jù)都圍繞著512Bytes在轉(zhuǎn)。比如說最小的擦除單元是512Byes,最小的讀寫單位應(yīng)該被設(shè)置成512Bytes,那么有理由推測是這個數(shù)值。

          5、SD卡特殊功能寄存器

          • CID:  寬度128位,卡標(biāo)識號

          • RCA:  寬度16位,卡相對地址,在初始化的時候確定

          • CSD:  寬度128位,卡描述數(shù)據(jù):卡操作條件的信息

          • SCR:  寬度64位,SD卡配置寄存器:SD卡特定信息數(shù)據(jù)

          • OCR:  寬度32位,操作條件寄存

          三、SDIO接口

          圖片

          四、SD卡協(xié)議之?dāng)?shù)據(jù)讀、寫、擦除

          1、SD卡寫數(shù)據(jù)塊 

            執(zhí)行寫數(shù)據(jù)塊命令(CMD24-27) 時,主機把一個或多個數(shù)據(jù)塊從主機傳送到卡中,同時在每個數(shù)據(jù)塊的末尾傳送一個CRC碼。主機傳送數(shù)據(jù),SD卡接收數(shù)據(jù)并將數(shù)據(jù)保存在Buffer中,累計接收數(shù)據(jù)達到Block長度的時候,SD卡把接下來的數(shù)據(jù)當(dāng)做CRC校驗碼,并且開始數(shù)據(jù)校驗。如果CRC校驗錯誤,卡通過SDIO_D 線指示錯誤,傳送的數(shù)據(jù)被丟棄而不被寫入,所有后續(xù)(在多塊寫模式下)傳送的數(shù)據(jù)塊將被忽略。

               如果主機傳送部分數(shù)據(jù)而累計的數(shù)據(jù)長度未與數(shù)據(jù)塊對齊,當(dāng)不允許塊錯位( 未設(shè)置CSD的參數(shù)WRITE_BLK_MISALIGN),卡將在第一個錯位的塊之前檢測到塊錯位錯誤( 設(shè)置狀態(tài)寄存器中的ADDRESS_ERROR 錯誤位) 。當(dāng)主機試圖寫一個寫保護區(qū)域時,寫操作也會被中止,此時卡會設(shè)置WP_VIOLATION位?!?/p>

            數(shù)據(jù)塊Block的最大長度定義在CSD中的WRITE_BL_LEN,但是在數(shù)據(jù)傳輸時應(yīng)該用CMD16指令將其設(shè)置為512Byets,不去在意WRITE_BL_LEN是1024或者2048Bytes。

            另外需要注意的是,Block的長度設(shè)置還要參考CSD寄存器的WRITE_BL_PARTIAL。當(dāng)WRITE_BL_PARTIAL為0時,那么么辦法Block只能設(shè)置為512Bytes;如果WRITE_BL_PARTIAL=1,那么允許將Block設(shè)置成更小的塊,比如說一個字節(jié)。協(xié)議是這樣規(guī)定的,但是據(jù)我分析如果這樣的話SD卡的制作會非常復(fù)雜(寫入的單位可以是字節(jié)),價格也會很高。筆者測試了自己的SD卡,WRITE_BL_PARTIAL 等于0,也就是不支持“塊部分寫”功能。 

          2、SD卡讀數(shù)據(jù)塊

            在讀數(shù)據(jù)塊模式下,數(shù)據(jù)傳輸?shù)幕締卧菙?shù)據(jù)塊Block。為保證數(shù)據(jù)傳輸?shù)恼_,傳輸一個數(shù)據(jù)塊Blcok后都有一個CRC校驗碼。筆者認為主機在累計接收到Block長度數(shù)據(jù)后,軟件可以把接下來的數(shù)據(jù)當(dāng)做CRC校驗碼,并且進行校驗。

            Block的最大值在CSD中(READ_BL_LEN) 給出了定義,但是在數(shù)據(jù)傳輸時應(yīng)該用CMD16指令將其設(shè)置為512Byets,不去在意READ_BL_LEN是1024或者2048Bytes。

            如果CSD寄存器中的READ_BL_PARTIAL等于1,可以傳送的較小數(shù)據(jù)塊,較小數(shù)據(jù)塊是指開始和結(jié)束地址完全包含在一個物理塊中。事實上,協(xié)議規(guī)定READ_BL_PARTIAL永遠等于1,也就說在任何SD卡上都允許“讀部分塊”,讀的塊的最小字節(jié)是1Bytes。使用這種功能,可以通過CMD16命令設(shè)置更小的Block(比如說等于128)。讀取的這128字節(jié)必須在512Bytes邊界內(nèi),不能跨越邊界(其實因為存儲陣列是以512Bytes為單位的,讀取“部分塊”只能在一個塊內(nèi),不允許跨塊讀)。

          3、擦除SD卡

            CSD寄存器ERASE_BLK_EN決定了SD卡的最小擦除單位。

            當(dāng)ERASE_BLK_EN等于0的時候,主機擦除的最小單位是扇區(qū)。比如一個Sector包含32個Block,擦除時的起始地址是5,而結(jié)束地址是40,那么實際擦除的塊是從0到63。

          圖片

            當(dāng)ERASE_BLK_EN等于1的時候,主機擦除的最小單位是512 Byetes。比如擦除時的起始地址是5,而結(jié)束地址是40,那么實際擦除的塊就是從5到40。

          圖片


          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

          全息投影相關(guān)文章:全息投影原理


          關(guān)鍵詞: 單片機

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉