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

📄 main.c

📁 采用C8051F020和CH375芯片构建的可实现U-DISK功能的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	DISK_BASE_BUF[0] = 0;  //该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区
	if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF );  //获取当前子程序库的版本号,版本太低则返回错误 
	return( CH375Init( ) );  //初始化CH375 
}

#ifndef NO_DEFAULT_CH375_INT			/* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
#if LIB_CFG_INT_EN == 0					/* CH375的INT#引脚连接方式为"查询方式" */
void xQueryInterrupt( void )			/* 查询CH375中断并更新中断状态 */
{
	while ( CH375_INT_WIRE );  /* 如果CH375的中断引脚输出高电平则等待 */
	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
}
#else									/* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */
void xQueryInterrupt( void )			/* 查询中断状态,等待硬件中断 */
{
	unsigned char i;
	while ( CH375IntStatus == 0 )
		i = CH375IntStatus;		/* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */
	//while ( CH375DiskStatus == DISK_DISCONNECT);
}
void	CH375Interrupt( void ) interrupt 2 using 0	/* CH375中断服务程序,使用寄存器组1,由CH375的INT#的低电平或者下降沿触发单片机中断 */
{
	unsigned char i;
	//CH372_WrCmd (CMD_CHECK_EXIST);  //测试CH375与单片机的物理连接是否正常
	xWriteCH375Cmd( CMD_CHECK_EXIST );
	//CH372_WrDat (0x55); 			//写入测试数据,任意数据 
	xWriteCH375Data( 0x88 );
									//返回数据应该是测试数据取反
	if (xReadCH375Data() == 0x77) 		//CH375不正常
	{  
		//printf("pass!\r\n");
		xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
		Delay_us(2);
		CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
		i = CH375IntStatus;
		if ( CH375IntStatus == USB_INT_DISCONNECT ) 
			CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */
		else if ( CH375IntStatus == USB_INT_CONNECT ) 
			CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */
	}
	else 
	{
		//printf("fail!\r\n");
		i = xReadCH375Data();
	}
#ifdef CLEAR_INT_MARK
	CLEAR_INT_MARK( );  /* 某些单片机需要由软件清除中断标志 */
#endif
}
#endif
#endif

/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */
UINT8	mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
	UINT8	i = 0;
	while ( *iDestination = *iSource ) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

