历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2018年12月26日 | STM32笔记--SDIO(SD卡读取)

2018-12-26 来源:eefocus

学习这里首先要了解一下SD卡基本资料:




SD卡的协议部分太多,也比较复杂,建议资料:《Simplified_Physical_Layer_Spec.pdf》其主要复杂在繁多的命令,一共有64个命令,各个命令代表什么可查资料。




关于这里大部分都是熟悉函数然后直接调用库就行,但还是需要每个函数都去读一下的,后面会有具体函数的使用实例,到时候再补充。


我们代码中一般用到的是ARM官方给的SD卡的库,但是库中存在问题,SD_Error SD_ReadBlock()缺少代码:(有标注,可直接替换)


SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize)

{

  SD_Error errorstatus = SD_OK;

#if defined (SD_POLLING_MODE) 

  uint32_t count = 0, *tempbuff = (uint32_t *)readbuff;

#endif

 

  TransferError = SD_OK;

  TransferEnd = 0; //传输结束标置位,在中断服务置1

  StopCondition = 0;  //怎么用的?

  

  SDIO->DCTRL = 0x0;

 

  

  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)

  {

    BlockSize = 512;

    ReadAddr /= 512;

  }

  /*******************add,没有这一段容易卡死在DMA检测中*************************************/

  /* Set Block Size for Card,cmd16,

* 若是sdsc卡,可以用来设置块大小,

* 若是sdhc卡,块大小为512字节,不受cmd16影响 

*/

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;   //r1

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);

 

  errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);

 

  if (SD_OK != errorstatus)

  {

    return(errorstatus);

  }

 /*********************************************************************************/

  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;

  SDIO_DataInitStructure.SDIO_DataLength = BlockSize;

  SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4;

  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;

  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;

  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;

  SDIO_DataConfig(&SDIO_DataInitStructure);

 

  /*!< Send CMD17 READ_SINGLE_BLOCK */

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)ReadAddr;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_SINGLE_BLOCK;

  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_READ_SINGLE_BLOCK);

 

  if (errorstatus != SD_OK)

  {

    return(errorstatus);

  }

 

#if defined (SD_POLLING_MODE)  

  /*!< In case of single block transfer, no need of stop transfer at all.*/

  /*!< Polling mode */

  while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))

  {

    if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)

    {

      for (count = 0; count < 8; count++)

      {

        *(tempbuff + count) = SDIO_ReadData();

      }

      tempbuff += 8;

    }

  }

 

  if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)

  {

    SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);

    errorstatus = SD_DATA_TIMEOUT;

    return(errorstatus);

  }

  else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)

  {

    SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);

    errorstatus = SD_DATA_CRC_FAIL;

    return(errorstatus);

  }

  else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)

  {

    SDIO_ClearFlag(SDIO_FLAG_RXOVERR);

    errorstatus = SD_RX_OVERRUN;

    return(errorstatus);

  }

  else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)

  {

    SDIO_ClearFlag(SDIO_FLAG_STBITERR);

    errorstatus = SD_START_BIT_ERR;

    return(errorstatus);

  }

  while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)

  {

    *tempbuff = SDIO_ReadData();

    tempbuff++;

  }

  

  /*!< Clear all the static flags */

  SDIO_ClearFlag(SDIO_STATIC_FLAGS);

 

#elif defined (SD_DMA_MODE)

    SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);

    SDIO_DMACmd(ENABLE);

    SD_DMA_RxConfig((uint32_t *)readbuff, BlockSize);

#endif

 

  return(errorstatus);

}

推荐阅读

史海拾趣

Hsuan Mao Technology Co公司的发展小趣事

Hong Kong X'Tals Ltd在电子行业的发展故事

故事一:精密时间与频率产品的创新之路

Hong Kong X'Tals Ltd(简称HKC)自1991年成立以来,一直致力于精密时间和频率产品的研发与生产。公司最引人注目的成就是其KSTAR系列全球导航卫星系统(GNSS)驯服振荡器(GNSSDO)的推出。这款新产品不仅接收来自北斗、GPS、GLONASS和GALILEO等多卫星系统的信号,还具备高灵敏度和低噪声的特点,长期频率稳定性优于1E-12。KSTAR系列GNSSDO的推出,标志着HKC在通讯、自动驾驶、能源和金融等领域的时间同步解决方案上达到了国际领先水平。这一创新不仅增强了公司在全球市场的竞争力,也为众多行业客户提供了更加精准和可靠的时间同步服务。

故事二:从石英晶体到国际市场的跨越

HKC的母公司Kolinker Industrial Equipments Ltd拥有超过13年的中国晶体行业经验,并在深圳设立了首家中国本地的晶体工厂,该工厂荣获QS9000和ISO/TS16949认证。这一成就不仅体现了HKC在晶体制造领域的专业实力,也为其产品打入国际市场奠定了坚实的基础。HKC凭借其高质量的石英晶体产品,成功进入东欧、日本、韩国、中国大陆、北美、台湾和西欧等市场,成为国际市场上备受瞩目的晶体产品供应商。

