导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→我使用LPC2368开发板,开发一款以SD卡为存储介质的大U[myyv]

 *第28680篇: 我使用LPC2368开发板,开发一款以SD卡为存储介质的大U盘,现在读写速度慢

  
楼 主:myyv 2008年7月3日10:17
 我使用LPC2368开发板,开发一款以SD卡为存储介质的大U盘,现在读写速度慢
我使用LPC2368开发板,开发一款以SD卡为存储介质的大U盘,开发板上带有SD卡模块和USB模块,我使用的编译器为KEIL,所使用的代码为KEIL编译器携带的两个例子程序,一个是USBMEM程序,他是用LPC2368的内部存储器来模拟一个14K的U盘,另一个是SD-FILE程序,这个也是编译器带的SD卡的读写例子程序,我把这两个程序合并后,现在编译完全通过,没有错误也没有警告,但是现在的开发板连到电脑后,读取一个32M的压缩包需要一分钟,而写入需要十分钟,这个速度请问是不是过慢?我测试普通的U盘32M的压缩包读写基本不需要一分钟,SD卡的时钟频率脚现在是3M,SD卡的读写程序有两个时钟频率,高速模式选择代码如下


static void mci_set_speed (U32 speed) {
   /* Set a MCI clock speed to desired value. */
   U32 i,clkdiv;

   if (speed == HIGH_SPEED) {
      /* Max. 20 MBit used for Data Transfer. */
      clkdiv = 1;
   }
   else {
      /* Max. 400 kBit used in Card Initialization. */
      clkdiv = 128;
   }
   
   MCI_CLOCK = (MCI_CLOCK & ~0xFF) | 0x300 | clkdiv;


   /* delay 3MCLK + 2PCLK before next write */
   for ( i = 0; i   < 100; i++ );
}
分频应该已经选择到最高频率,我看了其他的SD卡程序,时钟频率也在3M,这个应该没有问题吧,USBMEM模拟U盘这个程序在不连接SD卡程序的时候写32M用时为1分钟,SD卡读写10M为一分钟,那么这两个程序合并后读写32M的速度应该是在3分钟吧,为什么我现在读写32M确要10分钟之久,合并处的代码如下

USB读处改写后的函数:
void MSC_MemoryRead (void) {
DWORD n;


  if (Length >   MSC_MAX_PACKET) {
    n = MSC_MAX_PACKET;
  } else {
    n = Length;
  }


if ( Offset+64>  (HH*512)+512 || Offset  <HH*512 )//此处为修改处,简单的判断下然后读

HH=Offset/512;
   mci_read_sect(HH,Memory);
  }

  USB_WriteEP(MSC_EP_IN, &Memory[Offset%512], n);

  Offset += n;
  Length -= n;

  CSW.dDataResidue -= n;

  if (Length == 0) {
    BulkStage = MSC_BS_DATA_IN_LAST;
  }

  if (BulkStage != MSC_BS_DATA_IN) {
//    FIO2CLR = LED_RD;           
    CSW.bStatus = CSW_CMD_PASSED;
  }
}

USB写处修改后的函数:

void MSC_MemoryWrite (void) {
  DWORD n;

   if(  dd!=0 || (Offset+64)>  ((de*512)+512) || Offset  <(de*512)  )//此处为修改处,判断下然后写SD卡
{
  if(dd!=1)
  {
   mci_write_sect(de,Memory);
  }
de=Offset/512;
dd=0; 
  } 

for (n = 0; n   < BulkLen; n++) {
    Memory[Offset%512 + n] = BulkBuf[n];
  }
  Offset += BulkLen;
  Length -= BulkLen;

  CSW.dDataResidue -= BulkLen;

  if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {

   mci_write_sect(de,Memory);

//    FIO2CLR = LED_WR;            
    CSW.bStatus = CSW_CMD_PASSED;
    MSC_SetCSW();
  } 
}

请做过的朋友给点提示,谢谢了


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:软件架构

[下一篇主题]:求助程序设计