现在的位置: 首页 > 综合 > 正文

解决SD卡不能读写的问题

2013年07月13日 ⁄ 综合 ⁄ 共 2496字 ⁄ 字号 评论关闭

解决SD不能读写问题

 //-----------------------------------------------------------------------------------------------------------

// 作者:wogoyixikexie@gliet

// 版权:桂林电子科技大学一系科协wogoyixikexie@gliet

// 平台:wince5.0 2440 5.0 BSP

// 发布日期:2009年5月5日 17:30:37

// 最后修改:

// 注意事项:未经作者同意,不得在转载的时候擅自修改、删除文章的任何部分

//-----------------------------------------------------------------------------------------------------------

  

       今天,我插入SD卡,SD卡盘符很快出现了,可是郁闷的事情出现了:当我在SD卡盘符里面新建文件夹,立即弹出不允许建立的对话框,并且,删除里面的文件也不行。刚开始我怀疑是三星提供的BSP问题,后来,我用立宇泰开发板测试,发现这个SD卡使用完全正常,后来查看电路,发现有个写保护的控制的,我感觉到是这个问题,但是我看电路这个立宇泰的写保护控制引脚和我的手持机是完全一致的,这个BSP就是本来立宇泰的修改而来的,貌似我从来没有改动过GPH相关的东西。不过估计这个只能用貌似了,因为这个BSP我已经修改了好几个月,说不定无意间早就改动了。当我使用sunrain_hjb牛人写的应用程序去读GPH8相关的寄存器的时候,发现这的确是问题所在。两者的GPH8相关的寄存器居然不同。我的配置成输入了,成功的是输出的。

   

    现在使用sunrain_hjb的小软件设置一下GPH8输出,就可以正常读写SD卡了。sunrain_hjb牛人让我学到了好多东西。

 

http://p.blog.csdn.net/images/p_blog_csdn_net/gooogleman/EntryImages/20090505/GPHCON设置.jpg

 

 http://p.blog.csdn.net/images/p_blog_csdn_net/gooogleman/EntryImages/20090505/GPHDAT的值.jpg

============================================================

在注册表里面,SD卡写保护配置有

    "CardReadWriteGPIO"="H"         ; card R/W on GPH8
    "CardReadWriteMask"=dword:100
    "CardReadWriteFlag"=dword:100
    "CardReadWriteControlMask"=dword:fffcffff
    "CardReadWriteControlFlag"=dword:0
    "CardReadWritePullupMask"=dword:fffffeff
    "CardReadWritePullupFlag"=dword:100

 

在驱动中有

 

BOOL CSDIOController::IsCardWriteProtected()
{
    switch( m_chCardReadWriteGPIO )
    {
    case 'A':
        return ( ( vm_pIOPreg->GPADAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'B':
        return ( ( vm_pIOPreg->GPBDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'C':
        return ( ( vm_pIOPreg->GPCDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'D':
        return ( ( vm_pIOPreg->GPDDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'E':
        return ( ( vm_pIOPreg->GPEDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'F':
        return ( ( vm_pIOPreg->GPFDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'G':
        return ( ( vm_pIOPreg->GPGDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    case 'H':
        return ( ( vm_pIOPreg->GPHDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    default:
        ASSERT(0); // invalid GPIO!  We should never get here
        return TRUE;
    }
}

如果想让系统不检测这个写保护,可以直接该函数的函数体弄成

 

BOOL CSDIOController::IsCardWriteProtected()
{
    
        return FALSE;
   
}

 

即可。哈哈,虽然是些小玩意,但是也是值得注意的。下一步是让该驱动支持大容量的SD卡。回去请教一下群里先。

转载请标明:作者wogoyixikexie@gliet.桂林电子科技大学一系科协,原文地址:http://www.cnblogs.com/wogoyixikexie/(或者我在CSDN的博客:http://blog.csdn.net/gooogleman——如有错误,希望能够留言指出;如果你有更加好的方法,也请在博客后面留言,我会感激你的批评和分享。

抱歉!评论已关闭.