"); //-->
八、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芯片手册》
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。