/*************************************************************************************
* 主循环程序
*************************************************************************************/
void main (void)
{
	UINT8	i, month, hour;
	UINT16	date, adc, len;

	WDTCN = 0xde;
   	WDTCN = 0xad;

	SYSCLK_Init();
	PORT_Init();	
	INT1_Set;		//外中断1初始化设置
	EA = 1;

	LED1 = 1;
	LED2 = 1;
	LED3 = 1;
	Delay_ms(100);
	LED1 = 0;
	LED2 = 0;
	LED3 = 0;
	
	Uart0_Init(BaudRate_115200);
	Uart1_Init(BaudRate_115200);
	Uart0_Enable(1);
	Uart1_Enable(1);
	Uart0_SendString("www.mlarm.com\r\n");
	Uart1_SendString("www.mlarm.com\r\n");
	Uart0_SendString("TeL:029-88223597-802\r\n");
	Uart1_SendString("TeL:029-88223597-802\r\n");	
	Uart1_SendString("Informition on Com1\r\n");		//提示在com1口观察信息

	i = CH375LibInit();  	//初始化CH375程序库和CH375芯片,操作成功返回0 
	mStopIfError(i);		//其它电路初始化 
	
	while(1)
	{
		xWriteCH375Cmd( CMD_CHECK_EXIST );
		xWriteCH375Data( 0x55 );			//返回数据应该是测试数据取反
		if (xReadCH375Data() == 0xaa) 		//CH375不正常
		{  
			printf("CH375 Test pass\r\n");	
		}
		else 
		{
			printf("CH375 Test fail\r\n");
		}
		printf("Wait Udisk\r\n");
		while(CH375DiskStatus < DISK_CONNECT) //查询CH375中断并更新中断状态,等待U盘插入 
		{  
			xQueryInterrupt();
			Delay_ms(100);
		}
		LED1 = 1;  //LED亮
		LED2 = 1;  //LED亮
		LED3 = 1;  //LED亮 
		Delay_ms(200);  //延时,可选操作,有的USB存储器需要几十毫秒的延时 

/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,
最多等待5*50mS,主要针对DiskReady不过的 */
		for (i=0; i<100; i++) //最长等待时间,100*50ms
		{  
			Delay_ms(100);
			printf("Ready ?\r\n");
			if (CH375DiskReady() == ERR_SUCCESS) break;  	//查询磁盘是否准备好 
			if (CH375DiskStatus < DISK_CONNECT) break;  	//检测到断开,重新检测并计时 
			if (CH375DiskStatus >= DISK_MOUNTED && i > 5) break;  
			/* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
		}
		if (CH375DiskStatus < DISK_CONNECT) //检测到断开,重新检测并计时 
		{  
			LED1 = 0;
			LED2 = 0;
			LED3 = 0;
			printf("Device gone\r\n");
			continue;
		}
		if (CH375DiskStatus < DISK_MOUNTED) //未知USB设备,例如USB键盘、打印机等 
		{  
			printf("Unknown device\r\n");
			goto UnknownUsbDevice;
		}
		Delay_ms(20);

		printf("DiskSize\r\n");//查询磁盘物理容量 
		i = CH375DiskSize();
		mStopIfError(i);
		printf("TotalSize = %u MB \r\n", (unsigned int)(mCmdParam.DiskSize.mDiskSizeSec >> 11));  //显示为以MB为单位的容量 
		
		/* 如果USB_TEST.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */
		printf( "Open\n" );
		mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/USB_TEST.TXT" );  //文件名,该文件在根目录下 
		i = CH375FileOpen( );  //打开文件 
		if ( i == ERR_SUCCESS ) {  //文件存在并且已经被打开,移动文件指针到尾部以便添加数据 
			printf( "File size = %ld\n", CH375vFileSize );  //V1.5以上子程序库在成功打开文件后,全局变量CH375vFileSize中是文件当前长度 
			printf( "Locate tail\n" );
			mCmdParam.ByteLocate.mByteOffset = 0xffffffff;  //移到文件的尾部 
			i = CH375ByteLocate( );
			mStopIfError( i );
		}
		else if ( i == ERR_MISS_FILE ) {  //没有找到文件,必须新建文件 
			printf( "Create\n" );
//			mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/USB_TEST.TXT" );  //文件名,该文件在根目录下,刚才已经提供给CH375FileOpen 
			i = CH375FileCreate( );  //新建文件并打开,如果文件已经存在则先删除后再新建 
			mStopIfError( i );
		}
		else mStopIfError( i );  //打开文件时出错 
		printf( "Write begin\n" );
		i = sprintf( mCmdParam.ByteWrite.mByteBuffer, "此前文件长度= %ld 字节\xd\xa", CH375vFileSize );
		mCmdParam.ByteWrite.mByteCount = i;  //指定本次写入的字节数,单次读写的长度不能超过MAX_BYTE_IO 
		i = CH375ByteWrite( );  //以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO 
		mStopIfError( i );
		printf( "Write Test data\n" );
		for ( hour = 8; hour != 20; hour ++  ) {  //用循环方式添加12行数据 
			TR0=1;  //用定时器0的计数值做存储数据 
			month = 5;  //假定是5月 
			date = TL1 & 0x1F;  //因为测试板上没有实时时钟芯片,所以用定时器1的计数代替进行演示  
			adc = ( (UINT16)TH0 << 8 ) | TL0;  //用定时器0的计数做数据存储演示 
			len = sprintf( mCmdParam.ByteWrite.mByteBuffer, "%02d.%02d.%02d Data=%u\xd\xa", (UINT16)month, date, (UINT16)hour, adc );  //将二制制数据格式为一行字符串 
			mCmdParam.ByteWrite.mByteCount = (unsigned char)len;  //指定本次写入的字节数,不能超过MAX_BYTE_IO,否则另用缓冲区分多次写入 
			i = CH375ByteWrite( );  //以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO 
			mStopIfError( i );
		}
		mStopIfError( i );

		printf( "Close\n" );
		mCmdParam.Close.mUpdateLen = 1;  //自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 
		i = CH375FileClose( );  //关闭文件 
		mStopIfError( i );
		printf( "Take out\n" );
		while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( );  //查询CH375中断并更新中断状态,等待U盘拔出 
		Delay_ms(100);
UnknownUsbDevice:
		printf("Take out\r\n");
		while (CH375DiskStatus >= DISK_CONNECT) //查询CH375中断并更新中断状态,等待U盘拔出 
		{  
			CH375DiskConnect();
			Delay_ms(100);
		}
		LED1 = 0;  //LED灭 
		LED2 = 0;  //LED灭
		LED3 = 0;  //LED灭
		Delay_ms(200);
	}	
}
/******************************************************************************************
* 文件结束
******************************************************************************************/

⌨️ 快捷键说明

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