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

📄 main.c

📁 东南大学开发ARM7芯片SD卡测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*************************************************************************************
 *	Copyright (c) 2007 by PROCHIP Limited.
 *	PROPRIETARY RIGHTS of PROCHIP Limited are involved in the subject matter of this 
 *	material.  All manufacturing, reproduction, use, and sales rights 
 *	pertaining to this subject matter are governed by the license agreement.
 *	The recipient of this software implicitly accepts the terms of the license.
 *
 *	File Name:  main.c
 *
 *	File Description: 主函数, 实现具体功能.
 *
 *    Version         Date            Author           
 *------------------------------------------------------------------------------------    
 *    0.0.1           2008.1.9                  
 *   		      	
 *************************************************************************************/

#include	<stdio.h>
#include	"ub4020evb.h"
#include	"intc.h"

#define MEM_BLOCK_BEGIN		0x30200000
#define MEM_BLOCK_END		0x30220000
#define BLOCK_SIZE		    1280
#define END(i)			    (MEM_BLOCK_END+i*(1<<16))

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       CompareMem                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       比较2块数据块的内容是否一致。
*                                                                       
* AUTHOR                                                                
*                                                                       
*       wuer              
*                                                                       
* INPUTS                                                                
*                                                                       
*      	U32 src,  第一块数据块的首地址
*		U32 dest, 第二块数据块的首地址
*		U32 len, 比较的数据块大小        
*                                                                       
* OUTPUTS                                                               
*                                                                       
*      无  (出错打印信息)              
*                                                                       
***************************************************************/
void CompareMem(U32 src, U32 dest,U32 len)
{
	U32 i;
	U32	a,b;
	
	for(i=0;i<len;i++)
	{
		a = *(RP8)src;
		b = *(RP8)dest;
    	
    	if(a != b)
    	{
    		printf("Data different at 0x%lx\n",dest);
    	}
    	
    	src ++;
    	dest ++;	
	}
	
	printf("Data ok\n");
}


