8968|7

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SDIO例程中SD_ReadBlock函数始终返回SD_RX_OVERRUN问题 [复制链接]

  是从ST的2.0.3版本的固件库,里面有个SDIO的示例程序,我用的是STM32F103VET6,MDK3.24
执行如下操作
Status = SD_Init();
Status = SD_GetCardInfo(&SDCardInfo);
Status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
Status = SD_SetDeviceMode(SD_POLLING_MODE);
Status = SD_ReadBlock(0x00, Buffer_Block_Rx, BlockSize);
是过了好多张SD卡,一直到SD_SetDeviceMode这里返回的状态都是SD_OK,可是
SD_ReadBlock却一直返回是SD_RX_OVERRUN(0x06)。无法读出数据
调试后发现SD_ReadBlock函数在发送完CMD17读一个块指令并得到正确响应之后,开始从SDIO数据通道读取数据,有下面的内容
if (DeviceMode == SD_POLLING_MODE)
  {
    /* 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;
      }
    }
在这个while循环之前SDIO_FLAG_RXOVERR 就已经一直是置位状态,所以导致数据无法读出,可是我在WHILE之前加SDIO_ClearFlag(SDIO_FLAG_RXOVERR);来清除标志,执行后依然无法读出,实在搞不明白,还请高人指点指点,谢谢
此帖出自stm32/stm8论坛

最新回复

                                   互相交换软件项目试试看,失败或许是因为硬件的问题。   详情 回复 发表于 2008-12-30 09:31
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

你是单步调试的还是全速运行的?

                                 你是单步调试的还是全速运行的?我以前全度运行没有问题,但是单步调试就会进入那个溢出中断,我的理解是,当发送读多块命令后,SD卡就不停的把数据往外发,卡是不等你的编译器的,单步调试的时候,程序虽然在你设的断点处停下来,但是SD卡的时钟好像没有停,所以就接收溢出了,不知道我理解的对不对
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

谢谢2楼的兄弟

   我都试过了,不是调试的问题,无论是单步调试还是直接执行,SD_ReadBlock函数返回的值都是SD_RX_OVERRUN(0X06)。今天试验的时候发现如果不执行
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
这句,即工作在一位SDIO方式下则SD_ReadBlock这些读写函数都操作正常,返回SD_OK,不过我试验了一下SD_ReadBlock读512字节的耗时(SDIO的时钟是24MHZ),竟然要18毫秒,用了DMA方式也是一样的!而我用以前的程序SPI方式同样SD_ReadBlock读512字节只需最多700微秒不到的时间。
    我试验了手头好几张卡,1G 2G 4G的都试过了,只要打开4BIT SDIO方式就会返回SD_RX_OVERRUN,而这些卡都是铁定可以支持4BIT方式的(PC上测试过读取速度超过10MB/S,如果是用一位传输的则最多也只有4MB/S)。
    
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

1

TA的资源

一粒金砂(初级)

4
 

我是这样测试耗时的

if (Status == SD_OK)
  {
    /* Read block of 512 bytes from address 0 */
      SysTick_CounterCmd(SysTick_Counter_Disable);
      SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//设置SYSTICK系统定时器时钟为72MHZ/8=9MHZ
      SysTick_SetReload(0x00FFFFFF);//
      SysTick_CounterCmd(SysTick_Counter_Enable);
      
    Status = SD_ReadBlock(0x00, Buffer_Block_Rx, BlockSize);
    printf("Interval Time = %duS ", (0x00FFFFFF-(SysTick->VAL))/9);
    printf("status=%8X ", Status);
不知道这样计时是否准确?
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 

2楼的兄弟不知道是否用4位方式试验成功?

                                     我的连接是参考ST官方评估板的电路图,在D0~D3 CMD这几个线上都加了47K的上拉电阻连接到VE相应的引脚的。实在搞不懂为什么4位方式就会返回SD_RX_OVERRUN,都是直接用的ST官方给的SDIO示例,怎么就会不行呢
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 

我的板子上没有问题

                                 用4线,DMA还是POLLING都没问题,读单块大约2ms的时间,我是用定时器大概测了下,你试试看改变一下读块的地址,我前一段试过不同地址,有些总是溢出,最近不知道怎么又正常了
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 

下午又继续试验

单线方式耗时应该是2毫秒以内,之前是由于SYSTICK->VAL没有置初值所以计算有误,单线方式应该是正常的。现在问题就是4线方式始终不正常,实在搞不明白是哪里问题
    开始用的是2.0.3固件SAMPLE里面的SDIO例程,后来又换成了2.0.1版本,依然如此。。。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 

交换项目

                                   互相交换软件项目试试看,失败或许是因为硬件的问题。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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