📄 sd_base.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 + -