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

📄 sd_drv.c

📁 这是sd卡驱动的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	}
	
	if( i == 500 )
	{
		// ABORT: invalid response for read single block command
		//aos_printf(MPE_DRV," sd write cmd status=0x%x",status);
		AOS_ASSERT(0);
        result = AOS_FAIL;
        goto done;
	}
    
	// BLOCK  0xFC 2-513 CRC16  (515Bytes)
	// Now for the "Start Block" token	(0xFC) "End Blcok" token (0xFD)
	for( i=0; i< len/BLOCK_SIZE; i++)
	{
       	    status = 0xFC;
            spi_write(&status,1);	
           
            spi_write(buf,BLOCK_SIZE);	
           
           	status=0xFF;
           	// write two CRC bytes
            spi_write(&status,1);	
            spi_write(&status,1);              
            
            hw_delay(100);
            status = sd_wait_for_r1();   
   
            if (!(((status&0x0F)==0x5)||(status==0)))             
            {
                  AOS_ASSERT(0);
                //  aos_printf(MPE_DRV,"multi write fail response=0x%x,the %d block",status,i);
            }
            buf += BLOCK_SIZE;    
            // 等待 busy 结束
           j=0;
           do 
   	       {
    	        status = spi_read();  
    	        j++;
    	        if (j==1000)
    	        	break;
   	       } while(status==0);
	  }
    
        // stop multi block writing
        status = 0xFD;
        spi_write(&status,1);	

        // 等待 busy 结束
        i=0;
        do 
        {
            status = spi_read();  
            i++;
            if (i==20000)
            {
                AOS_ASSERT(0);
                goto done;
            }
        }
        while(status==0);
         //aos_printf(MPE_DRV,"after  write multi block data response the first  busy times is  %d",i);
         //先拉高 cs ,再使能cs
         spi_disable_cs();             
         spi_enable_cs();
         
         //等待 busy 结束
         i=0;
         do 
         {
             status = spi_read();  
             i++;
              if (i==5000)
             {
                 AOS_ASSERT(0);
                 goto done;
             }
         }while(status==0);
         //aos_printf(MPE_DRV,"after  write multi block data response the last  busy times is  %d",i);
        
        // send status R2 response
        for( i=0; i< 500; i++ )
        {
       	status_r2 = sd_write_cmd_r2(CMD13_SEND_STATUS_BLOCK);
       	if(status_r2 == 0)
       	{
       		 result = AOS_SUCC;
             break;
       	}
   		// ABORT: invalid response for read single block command
   		//aos_printf(MPE_DRV," sd write status=0x%x",status_r2);
		result = AOS_FAIL;
   	}
   		
   	
done:
    // Following a read transaction, the SD Card needs 8 clocks after the end 
   	// bit of the last data block to finish up its work.
	status=0xFF;
	spi_write(&status,1); 
	
	spi_disable_cs();
  
	return result;
}

/******************************************************************************
函数: drv_read_sd_card
描述:
      主程序每10秒 定时 检查SD卡是否存在 ,第一次要 初始化 
输入:    
输出:
返回:            
******************************************************************************/
void drv_read_sd_card(void)
{    
    if( !is_gmpub_board() )
           return;
        
    if( !is_sd_card_in() )
    {
        sdcard_pos = FALSE;
    }
    else
    {
        if( !sdcard_pos )
        {
            aos_printf(MPE_SYS," reinit the sd-card.");
            sd_card_init();
        }    
    }    
}


