历史上的今天
返回首页

历史上的今天

今天是:2025年03月30日(星期日)

正在发生

2020年03月30日 | stm32 3.5固件库带sdio版本V4.5.0 bug修改

2020-03-30 来源:eefocus

写的很详细

1:SD_WaitReadOperation()函数或者SD_WaitWriteOperation()函数进入死循环

原因:数据传输错误导致传输中断,无法满足退出等待的判断条件。

代码分析:

SD_Error SD_WaitReadOperation(void)
{
  SD_Error errorstatus = SD_OK;

  while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK))
  {}

  if (TransferError != SD_OK)
  {
    return(TransferError);
  }

  return(errorstatus);
}

代码中用了while()是导致死循环的原因。TransferEnd ,TransferError 这两个参数是在中断中修改的, SD_DMAEndOfTransferStatus() 的结束条件是DMA传输结束。

看中断例程:

SD_Error SD_ProcessIRQSrc(void)
{
  if (StopCondition == 1)
  {
    SDIO->ARG = 0x0;
    SDIO->CMD = 0x44C;
    TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);
  }
  else
  {
    TransferError = SD_OK;
  }
  SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
  SDIO_ITConfig(SDIO_IT_DATAEND, DISABLE);
  TransferEnd = 1;
  return(TransferError);
}

中断配置为数据传输结束中断SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);

数据传输出错导致传输中断的情况下,SD_DMAEndOfTransferStatus的判断为false,TransferEnd 和TransferError 的状态也不会改变,导致while循环无法退出。

解决:

中断配置为SDIO_ITConfig(SDIO_IT_RXOVERR|SDIO_IT_DTIMEOUT|SDIO_IT_DCRCFAIL|SDIO_IT_DATAEND, ENABLE);

中断例程修改:

SD_Error SD_ProcessIRQSrc(void)
{
if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  TransferError = SD_DATA_TIMEOUT;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  TransferError = SD_DATA_CRC_FAIL;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  TransferError = SD_RX_OVERRUN;
}
else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
{
  SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  TransferError = SD_START_BIT_ERR;
}
else
{
  if (StopCondition == 1)
  {
  SDIO->ARG = 0x0;
  SDIO->CMD = 0x44C;
  TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);
  }
  else
  {
  TransferError = SD_OK;
  }
}
  
  SDIO_ITConfig(SDIO_IT_RXOVERR|SDIO_IT_DTIMEOUT|SDIO_IT_DCRCFAIL|SDIO_IT_DATAEND, DISABLE);
  TransferEnd = 1;
  return(TransferError);
}

这么做的作用是发生错误时也会进入中断,即使dma没有结束,也能退出while循环。



2:sd_init()过程失败

可能性1:按照SD规范,初始化之前需要有74个或更多个clock让sd卡同步,例程中把clock开起来后直接发送cmd0,没有同步clock,所以先修改SD_PowerON函数内SDIO_ClockCmd(ENABLE);调用之后增加200us延时。

可能性2:发生SDIO_FLAG_DCRCFAIL错误。

修改SDIO_TRANSFER_CLK_DIV 来修改数据传输速率。

按照ST例程的注释,数据传输速率不能超过25M,但是原先配置SDIO_TRANSFER_CLK_DIV=0,按照72M主频计算的话传输速度达到72/2=36M,不出错就怪了。

我现在配置SDIO_TRANSFER_CLK_DIV=2后正常。

可能性3:固件库使用不正确。使用V4.5的例程,固件库需要用V3.5.0的,试过3.2的固件库会失败。



3:SD_DMAEndOfTransferStatus函数内没有清标志位,按照datasheet,标志位是由手动清除的。

4:SD_ReadBlock()发生SDIO_FLAG_DCRCFAIL错误。

一开始是实践发现,先执行一下SD_ReadMultiBlocks函数,以后再执行SD_ReadBlock就正常了。很奇怪的现象吧。后来查阅了一些资料,发现SD卡的block大小并不是固定的,可以配置为512,1024等,于是怀疑是block大小配置不正确导致。检查发现SD_ReadBlock操作之前没有设置sd卡block大小,也就是cmd16,加入这个代码就像行了

  /*!< Set Block Size for Card */
  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
  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_SET_BLOCKLEN);

  if (SD_OK != errorstatus)
  {
    return(errorstatus);
  }