故事三:技术研发与产品多元化的并行发展

HKC深知技术研发对于企业发展的重要性,因此不断加大在研发领域的投入。公司不仅专注于晶体、谐振器和振荡器的研发与生产,还积极拓展产品线,推出了一系列满足不同行业需求的电子产品。例如,在工业自动化领域,HKC设计并制造了多款机电一体化设备,赢得了国内外众多知名家电制造商的青睐。此外,公司还涉足新能源行业,通过投资组建益阳晶鑫新能源科技实业有限公司,致力于多晶硅产业链的建设与发展。

故事四:品质管理与国际认证的双重保障

HKC始终将品质管理视为企业发展的生命线。公司早在2000年和2003年就分别通过了ISO9002 1994及ISO9001 2000质量管理体系认证,成为同行业中最具实力的公司之一。这一系列的国际认证不仅证明了HKC在品质管理方面的卓越表现,也为其赢得了国内外客户的广泛信赖。HKC始终坚持以客户为中心,不断提升产品品质和服务水平,努力成为电子行业的佼佼者。

故事五:全球化战略与本土化运营的有机结合

随着全球市场的不断扩大,HKC积极实施全球化战略,在全球多个地区设立分公司和生产基地。同时,公司也注重本土化运营,根据不同地区的市场特点和客户需求,提供定制化的产品和服务。例如,HKC在中国内地市场就设立了多家子公司和生产基地,通过深入了解本地市场需求和客户需求,不断优化产品结构和服务模式,赢得了中国市场的广泛认可。这种全球化战略与本土化运营的有机结合,为HKC的可持续发展提供了强有力的支撑。

Hanghsing Enterprise Co Ltd公司的发展小趣事

HANA Micron公司在电子行业的五个发展故事

故事一:2.5D封装技术的突破

HANA Micron,作为韩国顶尖的后端工艺和外包半导体组装测试(OSAT)公司,近年来在2.5D封装技术领域取得了显著进展。随着高性能人工智能(AI)芯片需求的急剧增长,该公司致力于开发一种能够水平组装不同类型AI芯片的封装技术,如高带宽内存(HBM)。这一技术对于生产像英伟达H100这样的顶级AI加速器至关重要。公司CEO Lee Dong-cheol表示,他们已将未来寄托在HBM和其他AI芯片的先进2.5D封装技术上,并透露公司已生产出原型,尽管全面商业化尚需时日。HANA Micron的这一努力不仅提升了其技术实力,也为公司在全球芯片封装市场的竞争中占据了有利位置。

故事二:越南市场的扩张

为了进一步扩大业务版图,HANA Micron在越南进行了大规模的投资。自2016年在越南北宁省成立公司进军东南亚市场以来,该公司已累计投资高达7000亿韩元(约合5.25亿美元)。其北江省云中工业园的2号制造工厂于2023年正式落成,标志着公司在越南半导体封装和测试领域迈出了重要一步。这一投资不仅提升了公司的产能,还为公司带来了更多的业务机会和市场份额。HANA Micron计划到2025年将月产量提高到2亿个,并预计越南业务的销售额将很快达到万亿韩元。

故事三:多元化产品线的拓展

除了在传统存储芯片封装领域保持领先地位外,HANA Micron还积极拓展多元化产品线。公司目前正在开发针对可穿戴设备和医疗设备的封装技术,以提高这些设备的灵活性和可靠性。这一项目的第一个成果是去年年底开发的针对医疗贴片的心电图传感器模块,该模块允许传感器的功率低于1mA,延迟低于5ms。这一创新不仅展示了公司在封装技术上的深厚积累,也为其在未来医疗和可穿戴设备市场中的发展奠定了坚实基础。

故事四:与国际巨头的合作与竞争

在电子行业的激烈竞争中,HANA Micron不仅与国内同行如三星、SK海力士等展开合作与竞争,还与国际巨头如台积电、英特尔等保持着紧密的联系。公司CEO Lee Dong-cheol透露,台积电已成功研发出英伟达H100的2.5D封装技术,而三星和SK海力士也在积极跟进。在这种背景下,HANA Micron不断加大研发投入,以确保自己在封装技术上的领先地位。同时,公司还通过与国际巨头的合作与交流,不断提升自身的技术水平和市场竞争力。

故事五:应对市场波动与未来展望

面对全球电子市场的波动和不确定性,HANA Micron展现出了较强的抗风险能力和市场适应能力。公司CEO Lee Dong-cheol表示,尽管过去几年存储市场有所放缓,但随着电子产品制造商和AI设备制造商对先进芯片需求的不断增长,预计2024年的业绩将有所改善。为了实现这一目标,公司将继续加大在研发、生产和市场拓展等方面的投入力度。同时,公司还计划将系统芯片的比例提高到50%以上,以降低市场波动对公司业绩的影响。这一战略调整不仅体现了公司对未来的信心和决心,也为公司的可持续发展奠定了坚实基础。

ET Enterprises Ltd公司的发展小趣事

