历史上的今天
返回首页

历史上的今天

今天是:2024年11月25日(星期一)

正在发生

2021年11月25日 | SD卡扇区擦除之整卡擦除(以及一些细节问题和疑惑)

2021-11-25 来源:eefocus

前言

其实这个博文是强迫症的产物,对产物;如果要在一个SD卡上建立文件系统FATFS,我带从这张卡的第0个字节,清除到最后一个字节,确保卡上“无残留”,从而不会影响我后续的工作;当整张卡被清除的那一刻,开心!!!

文章中的例程包含标准容量卡SDSC的和高容量卡SDHC的例程;

以我16G的金士顿SD卡为例;


流程

首先你需要获取SD卡上的CSD寄存器值,从而计算出当前卡的准确容量,可以看我下面这个博客:https://blog.csdn.net/wuyuzun/article/details/90581825

这里为啥说当前卡的准确容量,来看下面这个图片比较:

计算机显示我的内存卡的总容量如下

在这里插入图片描述

通过STM32的 SD_GetCardStatus() 函数获取SD卡容量,计算过程看上面我那个博客就行。通过串口打印出来如下:

在这里插入图片描述

显然:15707668480 != 15690891264;但是两个差值= 16777216 = 16KB;难道这是主引导区MBR?这就是我异或得地方,这是怎么回事?如果有知道的朋友,还麻烦给告诉一下,不胜感激;

所以这里我们以大的15707668480值为此16GSD卡的字节内存空间;


执行命令

图片来源于SD卡V2.0使用手册

在这里插入图片描述

SDSC卡 (0~2G,包含2G)是以字节位单位擦除;

ERASE_WR_BLK_START和ERASE_WR_BLK_END是以字节位单位的物理地址;

地址范围:[ERASE_WR_BLK_START,ERASE_WR_BLK_END] == [0,0x001FFFFF]


SDHC卡(2-32G,包括32G)以块为单位进行擦除(固定为512字节);

ERASE_WR_BLK_START和ERASE_WR_BLK_END是以字节位单位的块物理地址;

地址范围: ERASE_WR_BLK_START,ERASE_WR_BLK_END] == [0,0x01FF FFFF];(16G);

4G: [0,0xFFFF FFFF]

8G: [0,0x00FF FFFF‬]

32G: [0,0x03FF FFFF]

当然上面这都是理论值;实际值是以 15707668480字节为基准的 [0,0x01D41FFF],这里的这个实际也是本文讨论的重点;


相关代码如下

代码是移植于STM32的SD卡例程


/**

  * @brief  Allows to erase memory Block area specified for the given card.

  * @param  Block_startaddr: Sets the address of the first write block to be erased.

  * @param  Block_endaddr: Sets the address of the last write block of the continuous range to be erased.

  * @retval SD_Error: SD Card Error code.

  *注意:参数里的起始地址和中止地址都是以块地址为单位;可以擦除整个16G空间;

这里有几个值一定要特别注意:

0x01D42000是我的16G的SD卡,以512字节位块单位,状态寄存器返回的内存空间大小,但是这个值并不能作为擦除空间的endaddr;

0x01D3E000是电脑显示的16GSD卡的以512字节位块单位的地址空间,可以作为endaddr;

0x0x01D41FFF才是能作为最终endaddr的值;

  */

SD_Error SD_Block_Erase(uint32_t Block_startaddr, uint32_t Block_endaddr)