/*************************************************************
* FUNCTION                                                              
*                                                                       
*       int SendCmdWaitRespIni(U16 Cmd,U32 Arg,U16 trans_mode,U16 blk_len,U16 nob,U16 int_mask)                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       向SD控制器发送命令,等待SD控制器确认收到命令
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS                                                                
*                                                                       
*	    Cmd:			命令编号;
*	    Arg:			命令参数;
*	    TransMode       SD传输模式;
*		BlkLen:		    数据块长度;
*		Nob:			数据块数目;
*		IntMask:		中断允许标志;                 
*                                                                       
* OUTPUTS                                                               
*                                                                       
*      *(RP)SDC_RESPONSE0   SD命令响应                  
*                                                                       
*************************************************/
int SendCmdWaitRespIni(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)
{
    U32 i;
    
    *(RP)SDC_CLOCK_CONTROL=0Xff00;             //配置SD时钟
    for (i=0;i<10;i++);
	*(RP)SDC_CLOCK_CONTROL=0Xff04;             //打开SD时钟	
    for (i=0;i<10;i++);
    
	*(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
	for (i=0;i<10;i++);
	*(RP)SDC_TRANSFER_MODE=TransMode;
	for (i=0;i<10;i++);
    *(RP)SDC_BLOCK_SIZE=BlkLen;
    for (i=0;i<10;i++);
    *(RP)SDC_BLOCK_COUNT=Nob;
    for (i=0;i<10;i++);
    *(RP)SDC_ARGUMENT=Arg;
    for (i=0;i<10;i++);
    *(RP)SDC_COMMAND=Cmd;
    for (i=0;i<10;i++);
    
    i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	
	for (i=0;i<10;i++);
	
	while(i != 0x1000)
	{
	i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	}
        for( i=0; i<160; i++);

	return *(RP)SDC_RESPONSE0;
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       int SendCmdWaitResp(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       向SD控制器发送命令并传送数据,等待SD控制器确认收到命令
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS                                                                
*                                                                       
*	    Cmd:			命令编号;
*	    Arg:			命令参数;
*	    TransMode       SD传输模式;
*		BlkLen:		    数据块长度;
*		Nob:			数据块数目;
*		IntMask:		中断允许标志;                 
*                                                                       
* OUTPUTS                                                               
*                                                                       
*      *(RP)SDC_RESPONSE0   SD命令响应                  
*                                                                       
*************************************************/
int SendCmdWaitResp(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)
{
   U32 i;
    
   *(RP)SDC_CLOCK_CONTROL=0Xff00;             //配置SD时钟
   for (i=0;i<1000;i++);
   *(RP)SDC_CLOCK_CONTROL=0Xff04;             //打开SD时钟										// CLK_20M = APB时钟;CLK_DIV = CLK_20M/64
   for (i=0;i<10000;i++);
    
    
    *(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
    *(RP)SDC_TRANSFER_MODE=TransMode;
    *(RP)SDC_BLOCK_SIZE=BlkLen;   
    *(RP)SDC_BLOCK_COUNT=Nob;
    *(RP)SDC_ARGUMENT=Arg;
    *(RP)SDC_COMMAND=Cmd;
    
    for (i=0;i<10;i++);    
        
    
    i = *(RP)SDC_INTERRUPT_STATUS & 0x1040;
	
	while(i != 0x1040)
	{
	   i = *(RP)SDC_INTERRUPT_STATUS & 0x1040;
	}
    for( i=0; i<1000; i++);
    
	return *(RP)SDC_RESPONSE0;
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       int SendCmdWaitIdle(U16 Cmd,U32 Arg,U16 IntMask )                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       向SD控制器发送命令,等待SD控制器确认收到命令
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS                                                                
*                                                                       
*	    Cmd:			命令编号;
*	    Arg:			命令参数;  
*		IntMask:		中断允许标志;                 
*                                                                       
* OUTPUTS                                                               
*                                                                       
*      *(RP)SDC_RESPONSE0   SD命令响应                  
*                                                                       
*************************************************/
int SendCmdWaitIdle(U16 Cmd,U32 Arg,U16 IntMask )
{
	int i;

    *(RP)SDC_CLOCK_CONTROL=0Xff00;             //配置SD时钟         配置分频比
    for (i=0;i<10;i++);
	*(RP)SDC_CLOCK_CONTROL=0X0004;             //打开SD时钟			 配置分频比	
       
    for (i=0;i<1000;i++);
    
	*(RP)SDC_COMMAND=Cmd;
        for (i=0;i<10;i++);
	*(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
        for (i=0;i<10;i++);
	*(RP)SDC_ARGUMENT=Arg;
        for (i=0;i<10;i++);
	
    i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	
	while(i != 0x1000)
	{
		i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	}
	for (i=0;i<1300;i++);    	                	             
	return *(RP)SDC_RESPONSE0;
	return 1;  
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void wait()                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       等待
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS                                                                
*       无                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void wait()
{
	 U32 resp;
	 SendCmdWaitRespIni(0x1aa,0X0,0X0,0x0,0x0,0X0);//CMD13
	 resp = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	 while (resp != 0x1000)
	 {
	   SendCmdWaitRespIni(0x1aa,0X0,0X0,0x0,0x0,0X0);//CMD13
	   resp = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
	 }
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       void erase()                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       擦除
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS
*                                                                
*       无                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       无                  
*                                                                       
*************************************************/
void erase()
{
	   U32 i;
	   for (i = 0;i<100;i++);
	   SendCmdWaitRespIni(0x40a,0X0,0X0,0x0,0x0,0X0);//CMD35   配置起始地址
	   for (i = 0;i<100;i++);
	   SendCmdWaitRespIni(0x42a,0X4000,0X0,0x0,0x0,0X0);//CMD36 配置结束地址
	   for (i = 0;i<100;i++); 
	   SendCmdWaitRespIni(0x4cb,0X0,0X0,0x0,0x0,0X0);//CMD38    执行擦除操作
	   for (i = 0;i<1000;i++);
}

/*************************************************************
* FUNCTION                                                              
*                                                                       
*       U32 InitialSd()                                              
*                                                                       
* DESCRIPTION                                                           
*                                                                       
*       初始化SD卡
*                                                                       
* AUTHOR                                                                
*                                                                       
*       yao                   
*                                                                       
* INPUTS 
*                                                               
*       无                
*                                                                       
* OUTPUTS                                                               
*                                                                       
*       rca    SD卡的rca地址号                  
*                                                                       
*************************************************/
U32 InitialSd()
{
	U32 i,rca;
	*(RP)SDC_SOFTWARE_RESET=0x0;
	for (i=0;i<200;i++);
	*(RP)SDC_SOFTWARE_RESET=0x1; 
    for (i=0;i<200;i++);
 
    SendCmdWaitIdle(0x08,0x0,0xfff);   //CMD0
       
    for (i=0;i<8000;i++);   
    
    do
    {
    SendCmdWaitIdle(0x6ea,0x0,0xfff);//CMD55
    for (i=0;i<3;i++);  

⌨️ 快捷键说明

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