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

📄 main.c

📁 文件系统,运行硬件环境:单片机,软件环境:keilc
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include "TYPE.H"
#include "OUT.H"
#include "CH375.H"
#include "FAT.H"

/*检测外部XRAM定义*/
#define XRAM_STRAT_ADDR     0                /*定义XRAM空间开始地址*/
#define XRAM_END_SIZE       0x8000           /*定义XRAM空间大小(32K)*/

/*函数返回定义*/
#define M_OK                0X00
#define M_ERROR             0X01

/*内部辅助函数*/
/******************************************************************************/
UINT16 mem_copy(void idata *iDestination,void code *iSource )
{
UINT16  i;
UINT8 idata *td;
UINT8 code *ts;

    i=0;
    td =iDestination;
    ts =iSource;
    while((*td = *ts) !=0) /*等于0,跳出*/
    {
        td++;
        ts++;
        i++;
    }
    return i;
}/*内存数据复制*/

void show_error_code(UINT8 i)
{
    com_prints("error_code: ",0);
    com_send_arry(&i,1,1);
}/*显示错误码*/

void ini_file_buf(void)
{
static UINT8 i=0x30;
UINT16 j;

    for(j=0;j!=FAT_FILE_BUF_LEN;j++)
        fat_file_buffer[j]=i;
    i++;
}/*向FAT文件缓冲区里填入数据*/
/******************************************************************************/

/*内部功能函数*/
/******************************************************************************/
void ini_mcu_com(void)
{
UINT8 code datastr[]=__DATE__;
UINT8 code timestr[]=__TIME__;
    com_init();                  //波特率9600
    com_prints("start...",1);
    com_prints(datastr,0);
    com_prints(" ",0);
    com_prints(timestr,1);
    com_prints("FAT12/16/32 FILE SYSTEM",1);
}/*初始化串口*/

UINT8 test_xram(void)
{
#define  XBYTE ((UINT8 volatile xdata *) 0)
UINT8 t1,t2;
UINT16  i=XRAM_STRAT_ADDR;

    while(i<XRAM_END_SIZE)
    {
        t1=XBYTE[i];
        t2=t1;                      /*保存副本*/
        t1=~t1;
        XBYTE[i]=t1;
        t1=XBYTE[i];
        t1=~t1;
        if(t1!=t2)
            return M_ERROR;         /*返回错误*/
        XBYTE[i]=t1;                /*恢复后再读*/
        t1=XBYTE[i];
        if(t1!=t2)
            return M_ERROR;         /*返回错误*/
        i++;                        /*指向下一个单元*/
    }
    return M_OK;
}/*测试外部RAM工作是否正常*/

void ini_usb_mcu(void)
{
UINT8 i;

   i=mCH375Init( );
   if(i==CH_OK)
        com_prints("CH375 OK!",1);
    else
        com_prints("CH375 ERROR!",1);

    com_prints( "Wait Udisk...",1);
    while(1)
    {
        i=mWaitInterrupt();
        if(i==USB_INT_CONNECT)
            break;
    }

    i=mInitDisk( );
    if(i==CH_OK)
        com_prints("DISK OK!",1);
    else
        com_prints("DISK ERROR!",1);
}/*初始化USB*/
/******************************************************************************/

