📄 main.c
字号:
#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 + -