📄 interface.c
字号:
#define IN_FLOPPY
#include "SYS_Config.h"
#include "FS_Config.h"
#include "SD_Drive.h"
#include "USART1.h"
#include "fat.h"
extern INT8U Data_Buf[SD_BLOCKSIZE];//在main函数中定义
INT32U GetVolumeFirstSect(INT8U Device)
{
INT8U *buffer;
INT32U RelaStaSect ;
Device=Device;
buffer=Data_Buf;
/* 从SD卡中读一个块 */
//INT8U SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
if( SD_ReadBlock(0x00,buffer)!=0 )
return DISK_INIT_NOT_OK ;
if( (buffer[510]==0x55)&&(buffer[511]==0xAA) )
{
if( ( (buffer[0]==0xEB)&&(buffer[2]==0x90) ) || (buffer[0]==0xE9) )
RelaStaSect=0 ;
else
{
//RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])<<8+(INT32U)(buffer[456])<<16+(INT32U)(buffer[457])<<24;//为何不行???
//RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])*0x100+(INT32U)(buffer[456])*0x10000+(INT32U)(buffer[457])*0x1000000;
RelaStaSect=(INT32U)(buffer[454])+
(INT32U)(buffer[455])*0x100+
(INT32U)(buffer[456])*0x10000+
(INT32U)(buffer[457])*0x1000000;
}
}
return RelaStaSect ;
}
/*********************************************************************************************************
** 函数名称: SDCommand
** 功能描述: 底层驱动程序与上层的接口程序
** 输 入: DISK_INIT:驱动程序初始化
** DISK_CLOSE:关闭驱动器(移除驱动程序)
** DISK_CREATE_BOOT_SECTOR:重建引导扇区
** DISK_READ_SECTOR:读扇区
** DISK_WRITE_SECTOR:写扇区
** 输 出: DISK_READ_OK:读扇区完成
** DISK_READ_NOT_OK:读扇区失败
** DISK_WRITE_OK:写扇区完成
** DISK_WRITE_NOT_OK:写扇区失败
** DISK_INIT_OK:初始化完成
** DISK_INIT_NOT_OK:初始化失败
** BAD_DISK_COMMAND:无效的命令
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
INT16U SD_Command(INT8U Command,void *Parameter)
{
INT16U rt ;
Disk_RW_Parameter *Dp ;
Disk_Info *DiskInfo ;
Dp=(Disk_RW_Parameter*)Parameter ;
switch(Command)
{
case DISK_INIT :/*设备初始化*/
rt=DISK_INIT_NOT_OK ;
{
DiskInfo=GetEmptyDiskInfoAddr();
if(DiskInfo!=NULL)
{
DiskInfo->DiskCommand=SD_Command ;
DiskInfo->RsvdForLow=GetVolumeFirstSect(0);
/*获取卷首扇区*/
if(DiskInfo->RsvdForLow==DISK_INIT_NOT_OK)
rt=DISK_INIT_NOT_OK;
else
rt=DISK_INIT_OK;
}
}
break ;
case DISK_CLOSE :
rt=RETURN_OK;
break ;
case DISK_READ_SECTOR : /*读扇区*/
rt=DISK_READ_NOT_OK ;
/* 从SD卡中读一个块 */
//INT8U SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
if( SD_ReadBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
{
rt=DISK_READ_OK ;
//FS调试用
#if FS_DEBUG_EN
#if USART1_EN
{
Uart1_SendString("\nFS Reading Logic Sector :");//调试用,数据区开始扇区号
PUT_INT32U_DecTOString(Dp->SectorIndex);
}
#endif
#endif
}
break ;
case DISK_WRITE_SECTOR :/*写扇区*/
rt=DISK_WRITE_NOT_OK ;
/* 向SD卡中写入一个块 */
//INT8U SD_WriteBlock(INT32U blockaddr,INT8U *recbuf);
if( SD_WriteBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
{
rt=DISK_WRITE_OK ;
//FS调试用
#if FS_DEBUG_EN
#if USART1_EN
{
Uart1_SendString("\nFS Writing Logic Sector :");//调试用,数据区开始扇区号
PUT_INT32U_DecTOString(Dp->SectorIndex);
}
#endif
#endif
}
break ;
default :rt=BAD_DISK_COMMAND ; break ;
}
return rt ;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -