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

📄 usbp.c

📁 全国电子设计大赛:智能电动车的设计.实现功能:以AT89C52单片机为核心
💻 C
📖 第 1 页 / 共 2 页
字号:
	#define	DataCount	status		// 节约一个变量单元 
	unsigned char data	*buf;

	CH375HM_INDEX_WR( 0 );   // 索引地址置0 
	CH375HM_DATA_WR( cmd );  // 向索引地址00H写入命令码 
	CH375HM_DATA_WR( len );  // 向索引地址01H写入后续参数的长度 
	if ( len )               // 有参数 
	{  
		i = len;
		buf = (unsigned char *)&mCmdParam;  // 指向输入参数的起始地址 
		do  // 使用do+while结构是因为其效率高于for 
		{
			CH375HM_DATA_WR( *buf++ );      // 从索引地址02H开始,写入参数 
		} while ( -- i );
	}
	CH375HM_STA = 0; // 产生下降沿通知模块,说明命令包已经写入,请求开始执行命令 

	while ( 1 )      // 处理数据传输,直到操作完成才退出 
	{  
	    // 等待模块完成操作产生低电平中断,最佳检测方式是对模块的INT#信号进行下降沿边沿检测 
		while ( CH375HM_INT_WIRE ) ;  //喂狗   

		CH375HM_INDEX_WR( 63 );       // 写入索引地址63 
		status = CH375HM_DATA_RD( );  // 从索引地址63读取中断状态 
		CH375HM_STA = 1;              // 中断应答,取消来自模块的中断请求 

        // 因为模块在收到中断应答后3uS之内才撤消中断请求,所以,如果是查询INT#信号的低电平,那么在发出中断应答后
		// 3uS之内不应该再查询INT#信号的状态,//但是由于51单片机较慢,下面的处理时间已经超过3uS,
        // 所以另加延时等待模块撤消中断请求 
		mDelayuS( 3 );                // 3 uS 

		if ( status == ERR_SUCCESS )  // 操作成功 
		{  
			CH375HM_INDEX_WR( 1 );
			DataCount = CH375HM_DATA_RD( );  // 从索引地址01H读取返回结果数据的长度,计数 
			if ( DataCount )                 // 有结果数据 
			{  				   
				buf = (unsigned char *)&mCmdParam;  // 指向输出参数的起始地址 
				i = 2;
				do 
				{
					CH375HM_INDEX_WR( i++ );
					*buf++ = CH375HM_DATA_RD( );    // 从索引地址2开始,读取结果 
				} while ( -- DataCount );
			}
			break;  // 操作成功返回 
		}
		
		// 正在从U盘读数据块,请求数据读出 
		else if ( status == USB_INT_DISK_READ ) 
		{  
			DataCount = 64;  // 计数 
			i = 0;
			do // 要提高文件数据读写速度,这段程序用汇编程序效率更高,在C51中,do+while比for或者while结构效率高 
			{  
				CH375HM_INDEX_WR( i++ );
				*buffer++ = CH375HM_DATA_RD( ); // 从索引地址0到63依次读出64字节的数据,保存到外部缓冲区 
			} while ( -- DataCount );           // 上面这一小段C程序用汇编程序效率要高近一倍 
			CH375HM_STA = 0;  // 产生下降沿通知模块继续,说明64字节数据已经读取完成 
		}
		
		// 正在向U盘写数据块,请求数据写入 
		else if ( status == USB_INT_DISK_WRITE ) 
		{  
			CH375HM_INDEX_WR( 0 );
			i = 64;
			do // 要提高文件数据读写速度,这段程序用汇编程序效率更高,在C51中,do+while比for或者while结构效率高 
			{
				CH375HM_DATA_WR( *buffer++  );  // 向索引地址0到63依次写入64字节的数据,写入的数据来自外部缓冲区  
			} while ( -- i );
			CH375HM_STA = 0;  // 产生下降沿通知模块继续,说明64字节数据已经写入完成 
		}
		
		// 读写数据块失败重试,应该向回修改缓冲区指针 
		else if ( status == USB_INT_DISK_RETRY ) 
		{  
			CH375HM_INDEX_WR( 0 );
			i = CH375HM_DATA_RD( );         // 大端模式下为回改指针字节数的高8位,如果是小端模式那么接收到的是回改指针字节数的低8位 
			CH375HM_INDEX_WR( 1 );
			DataCount = CH375HM_DATA_RD( ); // 大端模式下为回改指针字节数的低8位,如果是小端模式那么接收到的是回改指针字节数的高8位 
			buffer -= ( (unsigned short)i << 8 ) + DataCount;  // 这是大端模式下的回改指针,对于小端模式,应该是( (unsigned short)status << 8 ) + i 
			CH375HM_STA = 0;  // 产生下降沿通知模块继续,说明重试状态码已经处理完成 
		}
		
		// 操作失败 
		else 
		{  
			if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 10 );  // U盘刚刚连接或者断开,应该延时几十毫秒再操作 
			break;  // 操作失败返回 
		}
	}
	while( CH375HM_INT_WIRE == 0 ) ;	 // 如果单片机速度很快,有可能该程序返回前模块尚未撤消中断请求,那么应该等待中断请求引脚无效 
	return( status ); 
}

  #endif 

