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

📄 sd_base.c

📁 SD卡与ARM7在SPI模式下进行数据读写原代码
💻 C
字号:
#ifndef SD_BASE_C
#define SD_BASE_C
/**************************************START OF THE FILE****************************************************************/
/************************************************************************************/
/*																					*/
/*	Copyright (C) 2004 Medeli Electric Industry Co., LTD.							*/
/*																					*/
/*	System Name	:	IC-1000															*/
/*	File   Name	:	sd_init.c														*/
/*	Revision	:	1.00															*/
/*	Date		:	2006/4/6														*/
/*					Initial version													*/
/*					Joe's work														*/
/************************************************************************************/
/*******************************Constants************************************/
/**************************Variable Declaration******************************/
/********************************Locoal**************************************/
/*******************************External*************************************/
/**************************Function Declaration******************************/
/********************************Locoal**************************************/
/*******************************External*************************************/
/***************************Start of program*********************************/
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
void sd_send_byte2(UBYTE data)
{
	sd_vars.short_timer=0;
	
	while(sd_vars.short_timer<SD_IDLE_DELAY_TIME)
	{/* 等待数据发送、接收时运行外部程序 */
		sd_exprc.normal[sd_exprc.cur_prc++]();
		
		if(sd_exprc.cur_prc>=SD_EXPRC_NUM)
		{
			sd_exprc.cur_prc=0;
		}
	}
	sio_send_byte(data);
	
	return;
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
void sd_send_byte(UBYTE data)
{
	sio_send_byte(data);
	
	return;
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
UBYTE sd_get_byte2(void)
{
	sd_vars.short_timer=0;
	
	while(sd_vars.short_timer<SD_IDLE_DELAY_TIME)
	{/* 等待数据发送、接收时运行外部程序 */
		sd_exprc.normal[sd_exprc.cur_prc++]();
		
		if(sd_exprc.cur_prc>=SD_EXPRC_NUM)
		{
			sd_exprc.cur_prc=0;
		}
	}
	return sio_read_byte();
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
UBYTE sd_get_byte(void)
{
	return sio_read_byte();
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
void sd_delay(UBYTE value)
{
	UBYTE i;

	for(i=0;i<value;i++)
	{
		sd_send_byte(0xff);
		
		if(!(i%20))
		{/* 每20次运行一次外部程序 */
			sd_exprc.normal[sd_exprc.cur_prc++]();
		
			if(sd_exprc.cur_prc>=SD_EXPRC_NUM)
			{
				sd_exprc.cur_prc=0;
			}
		}
	}
	return;
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
UBYTE sd_send_cmd(UBYTE com,UBYTE *param_pt,UBYTE app_cmd,UBYTE *resp_pt)
{
	SD_COMMAND_STRUCT *pt;

	SBYTE i;

	UBYTE temp,ret;

	pt= (app_cmd)? (SD_COMMAND_STRUCT *)(&sd_app_command[com]) : (SD_COMMAND_STRUCT *)(&sd_gen_command[com]);
	/********************************************************/
	/*				send command data						*/
	/********************************************************/
	sd_send_byte(pt->com|0x40);
	/* send command header and word */
	for(i=3;i>=0;i--)
	{/* parameters */
		sd_send_byte(param_pt[i]);
	}
#if SD_CRC_ENABLED

	sd_send_byte( sd_get_cmd_crc(pt->com|0x40,param_pt) );
	
#else
	
	sd_send_byte(0);
	
#endif
	/* send crc 7 */
	/********************************************************/
	/*					check response						*/
	/********************************************************/
	if((pt->rsp)==R1B)
	{/* if the response type is R1b, need to wait for the card to quit from busy status */
		for(i=0;i<READ_TIMEOUT_100MS;i++)
		{
			if(sd_get_byte())
			{
				break;
			}
		}
	}
	for(i=0, temp=0xff ; (i<SD_CMD_TIMEOUT)&&(temp&0x80) ; i++)
	{/* waiting for a response, the response should start with a zero bit */
		temp=sd_get_byte();
	}
	if(i>=SD_CMD_TIMEOUT)
	{/* time out */
		ret=SD_ERROR;
	}
	else
	{
		ret=SD_OK;

		resp_pt[0]=temp;
		/* save the first byte */
		for(i=1;i<sd_resp_length[pt->rsp];i++)
		{
			resp_pt[i]=sd_get_byte();
		}
	}
	sd_delay(1);
	
	return ret;
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
UBYTE sd_send_cmd_idle(UBYTE com,UBYTE *param_pt,UBYTE app_cmd,UBYTE *resp_pt)
{
	SD_COMMAND_STRUCT *pt;
	
	SBYTE i;

	UBYTE temp,ret;
	
	pt= (app_cmd)? (SD_COMMAND_STRUCT *)(&sd_app_command[com]) : (SD_COMMAND_STRUCT *)(&sd_gen_command[com]);
	/********************************************************/
	/*				send command data						*/
	/********************************************************/
	sd_send_byte2(pt->com|0x40);
	/* send command header and word */
	for(i=3;i>=0;i--)
	{/* parameters */
		sd_send_byte2(param_pt[i]);
	}
	sd_send_byte2( sd_get_cmd_crc(pt->com|0x40,param_pt) );
	/* send crc 7 */
	/********************************************************/
	/*					check response						*/
	/********************************************************/
	for(i=0, temp=0xff ; (i<SD_CMD_TIMEOUT)&&(temp&0x80) ; i++)
	{/* waiting for a response, the response should start with a zero bit */
		temp=sd_get_byte2();
	}
	if(i>=SD_CMD_TIMEOUT)
	{/* time out */
		ret=SD_ERROR;
	}
	else
	{
		ret=SD_OK;

		resp_pt[0]=temp;
		/* save the first byte */
		for(i=1;i<sd_resp_length[pt->rsp];i++)
		{
			resp_pt[i]=sd_get_byte2();
		}
	}
	sd_send_byte2(0xff);
	
	return ret;
}
/****************************************************************************/
/*	initial sd card interface												*/
/*	Function : init_sd														*/
/*		Parameters															*/
/*			Input	:	Nothing												*/
/*			Output	:	Nothing												*/
/****************************************************************************/
void sd_pack_com_para(UBYTE *para_pt,UWORD data)
{
    para_pt[3]=(UBYTE)(data>>24);

    para_pt[2]=(UBYTE)(data>>16);

    para_pt[1]=(UBYTE)(data>>8);

    para_pt[0]=(UBYTE)(data);

	return;
}
/****************************************END OF THE FILE****************************************************************/
#endif

⌨️ 快捷键说明

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