/*
void sd_test2(U8 para1)
{             
     sd_mem_write(0x0,(U32)szTestBuf, 640); //from mem to sd

     aos_printf(0," mem:0 len=64");
     debug_mem_show(0,(U32)szTestBuf, 64);
     aos_task_delay(10);

     aos_printf(0," mem:512 len=64");     
     debug_mem_show(0,(U32)szTestBuf+512, 64);
     aos_task_delay(10);

     aos_printf(0," mem:1024 len=64");     
     debug_mem_show(0,(U32)szTestBuf+1024, 64);
     aos_task_delay(10);

     aos_printf(0," mem:1536 len=64");     
     debug_mem_show(0,(U32)szTestBuf+1536, 64);
     aos_task_delay(10);

     aos_printf(0," mem:2048 len=64");     
     debug_mem_show(0,(U32)szTestBuf+2048, 64);
     aos_task_delay(10);
     
}

void sd_test4(U8 para1)
{         
     aos_memset(szTestBuf,para1,LENSIZE);
     szTestBuf[0]=0xFF;
     szTestBuf[LENSIZE-1]=0xFF;

     if (para1 < 10 )
         move_ram_to_sd((U32)szTestBuf,0x0,LENSIZE,MPE_DRV,0);
     else 
         move_ram_to_sd((U32)szTestBuf,0x10,LENSIZE,MPE_DRV,0);

         
}

U32 sd_test3(U8 para1,U8 para2)
{
    if( para1 == 0)
    {
        aos_memset(szTestBuf,0x11,512*5);
        
       // aos_printf(0," mem:0 len=64\n");
        //debug_mem_show(0,(U32)szTestBuf, 64);
        //aos_task_delay(10);
      
        if( AOS_FAIL == sd_write_block(0,szTestBuf))   //write from Buf to sd 0
        {
         AOS_ASSERT(0);    
         aos_printf(0, "SD TEST:write error ");
         return AOS_FAIL;         
        }    
        aos_printf(0, "SD TEST:write correct ");
       
       aos_task_delay(200);
       
        if( AOS_FAIL == sd_read_block(0,TestBuf1))  //read from sd 0 to Buf1
        {
            AOS_ASSERT(0);
            aos_printf(0, "SD TEST:read error ");
            return AOS_FAIL;
        }    
        aos_printf(0, "SD TEST:read correct ,TestBuf1: len=64\n");
        debug_mem_show(0,(U32)TestBuf1+500, 64); 
          return AOS_SUCC;
           
       }
    if( para1 == 1 )
    {
        sd_read_csd_config();

        sd_get_card_volume(); 
    }

    if( para1 == 2 )
    {
        aos_memset(szTestBuf,0x55,512*5);
        sd_write_multi_block(0, szTestBuf, 512*5);
    }

    if( para1 == 3 )
    {
        aos_memset(szTestBuf,0x55,512);
        sd_mem_write(10, szTestBuf, 512);
    }       

    if( para1 == 4 )
    {
        sd_erase_block(0, 4096);
    }
    
}*/   