{

  SD_Error errorstatus = SD_OK;

  uint32_t delay = 0;

  __IO uint32_t maxdelay = 0;

  uint8_t cardstate = 0;


  /*!< Check if the card coomnd class supports erase command */

  if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0)   //0x00000020

  {

    errorstatus = SD_REQUEST_NOT_APPLICABLE;

    return(errorstatus);

  }


  maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2);


  if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)

  {

    errorstatus = SD_LOCK_UNLOCK_FAILED;

    return(errorstatus);

  }

  /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */

  if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))

  {

    /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr  */

    SDIO_CmdInitStructure.SDIO_Argument = Block_startaddr;

    SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START;

    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

    SDIO_SendCommand(&SDIO_CmdInitStructure);


    errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START);

    if (errorstatus != SD_OK)

    {

      return(errorstatus);

    }


    /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr  */

    SDIO_CmdInitStructure.SDIO_Argument = Block_endaddr;

    SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END;

    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

    SDIO_SendCommand(&SDIO_CmdInitStructure);


    errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END);

    if (errorstatus != SD_OK)

    {

      return(errorstatus);

    }

  }


  /*!< Send CMD38 ERASE */

  SDIO_CmdInitStructure.SDIO_Argument = 0;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);


  errorstatus = CmdResp1Error(SD_CMD_ERASE);


  if (errorstatus != SD_OK)

  {

    return(errorstatus);

  }


  for (delay = 0; delay < maxdelay; delay++)

  {}


  /*!< Wait till the card is in programming state */

  errorstatus = IsCardProgramming(&cardstate);


  while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate)))

  {

    errorstatus = IsCardProgramming(&cardstate);

  }


  return(errorstatus);

}

推荐阅读

史海拾趣

Britool Expert公司的发展小趣事

撰写5个关于电子行业里Britool Expert公司发展起来的相关故事,每个故事字数至少500字,可能内容过多,我可以为您提供1个故事的示例,如果需要更多故事,您可以在之后输入继续。


Britool Expert公司的发展故事之一:技术创新的突破

在电子行业的激烈竞争中,Britool Expert公司以其独特的技术创新策略脱颖而出。公司创立之初,就明确了以技术研发为核心的发展道路。在一次关键的技术研讨会上,公司的研发团队提出了一个前所未有的想法——开发一种新型的高效能芯片。

这个想法在当时看来极具挑战性,但团队成员们凭借着对技术的热爱和对市场的敏锐洞察,决心将这个想法变为现实。经过数月的艰苦努力,团队终于攻克了技术难关,成功研发出了这款芯片。这款芯片不仅性能卓越,而且成本大大降低,迅速在市场上获得了广泛的认可。

这一技术创新的突破,为Britool Expert公司打开了新的发展空间。公司借此机会,不断扩大生产规模,优化产品结构,逐渐在电子行业中树立了良好的口碑。随着技术的不断进步和市场的不断扩大,Britool Expert公司逐渐成为了电子行业中的佼佼者。

这个故事只是Britool Expert公司发展历程中的一个缩影。在公司的成长过程中,还有许多类似的技术创新故事。正是这些故事,构成了Britool Expert公司不断发展壮大的坚实基石。


若您想要探索更多内容,随时可以继续输入。

酷宅(Coolkit)公司的发展小趣事

酷宅科技在创业之初就意识到了海外市场的重要性。因此,公司将自己的服务部署在亚马逊的AWS云上,并针对AWS Alexa for Business、Google Home等主流智能音箱平台进行了深度优化。这一战略使酷宅科技的产品能够更好地适应海外市场的需求,提高其品牌在国际市场的竞争力。同时,酷宅还积极参加国际展览和论坛,与全球合作伙伴建立广泛的联系,进一步推动其国际化战略的实施。

ANYSOLAR LTD.公司的发展小趣事

ANYSOLAR深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进高端人才,建立完善的研发体系。通过持续的技术创新,ANYSOLAR不断推出性能更优、成本更低的光伏产品,引领着行业的发展潮流。

同时,ANYSOLAR还积极参与行业标准的制定和修订工作,推动整个行业的规范化发展。这些举措不仅提升了ANYSOLAR在行业内的地位,也为公司的长期发展奠定了坚实的基础。

Helium_Systems__Inc.公司的发展小趣事

