⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 东南大学开发ARM7芯片SD卡测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
    SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6          配置传输模式为单线模式
    					
    SendCmdWaitResp(0x24e,0,0X0,0x0200,0x4,0Xfff);   //CMD18  多块读命令  1bit mode
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12    多块传输需要发送stop命令以停止传输
    
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while((complete |0xfffffffd) != 0xfffffffd)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    CompareMem(MEM_BLOCK_BEGIN,END(4),0x200);
    for (i=0;i<5000;i++);
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void SdMultiW1r4(U32 rca)                                              
*                                                                       
* DESCRIPTION                                                           
*       多块一位写四位读
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS 
*                                                               
*       rca    SD卡的rca地址号                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void SdMultiW1r4(U32 rca)
{
	U32 i,complete;
    erase();//擦除
    //***********************配置DMA1进行一位写*************************
    *(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
	*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
	*(RP)DMAC_C2CONTROL = 0x80149b;  //0x1e149b                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x380b;								       				 	    
  
    SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6
      
    SendCmdWaitResp(0x32e,0,0X2,0x0200,0x4,0Xfff);   // CMD25 1bit mode
  
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
   
    while((complete |0xfffffffe) != 0xfffffffe)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    for (i=0;i<5000;i++);
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    
 
    *(RP)DMAC_C2SRCADDR  = SDC_READ_BUFER_ACCESS;
	*(RP)DMAC_C2DESTADDR = END(5); 
	*(RP)DMAC_C2CONTROL  = 0x80249b;//0x2024ad;//                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x38d;	
	
	SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca, 0x2,0xfff); //ACMD6
	
    //***********************配置DMA1进行四位读*************************	
    					
    SendCmdWaitResp(0x24e,0,0X1,0x0200,0x4,0Xfff);  // CMD18 4bit mode
    complete = *(RP)SDC_INTERRUPT_STATUS;;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    }
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while((complete |0xfffffffd) != 0xfffffffd)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    CompareMem(MEM_BLOCK_BEGIN,END(5),0x200);
    for (i=0;i<5000;i++);
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void SdMultiW4r1(U32 rca)                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       多块四位写一位读
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS 
*                                                               
*       rca    SD卡的rca地址号                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void SdMultiW4r1(U32 rca)
{
	U32 i,complete;
    erase();//擦除
    //***********************配置DMA1进行一位写*************************
    *(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
	*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
	*(RP)DMAC_C2CONTROL = 0x80149b;  //0x1e149b                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x380b;								       				 	    
  
    SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca,0x2,0xfff); //ACMD6
      
    SendCmdWaitResp(0x32e,0X0,0X3,0x0200,0x4,0Xfff);   // CMD25 4bit mode
  
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
   
    while((complete |0xfffffffe) != 0xfffffffe)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    for (i=0;i<5000;i++);
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    
 
    *(RP)DMAC_C2SRCADDR  = SDC_READ_BUFER_ACCESS;
	*(RP)DMAC_C2DESTADDR = END(6); 
	*(RP)DMAC_C2CONTROL  = 0x80249b;//0x2024ad;//                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x38d;	
	
	
	SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6
	
    //***********************配置DMA1进行一位读*************************						
    SendCmdWaitResp(0x24e,0X0,0X0,0x0200,0x4,0Xfff);   //CMD18 1bit mode
    
    complete = *(RP)SDC_INTERRUPT_STATUS;;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    }
   
    while((complete |0xfffffffd) != 0xfffffffd)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    CompareMem(MEM_BLOCK_BEGIN,END(6),0x200); 
    for (i=0;i<5000;i++);
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void SdMultiW4r4(U32 rca)                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       多块四位写四位读
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS 
*                                                               
*       rca    SD卡的rca地址号                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void SdMultiW4r4(U32 rca)
{
	U32 i,complete;
    erase();//擦除
    //***********************配置DMA1进行一位写*************************
    *(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
	*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
	*(RP)DMAC_C2CONTROL = 0x80149b;  //0x1e149b                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x380b;								       				 	    
  
    SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca,0x2,0xfff); //ACMD6
      
    SendCmdWaitResp(0x32e,0X0,0X3,0x0200,0x4,0Xfff);   // CMD25 4bit mode
  
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    complete = *(RP)SDC_INTERRUPT_STATUS;
    while((complete |0xfffffffe) != 0xfffffffe)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    for (i=0;i<5000;i++);
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    
    *(RP)DMAC_C2SRCADDR  = SDC_READ_BUFER_ACCESS;
	*(RP)DMAC_C2DESTADDR = END(7); 
	*(RP)DMAC_C2CONTROL  = 0x80249b;//0x2024ad;//                                                  				
	*(RP)DMAC_C2CONFIGURATION = 0x38d;	
	
	SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
    SendCmdWaitIdle(0xca, 0x2,0xfff); //ACMD6
	
    //***********************配置DMA1进行四位读*************************	
    					
    SendCmdWaitResp(0x24e,0,0X1,0x0200,0x4,0Xfff);  // CMD18 4bit mode
    complete = *(RP)SDC_INTERRUPT_STATUS;;
    while ((complete & 0x00000040) != 0x00000040)
    {
      complete = *(RP)SDC_INTERRUPT_STATUS;
    }
    
    while((complete |0xfffffffd) != 0xfffffffd)
    {
      printf("CRC ERROR");
      complete = *(RP)SDC_INTERRUPT_STATUS;
    } 
    
    SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
    CompareMem(MEM_BLOCK_BEGIN,END(7),0x200); 
    for (i=0;i<5000;i++);
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void  FifoReset()                                             
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       FIFO初始化
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS 
*                                                               
*       无                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void  FifoReset()
{
	U32 i,tmp;
    *(RP)SDC_CLOCK_CONTROL=0X0000;             		   //配置SD时钟
    for (i=0;i<10;i++);
	*(RP)SDC_CLOCK_CONTROL=0X0004;                     //打开SD时钟
    for (i=0;i<2;i++);
    while((*(RP)SDC_INTERRUPT_STATUS & 0x200)!=0x200)  //复位RXFIFO
    {
    	tmp = *(RP)SDC_READ_BUFER_ACCESS;
    	for (i=0;i<10;i++);
    }
    while((*(RP)SDC_INTERRUPT_STATUS & 0x800)!=0x800)  //复位TXFIFO
    {
    	*(RP)SDC_WRITE_BUFER_ACCESS = tmp;
    	for (i=0;i<10;i++);
    }

}



int main()
{
    int i;
    U32 head;
    U32 rca;
    
    //**************************初始化一段数据************************************
    head = MEM_BLOCK_BEGIN;      
	for(i=0; i<BLOCK_SIZE; i++)
	{
		*(RP)head = i;
		head = head + 4;
	}
	
    //********************************初始化SD卡**************************************
    //得到SD卡的rca地址号,进行下面操作的时候都要给卡发送地址号
	rca = InitialSd();
     
     
    //********************************初始化FIFO**************************************
    FifoReset();
    

    //********************************读写测试开始************************************    
    SdSingleW1r1(rca);			//单块 一位写一位读
  
    SdSingleW1r4(rca);			//单块 一位写四位读
   
    SdSingleW4r1(rca);			//单块 四位写一位读
   
    SdSingleW4r4(rca);			//单块 四位写四位读
  
    SdMultiW1r1(rca); 			//多块 一位写一位读
  
    SdMultiW1r4(rca); 			//多块 一位写四位读
   
    SdMultiW4r1(rca); 			//多块 四位写一位读

    SdMultiW4r4(rca); 			//多块 四位写四位读

    while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -