PXA270,windows CE5.0下读取MMC/SD卡的硬件ID问题.

jk_3333   2007-1-23 10:30 楼主
各位大虾好:
     我用VirtualAlloc,VirtualCopy影射了PXA270的关于SD/MMC的硬件寄存器的物理地址,想这样通过发送指令CMD2来获得卡的128位的唯一ID.目前情况为: 物理地址已经成功映射.但是发送了指令后,等待SD/MMC响应指令的中断,一直等不到中断位置位.一直搞不定.个人怀疑,可能是CE的SD/MMC的驱动程序在我的程序操作硬件的的时候,也在操作.
     大虾分析下什么原因,有没有能够使我独占这份资源的方法?还是其他原因?

                                                 谢谢

回复评论 (13)

怎么没人帮忙啊?自顶
点赞  2007-1-24 09:38
看一下驱动代码,只要你的操作驱动支持就可以的。
点赞  2007-1-25 09:14
我面对的是PDA手机,不可能接触到驱动那一层的,我只能在应用层做这些事情
点赞  2007-1-25 09:51
我感觉应用程序里面应该直接调用API访问好一点,找找看看有没有可以用的API?
如果像你说的那样自己影射寄存器,最好还是在驱动里面做
点赞  2007-1-25 10:46
如果有这样的API,我也不会这样郁闷了。这位高人是否有wince的关于PXA270的SD/MMC驱动?参考以下?
点赞  2007-1-25 10:58
setmem 0x41100000,0x00000002,32 //start the mmclk
点赞  2007-2-1 14:19
看一下pxa270的datasheet就知道了.
点赞  2007-2-1 14:20
具个例子:
///////////////////////////////////////////////////////////////////////////////
//  SDClockOn - turn on the MMC Clock
//  Input:  pHc - hardware context
//  Output:
//  Return:
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
VOID SDClockOn(PSDH_HARDWARE_CONTEXT pHc)
{
//        RETAILMSG(1, (TEXT("-->SDClockOn\r\n")));
        // turn on the clock
        WRITE_MMC_REGISTER_DWORD(pHc, MMC_STRPCL, MMC_STRPCL_START_CLOCK);
}
点赞  2007-2-1 14:22

我贴下代码吧,高手诊断下,谢谢啦
         pMMCReg->rMMC_CLKRT = 0x00000006;
     
         pMMCReg->rMMC_CMD   = 0x00000002;//cmd2
         pMMCReg->rMMC_ARGH  = 0;
         pMMCReg->rMMC_ARGL  = 0;
          
         pMMCReg->rMMC_CMDAT = CMDAT_RESP_R2;

         pMMCReg->rMMC_I_MASK = ~END_CMD_RES;
         pMMCReg->rMMC_STRPCL = 2;//运行到这里程序就死掉了,系统也死掉了

         while( !(pMMCReg->rMMC_I_REG & (1<<2)) );//wait for end_cmd_res
         
         for( i = 0; i < 8; i ++ )
         {
               resp = pMMCReg->rMMC_RES & 0x0000ffff;
         }
点赞  2007-2-6 10:56
为了获得ID 不需要这么做吧,一般的SD卡驱动程序已经包含了这样的命令了, 你只需要调用WinCE标准的API既可以获得SD的硬件ID.

看看 Help 钟关于 Storage 的相关的 API.


点赞  2007-2-6 17:45
找了好几遍了,没有这样的api啊
点赞  2007-2-7 10:48
可以用API函数的,API函数有个好处就是不需要分是SD卡还是MMC卡,如果你直接操作寄存器的话需要细分你插入的是SD卡还是MMC卡,在使用CMD2之前两个卡的初始化是不相同的,所以CMD2命令可能你不能成功的。
点赞  2007-2-11 21:10
引用: 引用 9 楼 alexu2002 的回复:

我贴下代码吧,高手诊断下,谢谢啦
                  pMMCReg-> rMMC_CLKRT   =   0x00000006;
         
                  pMMCReg-> rMMC_CMD       =   0x00000002;//cmd2
  pMMCReg-> rMMC_ARGH     =   0;
  pMMCReg-> rMMC_ARGL     =   0;
   
  pMMCReg-> rMMC_CMDAT   =   CMDAT_RESP_R2;

  pMMCReg-> rMMC_I_MASK   =   ~END_CMD_RES;
  pMMCReg-> rMMC_STRPCL   =   2;//运行到这里程序就死掉了…




pMMCReg-> rMMC_STRPCL   =   2;
把上面这行代码去掉,前面停CLOCK的代码也去掉
让MMC 的CLOCK在你对卡作操作的时候一直保持,不要停

如果还是不行,可以把MMC_I_REG,和MMC_STAT两个寄存器的值读出来看看有什么问题
点赞  2008-6-17 09:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复