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

📄 main.c

📁 基于ARM的单片机读写U盘文件(ADS)
💻 C
字号:
/* ARM单片机C语言的U盘文件读写程序 */
/* 该程序将U盘中的/ARM/TEST.TXT文件中的前10个字符显示出来,
   并且将一个字符串写入新建的文件"NEWFILE.TXT"中*/
/* CH375的INT#引脚采用查询方式处理, 数据复制方式为"内部复制"*/

					
#include "lpc2368.h"
#include <string.h>
#include <stdio.h>

/* 以下定义的详细说明请看CH375HF9.H文件 */
#define LIB_CFG_FILE_IO			1		/* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
#define LIB_CFG_INT_EN			0		/* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

#define CH375_INT_WIRE		    ( FIO0PIN0 & 0x08 )	/* P0.3, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
#include "CH375HF9.H"
/*       P0.3                 INT#
         P0.4                 A0
         P0.7                 CS#
         P0.6                 WR#
         P0.5                 RD#
         P2.7-P2.0        D7-D0       */
  
void mDelay1_2uS()  
{
	UINT32	i;
	for ( i = 20; i != 0; i -- ); 
}

void mDelay02uS() 
{
	UINT32	i;
	for ( i = 2; i != 0; i -- );  
}

void CH375_PORT_INIT(void)  /* 由于使用通用I/O模拟并口读写时序,所以进行初始化 */
{   
   
    PINSEL10 = 0; //ETM禁能
      
    FIO0DIR0 = 0xF7;  /* 设置默认CS,WR,RD,A0为输出,INT#为输入 */
	FIO0SET0 = 0xE0;  /* 设置CS,WR,RD默认为高电平 */
	FIO2DIR0 = 0x00;  /* 设置8位并口为输入 */
}

void xWriteCH375Cmd( UINT8 mCmd )		/* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */
{
	mDelay1_2uS();mDelay1_2uS( );   /* 至少延时1uS */
	FIO2DIR0 = 0xFF;
	FIO2CLR0 = 0xFF;
    FIO2SET0 = mCmd; 
    FIO0DIR0 = 0xF7; 
    FIO0SET0 = 0x10;  /* 向CH375的并口输出命令, 输出A0(P0.4)=1; */
    FIO0CLR0 = 0x80;//  CS(P0.7)=0;
    FIO0CLR0 = 0x40;  /* 输出有效写控制信号, WR=(P0.6)=0;  */
    mDelay02uS(); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
    FIO0SET0 = 0xC0;  /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=1; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */
	FIO0CLR0 = 0x10;  /* 输出A0(P0.4)=0; 可选操作 */
	FIO0DIR0 = 0x00;  /* 禁止数据输出 */
	mDelay1_2uS();	mDelay1_2uS( );  /* 至少延时2uS */  
}

void xWriteCH375Data( UINT8 mData )		/* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
{
	mDelay1_2uS();  /* 至少延时1uS */
	FIO2DIR0 = 0xFF;
	FIO2CLR0 = 0xFF;
    FIO2SET0 = mData;
	FIO0DIR0 = 0xF7;
    FIO0CLR0 = 0x10;//A0(P0.4)=0;
    FIO0CLR0 = 0x80;//  CS(P0.7)=0;
	FIO0CLR0 = 0x40;  /* 输出有效写控制信号, WR=(P0.6)=0;  */
	mDelay02uS();; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	FIO0SET0 = 0xC0;  /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */
	FIO0DIR0 = 0x00;  /* 禁止数据输出 */
	mDelay1_2uS();	mDelay1_2uS( );  /* 至少延时2uS */ 
}

UINT8 xReadCH375Data( void )			/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
{
	UINT8	mData;
	mDelay1_2uS();	
    FIO2DIR0 = 0x00;
    FIO0DIR0 = 0xF7;
    FIO0CLR0 = 0x10;//A0(P0.4)=0;
    FIO0CLR0 = 0x80;//  CS(P0.7)=0;
	FIO0CLR0 = 0x20;  /* 输出有效读控制信号, RD(P0.5)=0; */
	mDelay02uS();  /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
	mData = FIO2PIN0;  /* 从CH375的并口P2.7-P2.0输入数据 */
	FIO0DIR0 = 0xF7;
	FIO0SET0 = 0xA0;  /* 输出无效的控制信号, 完成操作CH375芯片, A0(P0.4)=0; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */
	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;  /* 操作成功 */
	while ( 1 );
	
}


int		main( ) {
	UINT8	i, c;
	UINT8	*pCodeStr;
	int m,n;
	
	CH375_PORT_INIT( );
    mDelaymS( 100 );
    
	i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
	mStopIfError( i );
 
	while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
	mDelaymS( 200 );  /* 延时 */

/* 读取原文件 */
		strcpy( (char *)mCmdParam.Open.mPathName, "/ARM/TEST.TXT" ); 
		i = CH375FileOpen( );  /* 打开文件 */
		mStopIfError( i );
		i = CH375ByteRead( );  /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
		mStopIfError( i );

	    for ( m=0; m!=10; m++ )  {n=mCmdParam.ByteRead.mByteBuffer[m];} 
				
	    i = CH375FileClose( );  /* 关闭文件 */
		mStopIfError( i );

#ifdef EN_DISK_WRITE  /* 子程序库支持写操作 */
/* 产生新文件 */
		strcpy( (char *)mCmdParam.Create.mPathName, "/NEWFILE.TXT" );  /* 新文件名,在根目录下,中文文件名 */
		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		mStopIfError( i );
		pCodeStr = (UINT8 *)"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,单片机只需要有600字节的RAM\xd\xa";
		while( 1 ) {  /* 分多次写入文件数据 */
			for ( i=0; i<MAX_BYTE_IO; i++ ) {
				c = *pCodeStr;
				mCmdParam.ByteWrite.mByteBuffer[i] = c;
				if ( c == 0 ) break;  /* 源字符串结束 */
				pCodeStr++;
			}
			if ( i == 0 ) break;  /* 源字符串结束,完成写文件 */
			mCmdParam.ByteWrite.mByteCount = i;  /* 写入数据的字符数,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后写 */
			i = CH375ByteWrite( );  /* 向文件写入数据 */
			mStopIfError( i );
		}

		mCmdParam.Close.mUpdateLen = 1;  /* 自动计算文件长度,以字节为单位写文件 */
		i = CH375FileClose( );
		mStopIfError( i );
#endif
		while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
		mDelaymS( 200 );
	
 return 0;
}

⌨️ 快捷键说明

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