stm32 3.5固件库带sdio版本V4.5.0 bug修改

发布者:数字翻飞最新更新时间:2020-03-30 来源: eefocus关键字:stm32  固件库  sdio版本  bug修改 手机看文章 扫描二维码
随时随地手机看文章

写的很详细

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大小,只要初始化的时候设置一次就可以了。

关键字:stm32  固件库  sdio版本  bug修改 引用地址:stm32 3.5固件库带sdio版本V4.5.0 bug修改

上一篇:STM32F20x系列CPU晶振起振波形
下一篇:STM32指针使用

推荐阅读最新更新时间:2024-11-17 15:39

5G时代迫在眉睫!高通展示多项技术与产品创新成果
不出意外的话,2019 年便将迎来 5G 的真正商用!而在 2018 年这个关键年份,高通在 5G 领域延续了上一年的迅猛发展势头,仅 2 月份便已宣布多个与 5G 有关的好消息。 2 月 8 日,诺基亚和高通完成 5G 新空口网络及终端关键基础测试;同日,高通宣布 5G 新空口(NR)调制解调器系列已被全球 20 家移动终端厂商(包括OPPO、vivo、小米、一加和中兴通讯在内的中国厂商)采用,高通 骁龙 X50 5G 调制解调器也被全球 18 家无线网络运营商(包括三大运营商中国电信、中国移动、中国联通)选中; 2 月 14 日,高通演示了面向下一阶段全球 5G 新空口(5G NR)标准的多项先进 5G 技术(目
[半导体设计/制造]
意法半导体(ST)推出最新STM32 ARM Cortex-M0微控制器STM32F091
意法半导体(STMicroelectronics,简称ST)最新的STM32F091 ARM Cortex-M0微控制器,克服了目前定位在经济型应用的同类产品的限制,可提供大容量片上存储器和多达8通用同步/异步串行接收/发送器 (USART, Universal Synchronous/Asynchronous Receiver/Transmitter),为车载音响或三相电表等应用节省多路复用通信端口。 STM32F091微控制器单片集成最高256KB的闪存和32KB的SRAM存储器,足以实现Java堆栈,能够运行通常只有大存储容量或昂贵产品才能运行的复杂应用软件,带来令人满意的用户体验。全系列产品(包括经济型48引脚微控制器
[单片机]
STM32学习笔记之USB虚拟串口描述符简介
Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是通过如问答节中的命令***作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,要好好掌握。标准的描述符有5种,USB为这些描述符定义了编号: 1——设备描述符 2——配置描述符 3——字符描述符 4——接口描述符 5——端点描述符 上面的描述符之间有一定的关系,一个设备只
[单片机]
STM32入门开发:编写XPT2046电阻触摸屏驱动(模拟SPI)
一、环境介绍 单片机采用: STM32F103ZET6 编程软件: keil5 编程语言: C语言 编程风格: 寄存器开发. 目标芯片: XPT2046---标准SPI接口时序 二、XPT2046芯片介绍 2.1 功能 XPT2046是一颗12位的ADC芯片,可以当做普通的ADC芯片使用,但是一般都是用在电阻触摸屏上,方便定位触摸屏坐标。 图1: XPT2046内部原理图 图2:电阻触摸屏---引出的4条线就接在XPT2046的YNXNYPXP上 (XPT2046支持笔中断输出--低电平有效,这个引脚可以配置到单片机的中断脚上,或者轮询判断这个引脚状态,判断触摸屏是否已经按下) 可以单独买一个触
[单片机]
<font color='red'>STM32</font>入门开发:编写XPT2046电阻触摸屏驱动(模拟SPI)
STM32——MDK4与MDK5中设置系统各部分时钟对比
/******************************************************************************* * 函数名 : RCC_Configuration * 函数描述 : 在MDK4中设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */
[单片机]
惠瑞捷V93000 HSM GDDR5解决方案获韩国大型客户青睐
加州CUPERTINO,2011 年6月22日-首屈一指的半导体测试公司惠瑞捷(Verigy)(那斯达克指数代码:VRGY)今日宣布其V93000 高速记忆体(HSM)平台已赢得庞大且领先市场的韩国客户之新款GDDR5 量产测试业务。 惠瑞捷V93000 HSM6800是一款为当今运行速度超过每接脚4 Gbps GDDR5超快图像记忆体元件提供服务的全速高产能记忆体自动测试设备。客户选择V93000 HSM6800是因为其领先业界高达8Gbps之速度余量(speed headroom)的高速终端测试性能、已获证实的较高产能,以及超越其他市场上高速记忆体测试系统的良率。 惠瑞捷SOC 测试执行副总裁Hans-Juer
[半导体设计/制造]
5-基于51单片机的仓库三路温度检测调节系统设计
具体实现功能 具体功能: 1、采用三个DS18B20温度传感器测温并用LCD1602显示三个温度值,并显示三路温度平均值; 2、按键为设置按键、加键和减键,可设置上下限温度控制范围; 3、当平均温度值超过设定的上或下限时,相应的指示灯亮,同时相应的继电器吸合,继电器可以驱动负载工作; 4、当平均温度值超过设定的上限时,继电器吸合,风扇转动表示降温; 5、当平均温度值低于设定的下限时,继电器吸合,加热膜工作表示升温。 单片机介绍 51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多
[单片机]
<font color='red'>5</font>-基于51单片机的仓库三路温度检测调节系统设计
贵州志喜3、4价硫酸盐酸双酸钒电解液制备技术研究入选遵义市2024年拟立项科技计划项目
  10月18日,遵义市工业和科学技术局公示2024年拟立项科技计划项目。其中,3、4价硫酸盐酸双酸钒电解液制备技术研究由贵州志喜科技有限公司承担。   以下为原文 遵义市2024年拟立项科技计划项目公示   经市工业和科学技术局研究同意,现对遵义市2024年拟立项科技计划项目(见附件)予以公示,公示期从2024年10月18日-2024年10月24日。   公示期内,如有异议,请拨打电话0851-27613265反映。   附件:遵义市2024年拟立项科技计划项目公示清单 遵义市工业和科学技术局 2024年10月18日
[新能源]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved