7289|5

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SDIO多扇区写入遇到的问题! [复制链接]

调试环境:万利STM32-E板 4G卡,使用 um0427文档的参考代码:
sdcard.c   V2.0.3   09/22/2008  MCD Application Team
SDIO 模式是 4bits DMA模式;

1. 连续多扇区写的时候遇到下列问题:

 如果使用SD_WriteMultiBlocks 会发生死机
 如果使用SD_ReadMultiBlocks 后在使用如果使用SD_WriteMultiBlocks 就会Ok
 我是利用 um0427文档的 Sample 试验的


  ... ...

  /*------------------- Block Erase -------------------------------*/
  if (Status == SD_OK)
  {
    /* Erase NumberOfBlocks Blocks of WRITE_BL_LEN(512 Bytes) */
     Status = SD_Erase(0x00, (BlockSize0 * NumberOfBlocks));
  }

  /* Set Device Transfer Mode to DMA */
  if (Status == SD_OK)
  {  
    Status = SD_SetDeviceMode(SD_DMA_MODE);
  }

  if (Status == SD_OK)
  {
    Status = SD_ReadMultiBlocks (8000*512, Buffer_MultiBlock_Rx, BlockSize0, NumberOfBlocks); // A
    Status = SD_WriteMultiBlocks(8000*512, Buffer_MultiBlock_Rx, BlockSize0, NumberOfBlocks); // B
  }
  // BlockSize0=512;      NumberOfBlocks=2;                         
  ... ...

  注意:如果去掉A语句,则B语句死机。AB同在运行不死;

  死机发生在DMA传送过程:

      DMA_TxConfiguration(writebuff, (NumberOfBlocks * BlockSize));
      while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET) {}       // 死循环



2. 该sdcard.c 对大容量SD卡的支持不够;
看其中的函数调用 SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16 BlockSize);
其中的addr是在字节访问SD卡中的数据地址,显然当SD卡的容量大于4G的时候,addr是越界的。
我将对此修改为SectAddr(扇区地址)。sdcard.c 中有很多类似的问题。


3. 在SD操作的时候CPU只能查询等待操作完成,效率有些低。
比如全片的擦除需要8秒,如何在此期间让CPU干点别的?如何修改代吗呢?
此帖出自stm32/stm8论坛

最新回复

                                 今天的实验情况和结果如下:1. 简化的一个SD_ReadBlock的过程,同时监测 SDIO->STA的状态;2. 如果是4b bus ,那么SDIO->STA的值一直保持为0x00000000,显然SDIO控制器没有反应。3. 如果是1b bus ,那么SDIO->STA的值会表现为FIFO有数据,可以读取这时候读SDIO->FIFO可以得到正确的数据。  结果表明:问题是出现在4b bus状态,和DMA,Polling ,interrupt mode 无关。一直保持为0x00000000,显然SDIO控制器没有反应。   详情 回复 发表于 2009-1-18 19:52
点赞 关注
 

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

经试验 POLLING_MODE 和 INTERRUPT_MODE 不会死机

                                  
此帖出自stm32/stm8论坛
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

这15日试验的结果

  经过反复试验有下面的现象:
 
1. 512M的SD卡读写全部正常;
2. 4G的卡单块读就报告错误

执行 Status = SD_ReadBlock(0*512, Buffer_MultiBlock_Rx, 512);
 结果是 Status= SD_OK;
        TransferError :SD_START_BIT_ERR
 数据能够读出来。
 跟踪了一下发现:执行到下面代码的时候,就发生了一个错误中断:
  /* Send CMD17 READ_SINGLE_BLOCK */
  SDIO_CmdInitStructure.SDIO_Argument = (u32)addr;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_SINGLE_BLOCK;
  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(SDIO_READ_SINGLE_BLOCK);

  SDIO->STA 的值为 0x00000200;   
 
  我的感觉:
  对4G的卡,SD_ReadBlock/SD_WriteBlock 都会报告错误,但是执行结果是OK的。但是对SD_ReadMultiBlocks/SD_WritedMultiBlocks 有时候会死机的。
  死机的位置在等待DMA的完成。死机的条件不能够确定。但是很容易发生。

  如果怀疑4G SD卡有问题,我用SDHC读卡器,读写都很正常。


    
此帖出自stm32/stm8论坛
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 

密切关注中

    我也在弄这个SDIO的例程,可是卡在了4BIT方式下,1BIT方式都没问题,另一个坛子上的朋友也遇到一样问题,一直解决不了
https://bbs.eeworld.com.cn/club/bbs/list.asp?boardid=49&page=3&t=3203336&tp=SD%u5361%u8FDE%u7EED%u8BFB%u5199%u64CD%u4F5C , 怀疑是这个例程支持4BIT方式有问题。楼主4BIT方式读写的时候能返回SD_OK?读出的内容跟卡上的对比一致?
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 

元月17日的实验结果,问题还没有解决

我试验用的4G卡是:KingStone Micro SD
        512M卡是: KingStone SD

试验条件: SDIO 4Bit DMA 
试验结果:
    同一个程序对 512M卡都正常;对4G卡则老出错。
    但是4G的卡在PC机上验证是好的,并做了坏块检查,没有坏块。4G的卡是一个新购的卡。
    开始的时候访问单块读写OK,多块读写不稳定,几天下来情况向坏的方向发展,单块读写也有问题。
    原来SDIO 4Bit 可以访问4G的卡,在发出读写命令后 只是要清除一下Start Bit Err 即可。现在也不可以了,好像卡有所老化。

  SDIO_CmdInitStructure.SDIO_Argument = (u32)BlockAddr;        // Send CMD17 READ_SINGLE_BLOCK 
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_SINGLE_BLOCK;
  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);

  SDIO->ICR=0x00000200;    //清除错误

    实在没有办法,换成 1bit DMA 就可以了,但是连续写200块数据还可以,数据块多了仍然死机。多个数据块连续写入每次都死在同一个位置。
    现在不能确定问题的所在:
   卡的质量问题? SDIO不适应大容量SDHC卡? 电源问题?ST给出的代码的问题?
   另外,在最初4bit 读写SD卡Ok的时候,读写的数据验证是好的。

    
       
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 

18日试验的结果

今天的实验情况和结果如下:
1. 简化的一个SD_ReadBlock的过程,同时监测 SDIO->STA的状态;
2. 如果是4b bus ,那么SDIO->STA的值一直保持为0x00000000,显然SDIO控制器没有反应。
3. 如果是1b bus ,那么SDIO->STA的值会表现为FIFO有数据,可以读取这时候读SDIO->FIFO可以得到正确的数据。
  结果表明:问题是出现在4b bus状态,和DMA,Polling ,interrupt mode 无关。

一直保持为0x00000000,显然SDIO控制器没有反应。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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