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

📄 ide.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 C
字号:
/*
;*****************************************************************************************************
;*									Copyright (c) 2006 by JiaoJinXing. 
;*											All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文   件   名 : IDE.c
;* 创   建   人 : 焦进星
;* 描        述 : 磁盘驱动文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日   期  : 2008年 12 月 15 日
;* 创 建 人  : 焦进星
;* 描   述  : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email    : wyoujtg@163.com
;* Web      : http://wyoujtg.blog.163.com  
;*****************************************************************************************************
;*/

#include "minifs.h"

/*
;*****************************************************************************************************
;* 描    述 : 移植时只需完成以下三个函数
;*****************************************************************************************************
;*/

/*
;*****************************************************************************************************
;* 函数名称 : Init_IDE
;* 描    述 : 初始化IDE
;* 输 	 入 : 无
;*        
;* 输 	 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 Init_IDE(void)
{
#ifdef  WINDOWS
	return TRUE;
#endif

#ifdef  AVR_MMC

void PutStr(char *Str);


    uint16 timeout = 0;
	uint8 i = 0;
    uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95};  

	SPI_Init();

	DelayMs(500);

	/* 发送一定数量的时钟脉冲 */
	for (i = 0; i < 0x10; i++) 
    {
        SPI_SendData(0XFF);
    }

	/* 发送CMD0 */
	if (MMC_SendCMD(cmd) != 0X01)
	{
	   return FALSE;
	}

	/* 发送CMD1 */
	cmd[0] = 0X41;
	cmd[5] = 0XFF;

	while (MMC_SendCMD(cmd) != 0X00)
	{		
	    if (timeout++ > 0XFFFE)     /* 等待初始化完成 */
		{
		    return FALSE;			/* 容量大的MMC卡需要比较长时间 */
		}
	}

	SPI_HiSPD();	   				/*  提高MCU SPI速度 */

    return TRUE;
#endif

	return FALSE;
}

/*
;*****************************************************************************************************
;* 函数名称 : ReadIDESector
;* 描    述 : 读IDE指定扇区
;* 输 	 入 : SecIndex: 扇区号; Buf: 扇区内容存入的地址
;*        
;* 输 	 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 ReadIDESector(uint32 SecIndex, uint8 *Buf)
{
#ifdef  WINDOWS
	FILE *fp = fopen(DISK_MOUNT_FILE, "rb");

	if (fp != NULL)
	{
		fseek(fp, (SecIndex*512), SEEK_SET);
		fread(Buf, 1, 512, fp);
		fclose(fp);
		return TRUE;
	}
#endif

#ifdef  AVR_MMC
	uint16 i;
	uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0xff};  

	cmd[0] = 0X40 + 17;			/* READ SINGLE BLOCK */

	SecIndex = SecIndex << 9;		/* address*512,取512的整数倍 */

	cmd[1] = (SecIndex>>24);
	cmd[2] = (SecIndex>>16);
	cmd[3] = (SecIndex>>8);
	cmd[4] = (SecIndex>>0);

	if (MMC_SendCMD(cmd) != 0X00)  /* 发送CMD17 */
	{
		return FALSE;           /* 读取失败 */
	}

	while (SPI_SendData(0XFF) != 0XFE)
	{
		__asm__ __volatile__("nop");				/* 等待数据接受开始,受到0XFE表示开始 */
	}

	for (i = 0; i < 512; i++)   /* 读取数据 */
	{
		*Buf++ = SPI_SendData(0XFF);
	}
	SPI_SendData(0XFF);				/* 取走CRC字节 */

	SPI_SendData(0XFF);

	return TRUE;
#endif

	return FALSE;
}

/*
;*****************************************************************************************************
;* 函数名称 : WriteIDESector
;* 描    述 : 写IDE指定扇区
;* 输 	 入 : SecIndex: 扇区号; Buf: 要写入的内容
;*        
;* 输 	 出 : TRUE OR FALSE
;*****************************************************************************************************
;*/
uint8 WriteIDESector(uint32 SecIndex, uint8 *Buf)
{
#ifdef  WINDOWS
	FILE *fp = fopen(DISK_MOUNT_FILE, "rb+");

	if (fp != NULL)
	{
		fseek(fp, (SecIndex*512), SEEK_SET);
		fwrite(Buf, 1, 512, fp);
		fclose(fp);
		return TRUE;
	}
#endif

#ifdef  AVR_MMC
	uint16 i;
	uint8 temp;
	uint8 cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00, 0xff};  

	cmd[0] = 0x40 + 24;			/* WRITE SINGLE BLOCK */

	SecIndex = SecIndex << 9;	/* address*512,取512的整数倍 */

	cmd[1] = (SecIndex>>24);
	cmd[2] = (SecIndex>>16);
	cmd[3] = (SecIndex>>8);
	cmd[4] = (SecIndex>>0);

	if (MMC_SendCMD(cmd) != 0X00)	/* 发送CMD24 */
	{
		return FALSE;			/* 写入失败 */
	}

	SPI_SendData(0XFF);             /* 发送填冲字节 */
	SPI_SendData(0XFE);             /* 发送数据开始标志0XFE */

	for(i = 0; i < 512; i++)	/* 写入数据 */
	{
		SPI_SendData(Buf[i]);
	}

	SPI_SendData(0XFF);				/* 写入CRC字节 */
	SPI_SendData(0XFF);

	temp = SPI_SendData(0XFF);		/* 读取XXX0 0101字节 */

	temp = temp & 0X1F;

	if (temp != 0X05)
	{
		return FALSE;  			/* 写入失败 */
	}
	while (SPI_SendData(0XFF) == 0X00)
	{
		__asm__ __volatile__("nop");				/* BUSY等待 */
	}
	return TRUE;
#endif

	return FALSE;
}

/*
;*****************************************************************************************************
;*											End of File
;*****************************************************************************************************
;*/	

⌨️ 快捷键说明

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