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

📄 drvsdcard.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		 MMC_Command_Exec(SD_SEND_OP_COND,0x00,EMPTY,&response);
		if (response <= 1) 
		{
			loopguard=0;
			do
			{
				MMC_Command_Exec(SD_SEND_OP_COND,0x00,EMPTY,&response);
				if(!++loopguard) break;
				DrvSYS_Delay(50);
			}while(response!=0);
			if(!loopguard) return;
			SDtype=SDv1;	/* SDv1 */
			DBG_PRINTF("SDv1\n");
		} else 
		{
			loopguard=0;
			do
			{
				MMC_Command_Exec(SEND_OP_COND,0x00,EMPTY,&response);
				if(!++loopguard) break;
				DrvSYS_Delay(50);
			}while(response!=0);
			if(!loopguard) return;
			SDtype=MMCv3;	/* MMCv3 */
			DBG_PRINTF("MMCv3\n");
		}
		MMC_Command_Exec(SET_BLOCKLEN,(uint32_t)PHYSICAL_BLOCK_SIZE,EMPTY,&response);
	}
	if(MMC_Command_Exec(SEND_CSD,EMPTY,pchar,&response)==FALSE)
		return;

  	if(response==0) 
	{
    	DBG_PRINTF("Change speed:");
    	for(i=0;i<16;i++) {	DBG_PRINTF("0x%X ",pchar[i]);}

  	} else {
    	DBG_PRINTF("CARD STATUS 0x%X:\n",response);
  		for(i=0;i<16;i++) {	DBG_PRINTF("0x%X ",pchar[i]);}
    	LogicSector=0;
    	return;
  	}

 	if(SDtype&SDBlock)// Determine the number of MMC sectors;
	{
		bl_len = 1 << (pchar[5] & 0x0f) ;
		c_size = ((pchar[7] & 0x3F) << 16) |(pchar[8] << 8) | (pchar[9]);
		LogicSector=c_size*((512*1024)/bl_len);
	}else
	{
	  	bl_len = 1 << (pchar[5] & 0x0f) ;
  		c_size = ((pchar[6] & 0x03) << 10) |(pchar[7] << 2) | ((pchar[8] &0xc0) >> 6);
  		c_mult = (((pchar[9] & 0x03) << 1) | ((pchar[10] & 0x80) >> 7));
		LogicSector=(c_size+1)*(1 << (c_mult+2))*(bl_len/512);
  	}                                     
		DBG_PRINTF("\nLogicSector:%d, PHYSICAL_SIZE:%dMB\n",LogicSector,(LogicSector/2/1024));

  	loopguard = 0;
  	while((MMC_Command_Exec(READ_SINGLE_BLOCK,0,0,&response)==FALSE)) {
    	if(!++loopguard) break;
  	} 
  	Is_Initialized = 1;
}					  
/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 DrvSDCARD_Open                                                                            */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               E_DRVSDCARD_INITIAL_FAIL    Intial SDCARD Failed                                          */
/*               E_SUCCESS			         Success                                                       */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to Open GPIO function and intial SDCARD                             */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_Open(void)
{
	uint32_t Temp[2];
	Temp[0]=0xFFFFFFFF;
	Temp[1]=Temp[0];
    DrvSYS_SetIPClock(E_SYS_SPI1_CLK,1);
    DrvGPIO_InitFunction(E_FUNC_SPI1); // enable SPI funztion and pin 
    
	DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
	DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
	DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
	DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
	DrvSPI_SetTxRegister(eDRVSPI_PORT1,Temp,2);
	DrvSPI_SetClockFreq(eDRVSPI_PORT1,300000,300000);
    MMC_FLASH_Init();
    DrvSYS_Delay(1000);
	DrvSPI_SetClockFreq(eDRVSPI_PORT1,12000000,12000000);

	if (Is_Initialized)
	{
		DBG_PRINTF("SDCARD INIT OK\n\n");
		return E_SUCCESS;
	}
	else
		return E_DRVSDCARD_INITIAL_FAIL;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 DrvSDCARD_Close                                                                           */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               None		                                                                               */
/*               			                                                                               */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to close SDCARD                                                     */
/*---------------------------------------------------------------------------------------------------------*/
void DrvSDCARD_Close(void)
{
	DrvSPI_Close(eDRVSPI_PORT1);
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 DrvSDCARD_GetCardSize                                                                     */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               PUINT32 pu32TotSecCnt                                                                     */
/*               			                                                                               */
/* Returns:                                                                                                */
/*               TRUE	The size is already saved in arg1                                                  */
/*               FALSE	The size is zero                                                                   */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to get card total sector after SDCARD is opened                     */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_GetCardSize(uint32_t* pu32TotSecCnt)
{
	if (LogicSector == 0)
		return FALSE;
	else 
		*pu32TotSecCnt = LogicSector;

	return TRUE;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 GetLogicSector                                                                            */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*               			                                                                               */
/* Returns:                                                                                                */
/*               The Logic Sector size                                                                     */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to get card total sector after SDCARD is opened                     */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t GetLogicSector(void)
{
	return LogicSector;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 DrvSDCARD_GetVersion                                                                      */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               None                                                                                      */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               SDCARD Library Version                                                                    */
/*               			                                                                               */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to Get SD driver version                                            */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_GetVersion(void)
{
	return (DRVSDCARD_MAJOR_NUM << 16) | (DRVSDCARD_MINOR_NUM << 8) | DRVSDCARD_BUILD_NUM;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 SpiRead                                                                                   */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               uint32_t addr		Set start address for LBA                                              */
/*               uint32_t size      Set data size (byte)                                                   */
/*               uint32_t buffer    Set buffer pointer                                                     */
/*																		                                   */
/* Returns:                                                                                                */
/*               SDCARD Library Version                                                                    */
/*               			                                                                               */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to Get data from SD card                                            */
/*---------------------------------------------------------------------------------------------------------*/
void SpiRead(uint32_t addr, uint32_t size, uint8_t* buffer)
{
    /* This is low level read function of USB Mass Storage */
	uint32_t response;
	if(SDtype&SDBlock)
	{

		while(size >= PHYSICAL_BLOCK_SIZE)
		{
			while(MMC_Command_Exec(READ_SINGLE_BLOCK,addr,buffer,&response)==FALSE);
			addr   ++;
			buffer += PHYSICAL_BLOCK_SIZE;
			size  -= PHYSICAL_BLOCK_SIZE;
		}

	}else
	{
		addr*=PHYSICAL_BLOCK_SIZE;
		while(size >= PHYSICAL_BLOCK_SIZE)
		{
			while(MMC_Command_Exec(READ_SINGLE_BLOCK,addr,buffer,&response)==FALSE);
			addr   += PHYSICAL_BLOCK_SIZE;
			buffer += PHYSICAL_BLOCK_SIZE;
			size  -= PHYSICAL_BLOCK_SIZE;
		}
	}
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function: 	 SpiWrite                                                                                  */
/*                                                                                                         */
/* Parameters:                                                                                             */
/*               uint32_t addr		Set start address LBA                                                  */
/*               uint32_t size      Set data size (byte)                                                   */
/*               uint32_t buffer    Set buffer pointer                                                     */
/*																		                                   */
/* Returns:                                                                                                */
/*               SDCARD Library Version                                                                    */
/*               			                                                                               */
/*                                                                                                         */
/* Side effects:                                                                                           */
/* Description:                                                                                            */
/*               This function is used to store data into SD card                                          */
/*---------------------------------------------------------------------------------------------------------*/
void SpiWrite(uint32_t addr, uint32_t size, uint8_t* buffer)
{
	uint32_t response;
	if(SDtype&SDBlock)
	{
		while(size >= PHYSICAL_BLOCK_SIZE)
		{
			while(MMC_Command_Exec(WRITE_BLOCK,addr,buffer,&response)==FALSE);
			addr   ++;
			buffer += PHYSICAL_BLOCK_SIZE;
			size  -= PHYSICAL_BLOCK_SIZE;
		}
	}else
	{
		addr*=PHYSICAL_BLOCK_SIZE;
		while(size >= PHYSICAL_BLOCK_SIZE)
		{
			while(MMC_Command_Exec(WRITE_BLOCK,addr,buffer,&response)==FALSE);
			addr   += (PHYSICAL_BLOCK_SIZE);
			buffer += PHYSICAL_BLOCK_SIZE;
			size  -= PHYSICAL_BLOCK_SIZE;
		}
	}
}




⌨️ 快捷键说明

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