/******************************************************************************
函数: sd_readwrite_time
描述:
      SD 卡读写一块数据所用时间,方便 sh 命令,为了不破坏数据 ,只提供读操作
输入: void
输出:
返回: void
******************************************************************************/
VOID sd_readwrite_time(void)
{
      U8   TestspeedBuf0[512]={0};
      // U8   TestspeedBuf1[600]={0};
      U32  readblock_sec;
     // U32  writeblock_sec,writeblock_usec;
      CPU_TICK_S      stCpuTick_read_start,stCpuTick_read_end;
      //CPU_TICK_S      stCpuTick_write_start,stCpuTick_write_end;
      
      //aos_printf(MPE_SYS,"current SD card volume is %d M Bytes.",g_SDVolume);
      //test read a block speed
      aos_cputick_get(&stCpuTick_read_start);
      sd_read_block(0, TestspeedBuf0);  //read sd 0 to mem 
      aos_cputick_get(&stCpuTick_read_end);
            
      aos_cputick_sub(&stCpuTick_read_end,&stCpuTick_read_start);
      aos_cputick_2us(&stCpuTick_read_end,&readblock_sec,&g_readBlock_usec);    
     // aos_printf(MPE_SYS,"read oneblock time is %dus", g_readBlock_usec);
      /*
     //test write a block speed
      aos_cputick_get(&stCpuTick_write_start);
      sd_write_block(0x400, TestspeedBuf1);  //from szTestBuf to 0(sd),
      aos_cputick_get(&stCpuTick_write_end);            
      aos_cputick_sub(&stCpuTick_write_end,&stCpuTick_write_start);
      aos_cputick_2us(&stCpuTick_write_end,&writeblock_sec,&writeblock_usec);   
      aos_printf(MPE_SYS,"write oneblock(to SD 0x400) time is %dus\n",writeblock_usec );
      */
}

   
/******************************************************************************
函数: sd_gmpu_debug_msg_proc
描述:
     SD卡调试命令
     CMD 50 0                     帮助
     CMD 50 1                     初始化SD卡
     CMD 50 2  ulPara1            从地址ulPara1 读一块并显示
     CMD 50 3  ulPara1  ulPara2   写一块数据ulPara1 到SD地址ulPara2
     CMD 50 4  ulPara1  ulPara2   写多块数据ulPara1 到SD地址ulPara2
     CMD 50 5  ulPara1            从 地址ulPara1 读5块数据并显示
     CMD 50 6  ulPara1  ulPara2   写数据ulPara1到SD地址ulPara2  
     CMD 50 7  0 (1 2)            命令时序                         
     CMD 50 8  ulPara1            读起始地址为ulPara1的10块数据,计算时间
     CMD 50 9  ulPara1            写10块0x55数据到ulPara1,计算总时间
      
输入:U32 ulCmd,             命令号
     U32 ulPara1 ,ulPara2  参数,用于数据和地址
     U32 ulPara3,ulPara4,   暂时没有用
输出:
返回:void
******************************************************************************/
VOID sd_gmpu_debug_msg_proc(U32 ulCmd, U32 ulPara1, U32 ulPara2, U32 ulPara3, U32 ulPara4)
{   
    U8 status;	    
    U32  readblock_sec,readblock_usec;
    U32  writeblock_sec,writeblock_usec;
    CPU_TICK_S      stCpuTick_read_start,stCpuTick_read_end;
    CPU_TICK_S      stCpuTick_write_start,stCpuTick_write_end;
    
    switch( ulCmd )
    {   
        case 0x0:
           aos_printf(MPE_DRV,"0 sdcard test help ");
           aos_printf(MPE_DRV,"1 spi_sdcard_init() ");
           aos_printf(MPE_DRV,"2 sd_read_block ");
           aos_printf(MPE_DRV,"3 sd_write_block ");
           aos_printf(MPE_DRV,"4 sd_write_multi_block ");
           aos_printf(MPE_DRV,"5 sd_mem_read ");
           aos_printf(MPE_DRV,"6 sd_mem_write ");
           aos_printf(MPE_DRV,"7 command  test\n");
            break;
            
        case 0x1:
        	if (AOS_SUCC==spi_sdcard_init())
        		aos_printf(MPE_DRV,"SPI MODE SDcard initiazation success!\n");
            break;
           //读一块 
        case 0x2:        
        	sd_read_block(ulPara1, szTestBuf);  //read sd 0 to mem         	             
        	debug_mem_show(MPE_DRV,(U32)szTestBuf, 64);
        	break;
        	//写一块
        case 0x03:
      	    aos_memset(szTestBuf,(U8)ulPara1,512*5);//ulPara1 denote 一个十进制数据
            //aos_printf(MPE_DRV,"the first mem\n");
        	  //debug_mem_show(MPE_DRV,(U32)szTestBuf1, 64);//aos_memset(szTestBuf0,0x55,512*5);
            sd_write_block(ulPara2, szTestBuf);  //from szTestBuf to 0(sd),ulPara2 denote SD address
            aos_task_delay(10);
            
            sd_read_block(ulPara2, szTestBuf1);  //read sd 0 to mem 
            //aos_printf(MPE_DRV,"the last mem\n");
            debug_mem_show(MPE_DRV,(U32)szTestBuf1, 64);
            //debug_mem_show(0,(U32)szTestBuf1, 64);
        	break;
            // 写多块
        case 0x04:
        	//aos_memset(szTestBuf0,0x55,512*5);
        	aos_memset(szTestBuf,(U8)ulPara1,512*5);    //ulPara1 denote 一个十进制数据
            sd_write_multi_block(ulPara2, szTestBuf, 512*5);//ulPara2 denote SD address
            break;
            
        case 0x05:   //read from sd to mem
           	sd_mem_read(ulPara1, (U32)szTestBuf, 512*5);
           	aos_printf(MPE_DRV," mem:0 len=64");
    		debug_mem_show(MPE_DRV,(U32)szTestBuf, 64);
            aos_task_delay(10);
            
            aos_printf(MPE_DRV," mem:512 len=64");     
            debug_mem_show(MPE_DRV,(U32)szTestBuf+512, 64);
            aos_task_delay(10);
            
            aos_printf(MPE_DRV," mem:1024 len=64");     
            debug_mem_show(MPE_DRV,(U32)szTestBuf+1024, 64);
            aos_task_delay(10);
            
            aos_printf(MPE_DRV," mem:1536 len=64");     
            debug_mem_show(MPE_DRV,(U32)szTestBuf+1536, 64);
            aos_task_delay(10);
            
            aos_printf(MPE_DRV," mem:2048 len=64");     
            debug_mem_show(MPE_DRV,(U32)szTestBuf+2048, 64);
        	break;
        	
        case 0x06:         //write from mem to sd
        	aos_memset(szTestBuf,ulPara1,512*5);
        	sd_mem_write(ulPara2, (U32)szTestBuf, 512*5);        	
        	break;

        	// command test
        case 0x07:
        	switch(ulPara1)
        	{
        	    case 0x0:
        	    	aos_printf(MPE_DRV,"SPI command test.\n");
        	        aos_printf(MPE_DRV,"cmd0   test.\n");
        	        aos_printf(MPE_DRV,"cmd1   test.\n");
        	        aos_printf(MPE_DRV,"cmd55  test.\n");
        	        aos_printf(MPE_DRV,"acmd41 test.");
        	        break;
        	        
        	     case 0x01:
        	     	spi_enable_cs();
	    	     	status = sd_write_command(CMD0_GO_IDLE_STATE);  //response r1
	    	     	spi_disable_cs();
		            aos_printf(MPE_DRV,"cmd0 response is %d",status); 		            
		            break;
        	    default:
        	        break;
        	}
        	break;
        	 //test read 10 block speed
        case 0x08:        	
             clear_watch_dog();
             aos_cputick_get(&stCpuTick_read_start);
             sd_mem_read(ulPara1, (U32)szTestBuf, 512*10);
             //sd_read_block(0, TestspeedBuf0);  //read sd 0 to mem 
             aos_cputick_get(&stCpuTick_read_end);
                  
             aos_cputick_sub(&stCpuTick_read_end,&stCpuTick_read_start);
             aos_cputick_2us(&stCpuTick_read_end,&readblock_sec,&readblock_usec);
              //g_ReadBlock_usec  =readblock_usec;
             aos_printf(MPE_SYS,"read 10 block time is %dus\n", readblock_usec);
            //  aos_task_delay(50);
            break;

             //test write a block speed
        case 0x09:        
             clear_watch_dog();
             aos_memset(szTestBuf,0x55,512*10);
             aos_cputick_get(&stCpuTick_write_start);
             sd_mem_write(ulPara1, (U32)szTestBuf, 512*10);
            // sd_write_block(0x400, TestspeedBuf1);  //from szTestBuf to 0(sd),
             aos_cputick_get(&stCpuTick_write_end);            
             aos_cputick_sub(&stCpuTick_write_end,&stCpuTick_write_start);
             aos_cputick_2us(&stCpuTick_write_end,&writeblock_sec,&writeblock_usec);
            // g_WriteBlock_usec  =writeblock_usec;
             aos_printf(MPE_SYS,"write 10 block(t) time is %dus \n",writeblock_usec );
             
        	 break;
        default:
        	break;
    	}
}
        		

        	
#ifdef    __cplusplus
}
#endif    /* end of __cplusplus */

#endif   

⌨️ 快捷键说明

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