打印
[应用相关]

SDIO例程中SD_ReadBlock函数始终返回SD_RX_OVERRUN问题

[复制链接]
5029|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smile_mark|  楼主 | 2008-12-28 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  是从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);来清除标志,执行后依然无法读出,实在搞不明白,还请高人指点指点,谢谢
沙发
sonicll| | 2008-12-29 11:33 | 只看该作者

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

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

使用特权

评论回复
板凳
smile_mark|  楼主 | 2008-12-29 14:09 | 只看该作者

谢谢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)。
    

使用特权

评论回复
地板
smile_mark|  楼主 | 2008-12-29 14:11 | 只看该作者

我是这样测试耗时的

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);
不知道这样计时是否准确?

使用特权

评论回复
5
smile_mark|  楼主 | 2008-12-29 14:19 | 只看该作者

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

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

使用特权

评论回复
6
sonicll| | 2008-12-29 18:02 | 只看该作者

我的板子上没有问题

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

使用特权

评论回复
7
smile_mark|  楼主 | 2008-12-29 19:14 | 只看该作者

下午又继续试验

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

使用特权

评论回复
8
ijk| | 2008-12-30 09:31 | 只看该作者

交换项目

  互相交换软件项目试试看,失败或许是因为硬件的问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

9

帖子

0

粉丝