其实这个操作并不是每次读操作都要执行的,如果中途不改变block大小,只要初始化的时候设置一次就可以了。

推荐阅读

史海拾趣

GPD Optoelectronics Corp公司的发展小趣事

GPD Optoelectronics Corp公司发展故事

故事一:初创与锗晶体管的诞生

GPD Optoelectronics Corp.(前身为Germanium Power Devices Corp.)成立于1973年,最初专注于高品质锗晶体管的制造。在那个半导体技术刚刚起步的年代,锗晶体管作为重要的电子元件,在电子行业中占据着举足轻重的地位。公司凭借其精湛的工艺和严格的质量控制,迅速在市场中站稳了脚跟,为后续的光电二极管业务打下了坚实的基础。

故事二:转型为光电二极管制造商

进入1980年代,随着光电技术的快速发展,GPD Optoelectronics Corp.敏锐地捕捉到了市场趋势,开始逐步转型为光电二极管制造商。1980年,公司成功推出了Ge pn探测器产品,标志着其正式进入光电领域。这一转型不仅拓宽了公司的业务范围,也为其后续在光电领域的深入发展奠定了技术基础。

故事三:InGaAs探测器的研发与推广

为了进一步满足市场对高性能光电探测器的需求,GPD Optoelectronics Corp.在1993年推出了InGaAs探测器产品。InGaAs探测器以其优异的光谱响应范围和灵敏度,在光通信、光谱学等领域得到了广泛应用。公司的这一举措不仅巩固了其在光电领域的领先地位,也为其赢得了更多客户的青睐。

故事四:产能扩大与技术创新

进入21世纪,GPD Optoelectronics Corp.继续保持着强劲的发展势头。2000年,公司搬迁至新罕布什尔州塞勒姆的新工厂,产能实现了翻倍增长。同时,公司不断加大研发投入,推出了多款创新产品,如扩展波长InGaAs探测器、可定制的双色探测器以及InGaAs象限光电二极管等。这些产品的推出不仅丰富了公司的产品线,也进一步提升了其市场竞争力。

故事五:表面贴装封装选项的引入

随着电子产品的不断小型化和集成化,GPD Optoelectronics Corp.紧跟市场趋势,于2019年增加了表面贴装封装选项。这一举措使得公司的光电二极管产品更加符合现代电子产品的设计要求,进一步拓宽了其在智能手机、平板电脑等消费电子领域的应用市场。同时,公司也继续致力于为客户提供量身定制的定制零件服务,以满足不同客户的特定需求。

Connector City公司的发展小趣事

随着全球环保意识的不断提高,电子行业对绿色环保的要求也越来越高。Connector City公司积极响应国家环保政策,加强了对生产过程的环保管理。公司引进了先进的环保设备和技术,减少了生产过程中的废弃物排放和能源消耗。同时,公司还注重产品的环保性能设计,推出了多款符合环保标准的新型连接器产品。通过坚持绿色环保和可持续发展理念,公司赢得了社会的广泛赞誉和支持。

这五个故事仅是对Connector City公司可能发展路径的一种虚构描述,实际情况可能因市场变化、公司策略调整等多种因素而有所不同。在实际发展中,公司需要根据自身情况和市场环境做出灵活的调整和决策。

ELEKTRO-PLAST NASIELSK公司的发展小趣事

随着环保意识的提高和可持续发展理念的普及,电子行业对环保要求也越来越高。ELEKTRO-PLAST NASIELSK公司积极响应这一趋势,将绿色环保理念贯穿于产品研发和生产过程中。公司采用环保材料和工艺生产产品,并推动供应链中的合作伙伴共同践行环保理念。此外,公司还积极推广可回收利用和循环再生的理念,为保护环境做出了积极贡献。

成都振芯/国腾(CORPRO)公司的发展小趣事

