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