//-----------------------------------------------
// 串口连接方式
#else 

//=================================================================================================
//                               ExecCommand( )
//=================================================================================================
// 
//-------------------------------------------------------------------------------------------------
// 执行命令
// 输入命令码和输入参数长度,返回操作状态码,输入参数和返回参数都在CMD_PARAM结构中 
unsigned char ExecCommand( unsigned char cmd, unsigned char len )
{
	unsigned char	i, j, status;

	mSendByte ( SER_SYNC_CODE1 );  // 发送串口同步码通知模块,说明命令码开始发送,请求开始执行命令 
	mSendByte ( SER_SYNC_CODE2 );  // 用两个串口同步码代替STA#的下降沿 
    // 上面两个串口同步码应该连续发送,如果不连续,那么间隔时间不能超过20mS,否则命令无效 

	RI0 = 0; 
	mSendByte ( cmd );  // 写入命令码 
	mSendByte ( len );  // 写入后续参数的长度 
	if ( len )          // 有参数 
	{  
		for ( i = 0; i != len; i ++ ) 
		mSendByte ( mCmdParam.Other.mBuffer[ i ] );  // 依次写入参数 
	}

	while ( 1 )                  // 处理数据传输,直到操作完成才退出 
	{  
		status = mRecvByte ( );  // 等待模块完成操作并返回操作状态 

		// 操作成功 
		if ( status == ERR_SUCCESS ) 
		{   
			i = mRecvByte ( );   // 返回结果数据的长度 
			if ( i )             // 有结果数据 
			{  
				j = 0;
				do  // 使用do+while结构是因为其效率高于for 
				{  
					mCmdParam.Other.mBuffer[ j++ ] = mRecvByte ( );  // 接收结果数据并保存到参数结构中 
				} while ( -- i );
			}
			break;  // 操作成功返回 
		}

		// 正在从U盘读数据块,请求数据读出 
		else if ( status == USB_INT_DISK_READ )	
		{  
			i = 64;
			do 
			{	
				*buffer++ = mRecvByte ( );  	// 依次接收64字节的数据 
			} while ( --i );
		}
		
		// 正在向U盘写数据块,请求数据写入 
		else if ( status == USB_INT_DISK_WRITE )
		{   
			i = 64;
			do 
			{	
				mSendByte ( *buffer++ );  		// 依次发送64字节的数据
			} while ( --i );
		}

		// 操作失败 
		else 
		{   
			if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT ) mDelaymS( 10 );  // U盘刚刚连接或者断开,应该延时几十毫秒再操作 
			break;  // 操作失败返回 
		}
	}
	return( status );
}

#endif 
//*********************************************************************************************************************

⌨️ 快捷键说明

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