詳解 STM32 之 SD 卡(3)
八、SD卡疑惑
1、SD卡擦除后,其中的內(nèi)容是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》)
也就是說這是芯片廠商生產(chǎn)工藝決定的,可以通過SCR寄存器的 DATA_STAT_AFTER_ERASE位得知。
2、在SDIO_DCTRL中設(shè)置傳輸Block的要求
Block大小決定了主機在發(fā)送數(shù)據(jù)時,發(fā)送到什么程度時開始發(fā)送CRC校驗碼;而在接收數(shù)據(jù)時,在接收到什么程度時開始把SD卡的數(shù)據(jù)作為CRC校驗碼并進行校驗。Block還可能影響著其他的時序。在STM32的SDIO寄存器組中,SDIO_DCTRL中的位段DBLOCKSIZE決定主機Block大小。
在摘自《Simplified_SD_Host_Controller_Spec.pdf》的引文中,提到這樣的配置要求:主機的Block一定要與SD卡設(shè)置的Block一樣大小,這顯然是必要的。我們經(jīng)常設(shè)置SD卡的Block大小是512Bytes,所以設(shè)置DBLOCKSIZE為9(2^9 = 512)。
3、STM32固件庫“stm32_eval_sdio_sd.c version v4.5.0”偶遇BUG
參考網(wǎng)頁:http://www.cprogramdevelop.com/3742318/
4、SD卡寫B(tài)lock是怎樣進行的?
寫SD卡的單位是Block(512Bytes),再寫之前要先整塊擦除,然后才能寫。
在多塊寫操作中,可以在發(fā)送多塊寫命令CMD25之前,有選擇性的先發(fā)送命令A(yù)CMD23設(shè)置預(yù)擦除。怎樣理解呢?
既然是有選擇性的,也可以不發(fā)送ACMD23命令。在多塊寫的過程中,由于SD卡事先不知道你要寫入幾個塊(CMD25命令只告訴SD卡要寫入的起始地址),所以寫入的過程是:根據(jù)需要判斷要寫一個塊時,先擦除然后再寫,再判斷是否要寫入下一個塊,如果是就再擦除再寫。
倘若發(fā)送ACMD23命令就不一樣了,ADM23命令會在寫命令CMD25生效之前,告訴SD卡準(zhǔn)備寫入的塊數(shù)N。這樣當(dāng)CMD25命令生效的時候,SD卡會一次性先將這N個塊都擦除,然后再一個塊一個塊寫。由于擦除操作比較集中,所以整個多塊寫操作更節(jié)省時間。
九、SD卡參數(shù)測試
使用野火開發(fā)板配套例程做測試,筆者測試用的SD卡是金士頓的2G內(nèi)存塊,打印SD卡的參數(shù)信息如下:
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),實際扇區(qū)擦除的block數(shù)為(SECTOR_SIZE+1),為128 Blocks
write protect group size:WP_GRP_SIZE(CSD),實際保護的扇區(qū)數(shù)為(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芯片手冊》
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。