打印
[应用相关]

SDIO 多扇区写入遇到的问题!

[复制链接]
7646|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2009-1-12 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试环境:万利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干点别的?如何修改代吗呢?
沙发
seawwh|  楼主 | 2009-1-12 15:23 | 只看该作者

经试验 POLLING_MODE 和 INTERRUPT_MODE 不会死机

使用特权

评论回复
板凳
seawwh|  楼主 | 2009-1-15 17:20 | 只看该作者

这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读卡器,读写都很正常。


    

使用特权

评论回复
地板
alien2006| | 2009-1-17 10:21 | 只看该作者

密切关注中

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

使用特权

评论回复
5
seawwh|  楼主 | 2009-1-17 16:33 | 只看该作者

元月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的时候,读写的数据验证是好的。

    
       

使用特权

评论回复
6
seawwh|  楼主 | 2009-1-18 19:52 | 只看该作者

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控制器没有反应。

使用特权

评论回复
7
keepfever| | 2013-8-27 15:12 | 只看该作者
你好,我写的SDIO方式控制总是卡到DMA那个地方,是怎么回事呢?

使用特权

评论回复
8
feilusia| | 2013-8-27 15:44 | 只看该作者
keepfever 发表于 2013-8-27 15:12
你好,我写的SDIO方式控制总是卡到DMA那个地方,是怎么回事呢?

http://pan.baidu.com/share/link?shareid=2608549739&uk=3942664303#dir/path=%2FSTM32%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E5%A4%A7%E6%94%BE%E9%80%81%EF%BC%88%E5%A4%A7%E7%BA%A610G%EF%BC%89%2F1%20%E8%8A%AF%E5%B5%8Cstm32%E5%BC%80%E5%8F%91%E6%9D%BF%E5%85%89%E7%9B%98%E8%B5%84%E6%96%99%2F%E8%8A%AF%E5%B5%8Cstm32%E9%85%8D%E5%A5%97%E4%BE%8B%E7%A8%8B
到这里去下,这个是前几天我在这里问,别人回复我的,现在我的SDIO模块过了。

使用特权

评论回复
9
cjhk| | 2013-8-27 19:02 | 只看该作者
不懂   楼主   帮你顶一个   你可以看看别人的意见吧   楼主

使用特权

评论回复
10
keepfever| | 2013-8-28 14:52 | 只看该作者
feilusia 发表于 2013-8-27 15:44
http://pan.baidu.com/share/link?shareid=2608549739&uk=3942664303#dir/path=%2FSTM32%E5%AD%A6%E4%B9% ...

你好,SD用我自己写的程序初始化后取出来插入电脑无法识别,SD卡的文件系统被破坏了,是怎么回事呢?能把你调好的发给我一份吗?发我QQ邮箱,514882011@qq.com谢谢哈!

使用特权

评论回复
11
feilusia| | 2013-8-28 15:29 | 只看该作者
keepfever 发表于 2013-8-28 14:52
你好,SD用我自己写的程序初始化后取出来插入电脑无法识别,SD卡的文件系统被破坏了,是怎么回事呢?能把 ...

你去下我发的那个网址里的程序,我就是用那个的。

使用特权

评论回复
12
keepfever| | 2013-8-28 15:51 | 只看该作者
我刚刚下了一个试了一下还是不行,不知道问题出在哪儿了,我感觉好像是大小端的问题,你知道大小端的设置是在哪儿吗?

使用特权

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

本版积分规则

145

主题

368

帖子

0

粉丝