2003年,成都国腾微电子有限公司(后更名为成都振芯科技股份有限公司)正式成立,标志着CORPRO的起点。公司由成都国腾电子集团投资设立,创始人团队汇聚了来自中国物资储运集团、电子科技大学等单位的精英。在成立之初,CORPRO就致力于集成电路、微波组件及相关电子器件的设计、开发与销售,奠定了其在电子行业的基础。

Cotco公司的发展小趣事

面对电子行业日新月异的变化和不断涌现的新挑战,Cotco公司始终保持敏锐的市场触觉和应变能力。公司及时调整战略方向,加大在新兴领域如物联网、智能家居等的投入和研发力度。同时,Cotco也积极拓展国际市场,与全球多个国家和地区的合作伙伴建立合作关系,推动产品的全球化销售和服务。展望未来,Cotco将继续秉承创新、质量和服务的理念,致力于成为全球电子行业的佼佼者。

DIPTRONICS MANUFACTURING INC公司的发展小趣事

圜达实业于1985年在台湾新北市创立,创始人凭借对电子开关行业的深刻理解和前瞻视野,决定专注于研发制造各类程序开关、触动开关等产品。公司初创时期面临资金短缺、市场竞争激烈等挑战,但创始人凭借坚定的信念和不懈的努力,逐步在市场上站稳脚跟。

问答坊 | AI 解惑

MCF52233_CFM

MCF52233_CFM—Coldfire Flash Module   Coldfire的CFM功能是把它的flash当作EEPROM来用。使用起来还是很方便的,只要完成几个小的功能函数就行了:  第一个是CFM的初始化CFM_init(),完成时钟的设置;   第二个是页擦除CFM_Page_eraser(), ...…

查看全部问答>

终身受益啊,手机原来隐藏了这么多功能!

1、隐形的备用电池 你的手机电量不足了,为了让它能够继续使用,按*3370#键,手机会重新启动,启动完毕后,你就会发现电量增加了50%。这部分隐藏的备用电量 用完了你就必须得充电了,再次充电的时候,隐形的备用电池也同时充电,下次电量低的时候 ...…

查看全部问答>

st7单片机

没有人用过ST7的单片机么? 为什么我在网上找不到一点关于意法半导体的资料 有谁有资料,希望传个给我  谢谢 或者告诉网址 要中文的…

查看全部问答>

开关电源中高频磁性元件设计常见错误概念辨析

【转帖】作者:冷昭军 现任深圳茂硕电源科技股份有限公司 电源开发工程师 很多电源工程师对开关电源中高频磁性元件的设计存在错误的概念,其设计出来的高频磁性元件不能满足应用场合的要求,影响了研发的进度和项目的按期完成。基 于开关电源及 ...…

查看全部问答>

初学单片机应该买个什么学习板

本人是个单片机初学者,想要买个学习板,深入学习单片机,加强实际操作能力,请问我应该购买哪款学习板? 最好适合初学者,有视频和教程更好)…

查看全部问答>

CE webbrowser控件

我用的软件是EVC4.0,我创建了Dialog base对话框或者Single document,在控件栏中都没有webbrowser控件。 请问是要怎么样才能加上去呢?…

查看全部问答>

Proteus仿真cpu过载

程序也不大,电路图也不复杂,就是数码管动态显示,用中断搞了一个表,结果mcu的clock设置11.0592MHz时,就过载了,设成300KHz就还可以,可是毕竟是个表啊,查Proteus的帮助说把电阻什么的都数字化,可是还是不行,版本v7.1,求教,谢谢!…

查看全部问答>

ISE11.1使用出现问题

刚装了ISE11.1    安装过程顺利,能打开软件,不过在调试正确的程序源文件时总是不能综合完成,也没有任何错误。只是最后显示                Process \"Synthesis\" failed  &n ...…

查看全部问答>

问一下,想找AC电源,400v输出的,有哪种

谁能告诉我呢   问一下,想找AC电源,400v输出的,有哪种?…

查看全部问答>

二选一开关

设计以芯片内部要一个二选一和四选一开关,哪位大神指导一下…

查看全部问答>