void main(void)
{
UINT8 i;
UINT32 temp32;


    DelayMs(50);    /*开机延时*/
    ini_mcu_com();  /*初始化串口*/
    i=test_xram();  /*测试外部RAM*/
    if(i==M_ERROR)
    {
       com_prints("XRAM EROR!",1);
       while(1);
    }
    p_start:
    ini_usb_mcu(); /*初始化CH375*/

    /*===================================================================
    必须首先使用fat_init函数初始化各变量,成功后才可以调用读写文件等函数
    ====================================================================*/
    i=fat_init( );
    if(i==F_OK)
        com_prints("FAT OK!",1);
    else
    {
        show_error_code(i);
        goto p_end; /*FAT错误,*/
    }

    /*===================================================================
    枚举文件
    (1) fat_fopen,打开文件(必须一次打开完成)
    注意:'*'为通配符,适用于所有文件或者子目录,只支持最后一级枚举如:\\C51\\CH375*
    或\\C51\\*.MP3,程序发现'*'则枚举文件,而不打开文件.
    ===================================================================*/
    com_prints("enum file:\\*",1);
    for(temp32=0; temp32<1000; temp32++)
    {
        mem_copy(fat_cmd.open.buffer,"\\*");
        fat_file_length =temp32;        /*枚举序号*/
        i=fat_fopen( );
        if(i!=F_OK)
        {
            show_error_code(i);
            break;
        }                               /*显示枚举到的文件名*/
        com_prints(&fat_cmd.open.buffer,1);
    }

    /*显示短文件名,对应的长文件名*/
    #if F_EN_LONG_NAME == 1 
    com_prints("show long name ...",1);
    com_prints("\\123456~1.TXT",1);
    mem_copy(fat_cmd.open.buffer,"\\123456~1.TXT");
    i=fat_fopen( );
    if(i==F_OK)
    {
        if(fat_gath_name_sign ==F_OK)   /*成功收集完此文件名的长文件名*/
        {                               /*在fat_long_name_buf中存放长文件名UNICODE编码*/
            com_prints("long file name: ",0);
            com_send_arry(&fat_long_name_buf, F_LNAME_BUF_LEN, 1);
        }
    }
    #endif
    /*===================================================================
    1.顺序读文件
    (1) fat_fopen,打开文件(必须一次打开完成)
    (2)多次fat_fread 或fat_byte_fread,读取数据
    (3)关闭文件
    ===================================================================*/
    com_prints("\\测试1.TXT",1);
    if(sizeof("\\测试1.TXT")>FAT_CMD_BUF_LEN)
    {
        com_prints("cmd error!!",1);                    /*检测路径长度是否超过缓冲区长度,防止溢出*/
        goto p_next_9;
    }                                                   /*文件名必须是大写,不能小写,但可以是汉字*/
    mem_copy(fat_cmd.open.buffer,"\\测试1.TXT");
    i=fat_fopen( );
    if(i!=F_OK)
        show_error_code(i);
    else
    {
        com_prints("fat_file_length:",0);
        com_send_arry(&fat_file_length,4,1);
        com_prints("fat_file_attr:",0);
        com_send_arry(&fat_file_attr,1,1);

        com_prints("file hex data:",1);
        temp32=(fat_file_length+511)/512;               /*计算文件占用扇区数*/
        while(temp32)
        {
            if(temp32>FAT_FILE_BUF_LEN/512)             /*文件长度大于缓冲区的长度*/
            {
                fat_cmd.read.sector=FAT_FILE_BUF_LEN/512;
                temp32-=FAT_FILE_BUF_LEN/512;           /*剩余扇区数*/
            }
            else
            {
                fat_cmd.read.sector =temp32;
                temp32=0;
            }

            i=fat_fread();                              /*读文件数据到缓冲区*/
            if(i!=F_OK)
            {
                show_error_code(i);
                goto p_next_9;
            }
                                                        /*以下处理处理数据*/
            if(temp32==0)                               /*到文件最后*/
            {
                if(fat_file_length%FAT_FILE_BUF_LEN==0) /*剩余长度刚好为缓冲取的长度*/
                    com_send_arry(&fat_file_buffer,FAT_FILE_BUF_LEN,1);
                else
                    com_send_arry(&fat_file_buffer,fat_file_length%FAT_FILE_BUF_LEN,1);
            }
            else                                        /*此处把此文件HEX数据通过串口发送出来*/
                com_send_arry(&fat_file_buffer,FAT_FILE_BUF_LEN,0);
        }
        fat_fclose();                                   /*关闭文件*/
    }
    /*===================================================================*/

    p_next_9:
    /*=====================================================================
    2.读文件的指定位置
    (1) fat_fopen,打开文件
    (2) fat_locate_sector 或fat_locate_byte,移动文件指针到指定位置
    (3) 多次fat_fread 或fat_byte_fread,读取数据
    (4) 关闭文件
    =====================================================================*/
    com_prints("open file:\\测试1.TXT",1);
    mem_copy(fat_cmd.open.buffer,"\\测试1.TXT");
    i=fat_fopen( );
    if(i!=F_OK)
    {
        show_error_code(i);
        goto p_next8;
    }

    com_prints("offset sector...",1);
    fat_cmd.locate.sector =3;                           /*0回到文件开始 如偏移"1"到到第2个扇区*/
    i =fat_locate_sector();                             /*跳过开始的两个扇区*/
    if(i!=F_OK)
    {
        show_error_code(i);
        goto p_next8;
    }

    com_prints("read data...",1);
    fat_cmd.read.sector =8;                             /*写入读取扇区数,不大于文件缓冲区长度*/
    if(fat_cmd.read.sector > FAT_FILE_BUF_LEN / 512)
        fat_cmd.read.sector = FAT_FILE_BUF_LEN / 512;   /*大于则读取文件缓冲区占用扇区数*/

    i=fat_fread();                                      /*读文件数据到缓冲区*/
    if(i!=F_OK)
    {
        show_error_code(i);
        goto p_next8;
    }

⌨️ 快捷键说明

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