#include \公众datatype.h\"大众#include \"大众console.h\"大众#include \公众44b0x.h\"大众#include <string.h> / 以下定义的详细解释请看CH375HF9.H文件 /#define LIB_CFG_FILE_IO 1 / 文件读写的数据的复制办法,0为\"大众外部子程序\"大众,1为\"大众内部复制\"大众 /#define LIB_CFG_INT_EN 1 / CH375的INT#引脚连接办法,接s3c44b0x外部中断2引脚\"大众 // 单片机的RAM有限,个中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 /#define FILE_DATA_BUF_LEN 0x2000 / 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 /#include \"大众CH375HF9.H\"大众#define CH375Cmd (volatile U8 )(0x4000001) /总线办法/ #define CH375Dat (volatile U8 )(0x4000000)extern U32 MCLK;/ CH375 主机文件系统接口// 支持: FAT12/FAT16/FAT32 // ARM单片机C措辞的U盘文件读写示例程序 // 该程序将U盘中的/C51/CH375HFT.C文件中的小写字母转成大写字母后, 写到新建的文件NEWFILE.TXT中, 如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 并新建NEWFILE.TXT文件并写入提示信息, 如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 并新建NEWFILE.TXT文件并写入提示信息// CH375的INT#引脚采取查询办法处理, 数据复制办法为\"大众内部复制\公众, 本程序适用于s3c44b0x单片机, 串口0输出监控信息,57600bps // ENDIAN = \"大众little\"大众 /void mDelay1_2uS( ) / 至少延时1.2uS,根据单片机主频调度 /{UINT32 i;for ( i = 30; i != 0; i -- );}void __irq CH375Interrupt( void ) / CH375中断做事程序,由CH375的INT#的低电平或者低落沿触发单片机中断 /{ rEXTINTPND=0xf; //clear EXTINTPND reg. rI_ISPC=BIT_EINT2; //clear pending_bit xWriteCH375Cmd( CMD_GET_STATUS ); / 获取中断状态并取消中断要求 /CH375IntStatus = xReadCH375Data( ); / 获取中断状态 /if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; / 检测到USB设备断开事宜 /else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; / 检测到USB设备连接事宜 /}extern void CH375Interrupt( void );void CH375_PORT_INIT( ) /初始化 /{ rINTCON=0x5;rINTMOD=0x0; //All=IRQ moderPDATG=0xff; rPCONG=0xffff; rPUPG=0x0; //should be enabled rEXTINT=0x0; pISR_EINT2 = (unsigned)CH375Interrupt; rINTMSK=~(BIT_GLOBAL|BIT_EINT2); //start INT}void xWriteCH375Cmd( UINT8 mCmd ) / 外部定义的被CH375程序库调用的子程序,向CH375写命令 /{mDelay1_2uS( ); mDelay1_2uS( ); / 至少延时1uS /CH375Cmd = mCmd;mDelay1_2uS( ); mDelay1_2uS( ); / 至少延时2uS /}void xWriteCH375Data( UINT8 mData ) / 外部定义的被CH375程序库调用的子程序,向CH375写数据 /{CH375Dat = mData mDelay1_2uS( ); / 至少延时1.2uS /}UINT8 xReadCH375Data( void ) / 外部定义的被CH375程序库调用的子程序,从CH375读数据 /{UINT8 mData;mDelay1_2uS( ); / 至少延时1.2uS /mData = (UINT8)CH375Dat; return( mData );}/ 延时指定毫秒韶光,根据单片机主频调度,禁绝确 /void mDelaymS( UINT32 ms ){UINT32 i;while ( ms -- ) for ( i = 25000; i != 0; i -- );}/ 检讨操作状态,如果缺点则显示缺点代码并停机 /void mStopIfError( UINT8 iError ){if ( iError == ERR_SUCCESS ) return; / 操作成功 /printf( \公众Error: %02X\n\"大众, (UINT16)iError ); / 显示缺点 /while ( 1 ) {mDelaymS( 100 );}}/ 为printf和getkey输入输出初始化串口 /void mInitSTDIO( ){} U16 SERIAL_BAUD = 57600;char table_begin[] = \"大众//\n\公众;void ShowSysClock(int argc, char argv[]){printf(\"大众System is running @%dHz\n\"大众, MCLK); }int Main(void){unsigned char t;UINT8 i, c, SecCount;UINT16 NewSize, count; / 由于RAM容量有限,以是NewSize限定为16位,实际上如果文件较大,该当分几次读写并且将NewSize改为UINT32以便累计 /UINT8 pCodeStr; ChangePllValue(24, 6, 1); Port_Init();console_init(57600); next_line();puts(table_begin); puts(\"大众Usb for S3C44B0x\n\公众);ShowSysClock(0, NULL); printf(\公众Serial Baud rate is %d\n\"大众, SERIAL_BAUD);next_line();puts(table_begin);puts(\公众System Initialized.\n\"大众); mDelaymS( 50 ); / 延时100毫秒 /printf( \"大众测试CH375是否正常\n\公众 );mDelaymS(60 ); / 延时50ms /printf(\"大众\nCH375_Init完成!!\"大众);i = CH375LibInit( ); / 初始化CH375程序库和CH375芯片,操作成功返回0 /mStopIfError( i );/ 其它电路初始化 / CH375_PORT_INIT( );while ( 1 ) {printf( \公众\n请插入U盘!\n\"大众 ); while ( CH375DiskStatus != DISK_CONNECT ) / 查询CH375中断并更新中断状态,等待U盘插入 /mDelaymS( 10 );/ 检讨U盘是否准备好,有些U盘不须要这一步,但是某些U盘必须要实行这一步才能事情 /for ( i = 0; i < 10; i ++ ) { / 有的U盘总是返回未准备好,不过可以被忽略 /printf( \"大众Ready ?\n\公众 );if ( CH375DiskReady( ) == ERR_SUCCESS ) break; / 查询磁盘是否准备好 /}/ 查询磁盘物理容量 /printf( \公众DiskSize\n\"大众 );i = CH375DiskSize( ); mStopIfError( i );printf( \"大众TotalSize = %d MB \n\"大众, (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) );/ 读取原文件 /printf( \"大众Open\n\"大众 );strcpy( (char )mCmdParam.Open.mPathName, \"大众\C51\CH375HFT.C\"大众 ); / 文件名,该文件在C51子目录下 /i = CH375FileOpen( ); / 打开文件 /if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { / 没有找到文件 // 列出文件 /if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 )\公众\\公众; / C51子目录不存在则列出根目录下的文件 /else pCodeStr = (UINT8 )\"大众\C51\CH375\公众; / CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 /printf( \公众List file %s\n\"大众, pCodeStr );for ( c = 0; c < 255; c ++ ) { / 最多搜索前255个文件 /strcpy( (char )mCmdParam.Open.mPathName, (char )pCodeStr ); / 搜索文件名,为通配符,适用于所有文件或者子目录 /i = strlen( (char const )mCmdParam.Open.mPathName ); / 打算文件名长度,以处理文件名结束符 /mCmdParam.Open.mPathName[ i ] = c; / 根据字符串长度将结束符更换为搜索的序号,从0到255 /i = CH375FileOpen( ); / 打开文件,如果文件名中含有通配符,则为搜索文件而不打开 /if ( i == ERR_MISS_FILE ) break; / 再也搜索不到匹配的文件,已经没有匹配的文件名 /if ( i == ERR_FOUND_NAME ) { / 搜索到与通配符相匹配的文件名,文件名及其完全路径在命令缓冲区中 /printf( \"大众 match file %03d#: %s\n\"大众, (unsigned int)c, mCmdParam.Open.mPathName ); / 显示序号和搜索到的匹配文件名或者子目录名 /continue; / 连续搜索下一个匹配的文件名,下次搜索时序号会加1 /}else { / 出错 /mStopIfError( i );break;}}pCodeStr = (UINT8 )\"大众找不到/C51/CH375HFT.C文件\xd\n\"大众;for ( i = 0; i != 255; i ++ ) {if ( ( FILE_DATA_BUF = pCodeStr ) == 0 ) break;pCodeStr++;}NewSize = i; / 新文件的长度 /SecCount = 1; / (NewSize+511)/512, 打算文件的扇区数,由于读写因此扇区为单位的 /}else { / 找到文件或者出错 /mStopIfError( i );/ printf( \公众Query\n\公众 );i = CH375FileQuery( ); 查询当前文件的信息mStopIfError( i );/printf( \"大众Read\n\"大众 );if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { / 由于演示板用的62256只有32K字节,个中CH375子程序用512字节,以是只读取不超过63个扇区,也便是不超过32256字节 /SecCount = FILE_DATA_BUF_LEN / 512; / 由于演示板用的62256只有32K字节,个中CH375子程序用512字节,以是只读取不超过63个扇区,也便是不超过32256字节 /NewSize = FILE_DATA_BUF_LEN; / 由于RAM有限以是限定长度 /}else { / 如果原文件较小,那么利用原长度 /SecCount = ( CH375vFileSize + 511 ) >> 9; / (CH375vFileSize+511)/512, 打算文件的扇区数,由于读写因此扇区为单位的,先加511是为了读出文件尾部不敷1个扇区的部分 /NewSize = (UINT16)CH375vFileSize; / 原文件的长度 /}printf( \"大众Size=%ld, Len=%d, Sec=%d\n\"大众, CH375vFileSize, NewSize, (UINT16)SecCount );mCmdParam.Read.mSectorCount = SecCount; / 读取全部数据,如果超过60个扇区则只读取60个扇区 // current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制办法为\"大众外部子程序\"大众,那么须要设置存放数据的缓冲区的起始地址 /CH375vFileSize += 511; / 默认情形下,以扇区办法读取数据时,无法读出文件尾部不敷1个扇区的部分,以是必须临时加大文件长度以读取尾部零头 /i = CH375FileRead( ); / 从文件读取数据 /CH375vFileSize -= 511; / 恢复原文件长度 /mStopIfError( i );/如果文件比较大,一次读不完,可以再调用CH375FileRead连续读取,文件指针自动向后移动while ( 1 ) {c = 32; 每次读取32个扇区mCmdParam.Read.mSectorCount = c; 指定读取的扇区数CH375FileRead(); 读完后文件指针自动后移处理数据if ( mCmdParam.Read.mSectorCount < c ) break; 实际读出的扇区数较小则解释文件已经结束} 如果希望从指定位置开始读写,可以移动文件指针mCmdParam.Locate.mSectorOffset = 3; 跳过文件的前3个扇区开始读写i = CH375FileLocate( );mCmdParam.Read.mSectorCount = 10;CH375FileRead(); 直接读取从文件的第(5123)个字节开始的数据,前3个扇区被跳过 如果希望将新数据添加到原文件的尾部,可以移动文件指针i = CH375FileOpen( );mCmdParam.Locate.mSectorOffset = 0xffffffff; 移到文件的尾部,以扇区为单位,如果原文件是3字节,则从512字节开始添加i = CH375FileLocate( );mCmdParam.Write.mSectorCount = 10;CH375FileWrite(); 在原文件的后面添加数据/printf( \公众Close\n\"大众 );i = CH375FileClose( ); / 关闭文件 /mStopIfError( i ); i = FILE_DATA_BUF[100];FILE_DATA_BUF[100] = 0; / 置字符串结束标志,最多显示500个字符 /printf( \"大众Line 1: %s\n\"大众, FILE_DATA_BUF ); FILE_DATA_BUF[100] = i; / 恢复原字符 /for ( count=0; count < NewSize; count ++ ) { / 将文件中的小写字符转换为大写 /c = FILE_DATA_BUF[ count ];if ( c >= 'a' && c <= 'z' ) FILE_DATA_BUF[ count ] = c - ( 'a' - 'A' );}}#ifdef EN_DISK_WRITE / 子程序库支持写操作 // 产生新文件 /printf( \"大众Create\n\"大众 );strcpy( (char )mCmdParam.Create.mPathName, \"大众\NEWFILE.TXT\"大众 ); / 新文件名,在根目录下 /i = CH375FileCreate( ); / 新建文件并打开,如果文件已经存在则先删除后再新建 /mStopIfError( i );printf( \公众Write\n\公众 );mCmdParam.Write.mSectorCount = SecCount; / 写入所有扇区的数据 // current_buffer = & FILE_DATA_BUF[0]; 如果文件读写的数据的复制办法为\"大众外部子程序\"大众,那么须要设置存放数据的缓冲区的起始地址 /i = CH375FileWrite( ); / 向文件写入数据 /mStopIfError( i );printf( \"大众Modify\n\公众 );mCmdParam.Modify.mFileAttr = 0xff; / 输入参数: 新的文件属性,为0FFH则不修正 /mCmdParam.Modify.mFileTime = 0xffff; / 输入参数: 新的文件韶光,为0FFFFH则不修正,利用新建文件产生的默认韶光 /mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); / 输入参数: 新的文件日期: 2004.05.18 /mCmdParam.Modify.mFileSize = NewSize; / 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 /i = CH375FileModify( ); / 修合法前文件的信息,修正日期和长度 /mStopIfError( i );printf( \"大众Close\n\"大众 );mCmdParam.Close.mUpdateLen = 0; / 不要自动打算文件长度,如果自动打算,那么该长度总是512的倍数 /i = CH375FileClose( );mStopIfError( i );/ 删除某文件 // printf( \"大众Erase\n\公众 );strcpy( (char )mCmdParam.Create.mPathName, \"大众\OLD\公众 ); 将被删除的文件名,在根目录下i = CH375FileErase( ); 删除文件并关闭if ( i != ERR_SUCCESS ) printf( \"大众Error: %02X\n\公众, (UINT16)i ); 显示缺点// 查询磁盘信息 /printf( \"大众Disk\n\公众 );i = CH375DiskQuery( );mStopIfError( i );printf( \"大众Fat=%d, Total=%ld, Free=%ld\n\"大众, (UINT16)mCmdParam.Query.mDiskFat, mCmdParam.Query.mTotalSector, mCmdParam.Query.mFreeSector );#endif mDelaymS(200 );printf( \"大众请拔出U盘!\n\"大众 );while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); / 查询CH375中断并更新中断状态,等待U盘拔出 /mDelaymS( 200 );}}