随着市场竞争的加剧,海曼电子意识到仅凭自身力量难以快速实现跨越式发展。因此,公司开始积极寻求与行业内外的合作伙伴建立战略合作关系。通过技术共享、市场互补等方式,海曼电子不仅提升了自身的竞争力,还成功进入了多个新的市场领域。此外,公司还通过并购具有核心技术和市场资源的中小企业,进一步巩固了其在电子行业的地位。

FARNELL公司的发展小趣事

近年来,随着电子行业的不断发展壮大,FARNELL公司也开始向多元化方向发展。除了电子元器件分销业务外,公司还涉足了工业自动化、智能制造等领域。这种多元化的发展战略使FARNELL公司的业务范围更加广泛,也为公司带来了新的发展机遇。

以上五个故事概述了FARNELL公司在电子行业中的发展历程和主要成就。这些故事展示了FARNELL公司不断创新、积极应对市场挑战的精神以及其在电子行业中的重要地位。

驰芯微(CHIPWISE)公司的发展小趣事

在发展过程中,驰芯微公司成功完成了多轮融资,为公司的发展提供了强有力的资金支持。这些资金主要用于车规级传感和控制类芯片的系列化业务以及新能源电池管理系统汽车电子系统一站式车规级芯片套片解决方案的研发和推广。未来,驰芯微将继续加大在技术研发和产品创新方面的投入力度,致力于成为国际领先的汽车电子芯片供应商。同时,公司还将积极拓展海外市场,提升品牌知名度和影响力。

以上五个故事框架分别围绕驰芯微公司的初创历程、技术突破、面对“芯片限制”的机遇与挑战、与明然科技的合作以及融资与未来规划等方面进行了描述。这些故事展示了驰芯微在电子行业中的发展历程和取得的成就,同时也揭示了公司未来的发展方向和目标。

问答坊 | AI 解惑

急需!!! 汽车电子方案!!!

急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...…

查看全部问答>

【藏书阁】最新低压开关柜二次线路设计安装准实务全书

目 录 第一篇 低压开关柜二次线路的设计安装、 运行维护总论 ( ) ………………… 第一章 配电网络和配电设备概述 ( ) ………………………………………………… 第二章 配电变压器的设计安装、 运行维护 ( ) …………………………………… ...…

查看全部问答>

TI关于DC-DC电源芯片有哪些呀

TI关于DC-DC电源芯片有哪些呀 还能提供一些完整的资料吗    集思广益 谢谢大家…

查看全部问答>

问大家关于串口通讯的问题

我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊…

查看全部问答>

急,coredll.dll 这个文件无法找到。。。

请问各位 coredll.dll 这个文件是发在哪个里面,搜遍了整个硬盘也无法找到。。。 急啊。…

查看全部问答>

就我个人经历,大家在无线选型上常会有的一些误区:

就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS,    但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...…

查看全部问答>

急需熟悉uCOS的高手,有报酬

所在公司的一个项目,比较类似于手持gps。 大致上硬件环境就是FPGA的开发板,Altera的2c系列,采用nios的软核cpu。 开发环境就是NIOSII 6.1,c语言。 具体要实现的具体功能已经部分有一些代码,测试功能用。 现在想加操作系统,需要高手帮忙。 ...…

查看全部问答>

请教电子锁问题

想用51做一个电子锁,但是不知道怎么做。希望各位大虾给些思路,最好附上电路图什么的。。…

查看全部问答>

请教144脚FSMC的问题

我现在要接2片8位的SRAM,没有其他用外总线的器件,请问我现在的接法对不对 CPU                  SRAM1 D0-D7              ...…

查看全部问答>

【论文】基于zigbee的无线红外防盗报警系统设计

内容摘要: 结合红外防盗报警和ZigBee技术这两大热点课题,利用TI公司的单芯片CC2430和RE200B红外传感器,完成了基于ZigBee技术无线红外防盗报警系统的硬件设计和软件开发,解决了现有无线报警系统存在的误报警,成本高等问题。经过对系统的硬件软件电 ...…

查看全部问答>