ET Enterprises Ltd公司的历史可以追溯到1930年代,当时它作为EMI公司的一部分,开始涉足光检测技术领域。在这个早期阶段,公司致力于研究光信号的特性及其检测方法,为后续的光电倍增管技术奠定基础。

歌普(GEPU)公司的发展小趣事

进入1940年代后期,ET Enterprises Ltd公司将业务重心转向光电倍增管的开发和制造。通过不断的技术创新和市场拓展,公司逐渐在光电倍增管领域建立起领先地位,成为国际知名的光电倍增管供应商。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc深知人才是企业发展的核心。因此,公司一直注重人才培养和引进。公司不仅设立了专门的研发机构,吸引了大批优秀的科研人才,还定期组织员工培训和交流活动,提高团队的整体素质。这些措施使得Control Sciences Inc的团队越来越强大,为公司的发展提供了有力的人才保障。

Ferroxcube公司的发展小趣事

随着全球电子行业的竞争日益激烈,Ferroxcube公司意识到,要想保持领先地位,就必须不断创新。于是,公司决定投入巨资建立一个新的研发中心,专注于磁性元件的前沿技术研究。

研发中心的建立吸引了大批优秀的科研人才加入Ferroxcube。在新的研发团队的带领下,公司相继推出了多款具有自主知识产权的新型磁性元件,这些元件在性能、稳定性和可靠性方面都达到了行业领先水平。

其中一款名为“XX磁芯”的产品,凭借其超高的磁导率和极低的损耗,在市场上引起了轰动。这款产品不仅被广泛应用于各类电子设备中,还成为了许多高校和科研机构的研究对象。Ferroxcube因此成为了行业内技术创新的佼佼者。

问答坊 | AI 解惑

汽车涂装车间的计算机中央监控系统

近年来,基于计算机软硬件技术的自动化技术发展到了一个新的水平,并显现出了强劲的生命力和应用前景,可以肯定,基于计算机网络技术的自动控制技术将是今后一段时期的应用主流。 与西方发达国家相比,自动化技术在我国汽车行业的应用总体上处于起 ...…

查看全部问答>

快捷方式

这是CCS里面咱们最常用的。。。。…

查看全部问答>

从零开始

对于单片机还没有玩好的我来说已经开始工作了,到了工作单位才知道,现在单片机就像一个小孩子的玩具一样,根本不能算是一项技能,靠他吃饭,简直就是天方夜谭。也许你要问,什么能让生在一个压力强大的社会里混口饭吃,作为电子类专业出身的我们, ...…

查看全部问答>

开启PB5.0出错unable to initialize the catalog

最近我在acer笔记本上面安装了PB5.0。安装完成以后,一打开就跳出unable to initialize the catalog的错误对话框。然后再PB的主界面打开manager catalog item,里面什么都没有。也不能创建工程。 请问各位大侠,有没有遇到此问题的?谢谢 …

查看全部问答>

深圳地区承接与fpga相关的项目

本从现在有大量的空闲时间,现在承接与fpga相关的项目,欢迎有相关项目外包的人与我联系QQ:774615731,email:szfpga@gmail.com 项 目 经 验   2008/7--2009/2:国标地面数字电视(DMB-TH)调制器    软件环境: window xp ...…

查看全部问答>

学习51单片机的准备?

我想自学单片机,在网上看了下,都说不推荐买开发板,最好自己做,请问有什么教程或者书是从组建最小系统开始讲的? 还有要买些什么元件?我们学校这里不知道哪有电子市场,所以打算在网上一次买齐,求教需要哪些元件,还有数量。…

查看全部问答>

请问如何学习嵌入式

我现在是大一,什么都不懂,就学了个C还没学完,寒假我在论坛上看了很多,想确定一个目标,最后决定往嵌入式这方面发展,看中了驱动层人才少,想明确目标搞驱动层,我有信心,有干劲,但由于什么都不懂,无从下手,我觉得大学4年很快就过了,不想到 ...…

查看全部问答>

我的Usart3接收也僵住了

我用DMA发送和接收,如果设定Usart3接收30字节,我要连续给他发送超过30个字节,下次我再设定接收的时候无论如何都再也一个字节都接收不了了,查看各个DMA和串口相关寄存器的状态也都是打开的。但是发送依然是正常的。如果我每次接收完之后再 ...…

查看全部问答>

2430能直接驱动12864LCD吗

       我要用12864LCD显示一些2430的数据,就用了2430的IO口P1(接了上拉电阻)驱动LCD显示屏(型号:HJ12864ZW),采用的是串行连接方式,经示波器检测控制时序没有问题,可是显示屏就是对任何命令都没有响应,不 ...…

查看全部问答>

DSP在电能表中的应用

实时数字信号处理、超大规模集成电路技术的飞速发展,不断地推动着数字信号处理器性能的提高,使其在信号处理、军事及民用电子技术领域发挥着越来越重要的作用,其应用广度和深度也在不断地扩展和深化。数字信号处理相对于模拟信号处理有很大的优越 ...…

查看全部问答>