21ic电子技术开发论坛 单片机与嵌入式系统 ST MCU SDIO模式读写SD卡要注意的问题
发新帖我要提问
返回列表
打印

SDIO模式读写SD卡要注意的问题

[复制链接]
11060|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsx1983|  楼主 | 2008-9-6 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用ST提供的SDIO库函数读写SD卡老是不成功。
测试代码如下:
  while(SD_Init()!=SD_OK);
  SD_EnableWideBusOperation(SDIO_BusWide_4b);
  SD_SetDeviceMode(SD_POLLING_MODE);
  while(SD_ReadBlock(0,(u32 *)TestBuf,512)!=SD_OK); 

有调通过的高手能指点一下么?
调用SD_Init()之后是否还需要其它的操作才能正常读写SD卡,原来用SPI模式很好用,到SDIO模式之后死活读不出来。
沙发
香水城| | 2008-9-7 17:27 | 只看该作者

什么芯片?什么程序?

使用特权

评论回复
板凳
tsx1983|  楼主 | 2008-9-8 10:21 | 只看该作者

用的STM32F103ZET6

用的STM32F103ZET6,在MDK下编译。

使用特权

评论回复
地板
ijk| | 2008-9-8 10:55 | 只看该作者

SD卡不支持4位模式

  或许LS使用的SD卡不支持4位模式?
在调用  SD_EnableWideBusOperation(SDIO_BusWide_4b);
后SDIO 就工作在4位模式下了

使用特权

评论回复
5
tsx1983|  楼主 | 2008-9-8 11:18 | 只看该作者

应该支持4位

我跑过ST的Mass_Storage例程,可以正常格式化SD卡和建立删除文件。那个例程里就是这么干的。我只不过是从那个例程里把SD卡相关的两个文件提出来加进我自己的工程里,初始化都调用一样的函数。就是读写不成功。

不过在那个Mass_Storage例程里有个奇怪的现象,就是我在配置USB LED以前调用SD卡读写函数也不成功,只有把读写代码放到它之后才能读写成功。

使用特权

评论回复
6
ijk| | 2008-9-8 12:12 | 只看该作者

还有1点

  或许还有1点要注意:SDIO支持几种数据操作模式,即Polling、中断和DMA,记得是通过条件编译来选择的。
  LS不妨检查一下

使用特权

评论回复
7
tsx1983|  楼主 | 2008-9-10 12:50 | 只看该作者

我用的Polling模式

我跟它的例程一样,用的Polling模式啊

使用特权

评论回复
8
tsx1983|  楼主 | 2008-9-10 15:50 | 只看该作者

终于找着了

哈哈,终于让我找着原因了。哎,只怪自己太粗心了。

使用特权

评论回复
9
aguiddd| | 2008-9-17 16:07 | 只看该作者

SPI模式

楼主,有用SPI模式对SD卡进行读写吗?文件系统的创建?
谢谢了

使用特权

评论回复
10
tsx1983|  楼主 | 2008-9-18 09:36 | 只看该作者

有SPI模式下的读写

文件系统也有

使用特权

评论回复
11
aguiddd| | 2008-9-18 14:35 | 只看该作者

麻烦下

楼主,麻烦下能把SPI和文件系统创建的原代码共享下吗?
谢谢了
我搞这个头都大了
ding_hongbin@163.com

使用特权

评论回复
12
smile_mark| | 2008-12-28 23:09 | 只看该作者

我也遇到同样的问题,请问怎么解决的?

我也是从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);来清除标志,执行后依然无法读出,实在搞不明白,还请高人指点指点,谢谢

使用特权

评论回复
13
smile_mark| | 2008-12-28 23:17 | 只看该作者

从上周五开始遇到这个问题

一直没法解决,ST的手册写的实在是不清不楚,看了半天也不知所云,看了这么多厂商的资料,除了国内的,就属ST的资料写得最差了,之前用ATMEL,它的资料就写的很详细,有问题仔细看看就明白了,也不用到处去问。现在ST的很多地方都需要自己做实验去摸索,还好是例程够多,可以依样画葫芦,可是一碰到问题就傻眼了,唉~~~0

使用特权

评论回复
14
fugui| | 2013-10-9 15:02 | 只看该作者
您好!看过您这个帖子,我有个疑问:SD卡与STM32单片机的接口是如何做的呢?是用IO口模拟SD时序进行SDIO模式(4线)下的SD卡读写?

使用特权

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

本版积分规则

25

主题

160

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部