Beispiel #1
0
static BYTE SD_reset(void)
{
	BYTE i;
	BYTE retry;
	BYTE rev = 0x00;
	
	for(i=0; i<10; i++)
	{
		DSPI_send_8_clocks();	//至少74个时钟,必须的!!!
	}
	//SD卡复位
	//发送CMD0,正常跳出表示成功进入idle状态
	for(retry=0; rev!=0x01; retry++)
	{
		rev = SD_send_cmd(0, 0);	//发idle命令【?】
		if(retry>100)
		{
			return 1;
		}
	}
	//SD卡初始化(CMD1/CMD55+ACMD41两种方法)
	for(retry=0; rev!=0x00; retry++)
	{
		rev = SD_send_cmd(1, 0);	//发idle命令
		if(retry>100)
		{
			return 2;
		}
	}
	rev = SD_send_cmd(59, 0);	//关crc
	rev = SD_send_cmd(16, 512);	//设扇区大小512
	
	return 0;	//正常返回
}
Beispiel #2
0
//----------------by-JJ----------------//
BYTE SD_read_multiple_block(DWORD sector, DWORD n, BYTE buffer[][SD_SECTOR_SIZE])
{
	BYTE rev;          
	WORD i;
	DWORD j;
	
	rev = SD_send_cmd(18, sector<<9);
	if(rev != 0x00)
	{
		return rev;
	}
	for (j=0; j<n; j++)
	{
		while(DSPI_read_write_byte(0xFF) != 0xFE){}
		for(i=0; i<SD_SECTOR_SIZE; i++)
		{
			buffer[j][i] = DSPI_read_write_byte(0xFF);
		}
		DSPI_read_write_byte(0xFF);
		DSPI_read_write_byte(0xFF);  
	}
	SD_send_cmd(12, 0);	//发送STOP_TRANSMISSION
	DSPI_send_8_clocks();
	
	return 0;
}
Beispiel #3
0
//----------------by-徐博----------------//
BYTE SD_write_block(DWORD sector, const BYTE *buffer)	//sector=address,buffer=数据缓存区
{
	BYTE rev;
	WORD i;
	
	rev = SD_send_cmd(24, sector<<9);	//写命令,sector<<9:将地址左移9位,address=address*512,将块地址(扇区地址)转为字节地址
	if(rev != 0x00)
	{
		return rev;	//收到0x00表示成功
	}
	DSPI_read_write_byte(0xff);
	DSPI_read_write_byte(0xff);
	DSPI_read_write_byte(0xff);
	DSPI_read_write_byte(0xfe);	//发开始符

	for(i=0; i<SD_SECTOR_SIZE; i++)	//送512字节数据
	{
		DSPI_read_write_byte(*buffer++);
	}
	
	DSPI_read_write_byte(0xFF);	//写入2个字节的CRC校验码,Don't care
	DSPI_read_write_byte(0xFF);

	rev = DSPI_read_write_byte(0xFF);	//读取返回值
	if((rev&0x1f) != 0x05)	//若返回值为XXX00101,说明数据已经被SD卡接受
	{
		return rev;	//写入失败
	}
	//等待操作完
	while(!DSPI_read_write_byte(0xFF)){}	//等待SD卡不忙
	DSPI_send_8_clocks();	//按SD卡操作时序补8个时钟
	
	return 0;	//说明写扇区操作成功
}
Beispiel #4
0
//----------------by-徐博----------------//
BYTE SD_read_block(DWORD sector, BYTE *buffer)	//sector=address,buffer=数据缓冲区
{
	BYTE rev;          
	WORD i;
	
	rev = SD_send_cmd(17, sector<<9);  //读命令,发送CMD17,收到0x00表示成功 	
	if(rev != 0x00)
	{
		return rev;
	}
	
	//等数据的开始
	while(DSPI_read_write_byte(0xFF) != 0xFE){}//连续读直到读到开始字节0xfe
	for(i=0; i<SD_SECTOR_SIZE; i++)	//读512个数据,写入数据缓冲区
	{
		*buffer++ = DSPI_read_write_byte(0xFF);
	}
	DSPI_read_write_byte(0xFF);	//读两个CRC字节
	DSPI_read_write_byte(0xFF);  
	DSPI_send_8_clocks();	//按时序补8个时钟
	
	return 0;	//读取操作成功
}
Beispiel #5
0
//----------------by-JJ----------------//
BYTE SD_write_multiple_block(DWORD sector, DWORD n, const BYTE buffer[][SD_SECTOR_SIZE])
{
	BYTE rev;
	WORD i;
	DWORD j;
	
	rev = SD_send_cmd(25, sector<<9);
	if(rev != 0x00)
	{
		return rev;
	}
	DSPI_read_write_byte(0xff);
	DSPI_read_write_byte(0xff);
	for(i=0; i<n; i++)
	{
		DSPI_read_write_byte(0xfc);
		for(j=0; j<SD_SECTOR_SIZE; j++)
		{
			DSPI_read_write_byte(buffer[i][j]);
		}
		DSPI_read_write_byte(0xFF);
		DSPI_read_write_byte(0xFF);
		rev = DSPI_read_write_byte(0xFF);
		if((rev&0x1f) != 0x05)
		{
			return rev;
		}
		while(!DSPI_read_write_byte(0xFF)){}
	}
	DSPI_read_write_byte(0xfb);
	while(!DSPI_read_write_byte(0xFF)){}
	//SD_send_cmd(12, 0);	//这句话导致后续的多扇区读出错
	DSPI_send_8_clocks();
	
	return 0;
}
Beispiel #6
0
char write_string_to_files(uchar * data)
{
	int waitCnt=0;
	int maxWaitCnt = 100000;


	NORMALTIME time;
	uchar fileName[30];//本来只有13长度,怕越界了
	time = Time_GetTime();
	sprintf(fileName,"%02d%02d%02d%02d.txt",time.tm_year-2000,time.tm_mon,time.tm_mday,time.tm_hour);
	
	
	//①获取系统状态  
	//----------------------------------------------------------------------------
	waitCnt=0;
	while(IS_SD_BUSY)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 7;
		}
	};//先判断SD是否忙

	SD_read_system();//上电后串口第一个字节发不出去
	SD_read_system();
	//等待状态
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt = 0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 1;
		}
	};
	if((SD_cmd_return_byte & 0xCF) == 0x0D)//没有文件打开
	{
	}
	else if((SD_cmd_return_byte & 0xCF) == 0x1D)//已经有文件打开 则关闭
	{
		SD_close_file();
		while(IS_SD_BUSY);
	}
	else
	{
		return SD_cmd_return_byte;
	}

	//②创建文件
	//----------------------------------------------------------------------------
	SD_send_cmd(SD_CREATE,13,fileName);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;
	
	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 2;
		}
	};

	while(IS_SD_BUSY);
	
	//③打开文件
	//----------------------------------------------------------------------------
	SD_send_cmd(SD_OPEN,13,fileName);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 3;
		}
	};

	while(IS_SD_BUSY);
	
	//④写入文件
	//----------------------------------------------------------------------------
	SD_send_data(SD_WRITE,strlen(data)+4,0xffffffff,data);
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 4;
		}
	};

	while(IS_SD_BUSY);
	
	//⑤保存文件
	//---------------------------------------------------------------------------- 
	SD_save_file();//保存文件
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;
	
	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 5;
		}
	};
	while(IS_SD_BUSY);

	//⑥关闭文件
	//---------------------------------------------------------------------------- 
	SD_close_file();//关闭文件
	F_wait_response = 0x01;
	SD_cmd_return_byte = 0;

	waitCnt=0;
	while(F_wait_response)
	{
		waitCnt++;
		if(waitCnt>maxWaitCnt)
		{
			return 6;
		}
	};
	while(IS_SD_BUSY);

	return 0;
}