OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9885|回复: 7

SDIO读扇区死循环

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2012-9-18 14:20:13 | 显示全部楼层 |阅读模式

好久没上论坛了,最近遇到个问题解决不了,各位大神帮帮忙

SD_ReadBlock(u32 *SDBuffer,u32 block)
{
   SDIO->DCTRL|=1<<3;
 DMA2->IFCR|=0xFFFFFFF;
 DMA2_Channel4->CCR&=~0x1;
 DMA2_Channel4->CCR =(0<<14)|(3<<12)|(2<<10)|(2<<8)|(1<<7)|(0<<6)|(0<<5)|(0<<4);
 DMA2_Channel4->CNDTR =128;
 DMA2_Channel4->CPAR =0x40018080;
 DMA2_Channel4->CMAR =(u32)SDBuffer;
 DMA2_Channel4->CCR|=0x1;
    while (!(DMA2->ISR&(1<<13)))
    {
 }
 if(SDIO->STA&(1<<1))return 0;
 SDIO->ICR=0xFFFFFF;
 return 1;
}

SD_ReadOneBlock(u32 Page,u32 *SDBuffer)
{
 u8 errorstatus;
  SDIO->DTIMER=0xFFFFFF;
   SDIO->DLEN=512;
 SDIO->DCTRL&=~0xF;
 SDIO->DCTRL|=0x3;
 SDIO_SendCommand1(17,Page*512,Response_No);
 errorstatus = CmdError(1,17,0);
 if (errorstatus != 1)return(0);
  if(SD_ReadBlock(SDBuffer,1)!= 1)return 0;
  return 1;  
}

这个是读扇区函数,确定是死循环在  

while (!(DMA2->ISR&(1<<13)))
{
}

就是没有传输完成事件产生

 SDIO_init();
 aa=SD_ReadOneBlock(0,buffer);
 while(1)
 {
  times++;
  if(times%1000==0)
  {
   USART2->DR=aa;
   while((USART2->SR&0X40)==0);//等待发送结束
   USART_RX_STA=0; 
  }
  delay_ms(1); 
 } 

这个是主函数,像串口循环打印返回值,现象是没输出,死循环在扇区读取函数了,复位和初始化已经通过的

 

SDIO.rar

288.05 KB, 下载次数: 625

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-9-18 15:08:44 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-9-18 15:37:22 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
有的,SDIO_init()里面包括了SDIO初始化。卡复位,卡初始化,都有的,并且正确通过
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2012-9-18 16:26:25 | 显示全部楼层
楼主方便共享下源码吗?
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-9-18 17:54:04 | 显示全部楼层
回复【4楼】shibusha:
---------------------------------
已共享
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2012-9-18 19:24:42 | 显示全部楼层
回复【5楼】以枫之名:
---------------------------------
LZ共享的文件不对吧。。。。
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-9-18 22:08:42 | 显示全部楼层
死循环的问题解决了
SD_ReadOneBlock(u32 age,u32 *SDBuffer)
{
    u8 errorstatus;
    SDIO->DTIMER=0x000FFFFF;
    SDIO->DLEN=512;
    SDIO->DCTRL=(9<<4)|(0<<3)|(0<<2)|(1<<1)|(1) ;
    SDIO_SendCommand1(17,Page*512,Response_Short);
    errorstatus = CmdError(1,17,0);
    if (errorstatus != 1)return(0);
    if(SD_ReadBlock(SDBuffer,1)!= 1)return 0;
    return 1;
}

现在是读命令超时了
SDIO_SendCommand1(17,Page*512,Response_Short);
errorstatus = CmdError(1,17,0);
这个函数执行后,返回失败的结果,跟踪进去
status = SDIO->STA;
if (status & (1<<2))
{
SDIO->ICR|=1<<2;
return(0);
}
是SDIO->STA的第二位被置位,就是响应超时了,有人遇到过这样的情况么

回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2012-9-18 23:47:08 | 显示全部楼层
回复【7楼】以枫之名:
---------------------------------
感谢分享
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表