博客專欄

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

        詳解 STM32 之 SD 卡(3)

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

        八、SD卡疑惑

        1、SD卡擦除后,其中的內容是0,還是1 ? 

          The data at the card after an erase operation is either '0' or '1', depends on the card vendor.The SCR register bit DATA_STAT_AFTER_ERASE (bit 55) defines whether it is '0' or '1'.(摘自《SD Specifications_Part_1_Physical_Layer_Specification_Ver3.00_Final_090416.pdf》)

          也就是說這是芯片廠商生產工藝決定的,可以通過SCR寄存器的 DATA_STAT_AFTER_ERASE位得知。

         2、在SDIO_DCTRL中設置傳輸Block的要求

          Block大小決定了主機在發送數據時,發送到什么程度時開始發送CRC校驗碼;而在接收數據時,在接收到什么程度時開始把SD卡的數據作為CRC校驗碼并進行校驗。Block還可能影響著其他的時序。在STM32的SDIO寄存器組中,SDIO_DCTRL中的位段DBLOCKSIZE決定主機Block大小。

          在摘自《Simplified_SD_Host_Controller_Spec.pdf》的引文中,提到這樣的配置要求:主機的Block一定要與SD卡設置的Block一樣大小,這顯然是必要的。我們經常設置SD卡的Block大小是512Bytes,所以設置DBLOCKSIZE為9(2^9 = 512)。

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

          參考網頁:http://www.cprogramdevelop.com/3742318/

         4、SD卡寫Block是怎樣進行的?

          寫SD卡的單位是Block(512Bytes),再寫之前要先整塊擦除,然后才能寫。

          在多塊寫操作中,可以在發送多塊寫命令CMD25之前,有選擇性的先發送命令ACMD23設置預擦除。怎樣理解呢?

          既然是有選擇性的,也可以不發送ACMD23命令。在多塊寫的過程中,由于SD卡事先不知道你要寫入幾個塊(CMD25命令只告訴SD卡要寫入的起始地址),所以寫入的過程是:根據需要判斷要寫一個塊時,先擦除然后再寫,再判斷是否要寫入下一個塊,如果是就再擦除再寫。

          倘若發送ACMD23命令就不一樣了,ADM23命令會在寫命令CMD25生效之前,告訴SD卡準備寫入的塊數N。這樣當CMD25命令生效的時候,SD卡會一次性先將這N個塊都擦除,然后再一個塊一個塊寫。由于擦除操作比較集中,所以整個多塊寫操作更節省時間。

        九、SD卡參數測試

          使用野火開發板配套例程做測試,筆者測試用的SD卡是金士頓的2G內存塊,打印SD卡的參數信息如下:

        圖片

        Card Type is :1
        ManufacturerID is :2

        Card device size is :3795
        Card Block Size is :1024
        Card device size multiplier is :7
        Card Capacity is :1990197248

        the maximum read date block length is :1024
        partial blocks for write allowed is :0
        the maximum write date block length is :1024
        erase single block enable is :1
        erase sector size is :127
        write protect group size is :0
        RCA is :4660 

        圖片

        Card Type:1         SDSC卡版本2.0

        Card device size:  C_SIZE(CSD),為3795

        Card Block Size:  max read data block length(READ_BL_LEN(CSD)) ,為1024 Bytes

        Card device size multiplier is:  C_SIZE_MULT(CSD),為7

        Card Capacity:  1990197248 Bytes

        計算方法(摘自《Simplified_Physical_Layer_Spec.pdf》):

        memory capacity = BLOCKNR * BLOCK_LEN
         
          BLOCKNR = (C_SIZE+1) * MULT  (C_SIZE <= 4096
          MULT = 2^(C_SIZE_MULT+2)        (C_SIZE_MULT < 8)
          BLOCK_LEN = 2^READ_BL_LEN,    (READ_BL_LEN < 12)

        注意:SDSC最大為2GB。

        the maximum read date block length:READ_BL_LEN(CSD) ,為1024 Bytes

        partial blocks for write allowed:WRITE_BL_PARTIAL(CSD),為不支持

        the maximum write date block length:WRITE_BL_LEN(CSD) ,為1024 Bytes

        erase single block enable:ERASE_BLK_EN(CSD),為1,支持單塊擦除

        erase sector size:SECTOR_SIZE(CSD),實際扇區擦除的block數為(SECTOR_SIZE+1),為128 Blocks

        write protect group size:WP_GRP_SIZE(CSD),實際保護的扇區數為(WP_GRP_SIZE+1),為1 Sector

        RCA: SD卡相對地址為4660

         

        參考資料:《Simplified_SDIO_Card_Spec.pdf》

             《Simplified_Physical_Layer_Spec.pdf》

               《Simplified_SD_Host_Controller_Spec.pdf》

             《STM32芯片手冊》


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 單片機

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 秦安县| 若尔盖县| 文水县| 碌曲县| 乌兰县| 肇庆市| 城固县| 泗洪县| 海安县| 德庆县| 通江县| 晴隆县| 海口市| 万盛区| 南充市| 萨嘎县| 错那县| 县级市| 道孚县| 开平市| 葫芦岛市| 彰武县| 融水| 凤冈县| 安丘市| 泾源县| 都江堰市| 朝阳市| 鲁甸县| 开原市| 隆回县| 金山区| 永州市| 邢台市| 长沙市| 双峰县| 麻栗坡县| 洛浦县| 府谷县| 甘孜| 古浪县|