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

📄 ch375slaver.c

📁 USB 1.1 U Device for CH375 & USB 2.0 for CH375A 读写usb超精简的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	xWriteCH375Cmd( CMD_GET_STATUS );     // 获取中断状态并取消中断请求 
	InterruptStatus = xReadCH375Data( );  // 获取中断状态 
	RECV_LEN = 0;

	// 分析中断状态 
	switch( InterruptStatus ) 
	{
		//---------------------------------------
		// 批量端点下传成功 
	    case USB_INT_EP2_OUT:   
			xWriteCH375Cmd( CMD_RD_USB_DATA ); // 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 
			length = xReadCH375Data( );   // 首先读取后续数据长度 
			if ( length != 0 )            // 如果长度为0则不处理 
			{
				RECV_LEN = length;        // 命令包的数据长度 
				ret_buf = RECV_BUFFER;    // 接收缓冲区 
				while ( length-- )
				{
					*ret_buf = xReadCH375Data( );
					ret_buf++;
				}
			}
			break;
			
		//---------------------------------------
		// 批量端点上传成功,未处理 
		case   USB_INT_EP2_IN: 
			break;
			
		//---------------------------------------
		// 中断端点上传成功,未处理 
		case   USB_INT_EP1_IN:   
			break;
			
		//---------------------------------------
		// 中断端点下传成功,未处理 
		case   USB_INT_EP1_OUT:   
			break;
			
		//---------------------------------------
		// 控制端点建立成功 
		case   USB_INT_EP0_SETUP: 
			xWriteCH375Cmd( CMD_RD_USB_DATA );   // 读取数据命令 
			length = xReadCH375Data( );           // 返回数据长度 
			for( len=0; len!=length; len++ )        // 依次取出数据 
				request.buffer[len] = xReadCH375Data( );   

			if( length == 0x08 )
			{
				mVarSetupLength = request.buffer[6] & 0x7f;// 控制传输数据长度最大设置为128 
				//if( (c1=request.r.bmRequestType) & 0x40 )  // 厂商请求,未处理 
				//{}
				//if( (c1=request.r.bmRequestType) & 0x20 )  // 类请求,未处理 
				//{}
				if( !(request.r.bmRequestType & 0x60) )    // 标准请求 
				{
					mVarSetupRequest=request.r.bRequest; // 暂存标准请求码 
					switch( request.r.bRequest ) // 分析标准请求 
					{
					    case DEF_USB_CLR_FEATURE: // 清除特性 
							if((request.r.bmRequestType&0x1F)==0x02) // 不是端点不支持 
							{
								switch( request.buffer[4] )
								{
								    case 0x82:
										xWriteCH375Cmd( CMD_SET_ENDP7 ); //清除端点2上传
										xWriteCH375Data( 0x8E );           //发命令清除端点
										break;
									case 0x02:
										xWriteCH375Cmd( CMD_SET_ENDP6 );
										xWriteCH375Data( 0x80 ); //清除端点2下传
										break;
									case 0x81:
										xWriteCH375Cmd( CMD_SET_ENDP5 ); //清除端点1上传
										xWriteCH375Data( 0x8E );
										break;
									case 0x01:
										xWriteCH375Cmd( CMD_SET_ENDP4 ); //清除端点1下传
										xWriteCH375Data( 0x80 );
										break;
									default:
										break;
								}
							}
							else
							{
								CH375FLAGERR=1; //不支持的清除特性,置错误标志
							}
							break;
						case DEF_USB_GET_STATUS: //获得状态
							request.buffer[0]=0;
							request.buffer[1]=0; //上传状态
							break;
						case DEF_USB_SET_ADDRESS: //设置地址
							VarUsbAddress=request.buffer[2]; //暂存USB主机发来的地址
							break;
						case DEF_USB_GET_DESCR: //获得描述符
							if( request.buffer[3]==1 ) //设备描述符上传
								VarSetupDescr=DevDes;
							else
								if( request.buffer[3]==2 )   //配置描述符上传
									VarSetupDescr=ConDes;
								else
									if( request.buffer[3]==3 )
									{
										if( request.buffer[2]== 0 )
											VarSetupDescr=LangDes;
										else
											VarSetupDescr=SerDes; //做字符串处理
									}
									mCh375DesUp(); //其余描述符不支持
									break;
						case DEF_USB_GET_CONFIG: //获得配置
							request.buffer[0]=0; //没有配置则传0
							if( CH375CONFLAG )
								request.buffer[0]=1; //已经配置则传1;这是在描述符里规定的
							break;
						case DEF_USB_SET_CONFIG:             //设置配置
							CH375CONFLAG=0;
							if( request.buffer[2] != 0 )
							{
								CH375CONFLAG=1; //设置配置标志
							}
							break;
						case DEF_USB_GET_INTERF: //得到接口
							request.buffer[0]=1; //上传接口数,本事例只支持一个接口
							break;
						default :
							CH375FLAGERR=1; //不支持的标准请求
							break;
					}
				}
			}
			else   //不支持的控制传输,不是8字节的控制传输
			{
				CH375FLAGERR=1;
			}
			if( !CH375FLAGERR )
				mCh375Ep0Up(); //没有错误/调用数据上传,长度为0上传为状态
			else
			{
				xWriteCH375Cmd( CMD_SET_ENDP3 ); //设置端点1为STALL,指示一个错误
				xWriteCH375Data( 0x0F );
				flash_led();
			}
			break;

		//---------------------------------------
		//控制端点上串成功 
        case   USB_INT_EP0_IN: 
			if( mVarSetupRequest==DEF_USB_GET_DESCR ) //描述符上传
			{
				mCh375DesUp();
				mCh375Ep0Up();
			}
			else
			{
				if( mVarSetupRequest==DEF_USB_SET_ADDRESS ) //设置地址
				{
					xWriteCH375Cmd( CMD_SET_USB_ADDR );
					xWriteCH375Data( VarUsbAddress ); //设置USB地址,设置下次事务的USB地址
				}
			}
			break;

		//---------------------------------------
		//控制端点下传成功 
		case   USB_INT_EP0_OUT: 
			xWriteCH375Cmd( CMD_RD_USB_DATA ); //发出读数据命令
			length=xReadCH375Data( );
			if( length>0 ) //长度为0跳出
			{
				for( len=0;len!=length;len++ )
					xReadCH375Data( ); //取出下传数据
			}
			break;

		//---------------------------------------
		// 
		default:
			if( InterruptStatus&0x03 ) // 总线复位 
			{
				CH375FLAGERR=0; // 错误清0 
				CH375CONFLAG=0; // 配置清0 
				mVarSetupLength=0;
			}
			else       // 命令不支持 
			{ 
				flash_led();
			}
			break;
    }
	xWriteCH375Cmd( CMD_UNLOCK_USB );     // 释放缓冲区
	LED_OUT_INACT( );                     // 
}

//-------------------------------------------------------------------------------------------------
// 
/*串行数据接收程序*/
void receive(void)
{
  unsigned int count;
unsigned char buf;

RECV_LEN=0;
cmd_buf = RECV_BUFFER; /* 接收缓冲区 */
while( 1 )
{
RI=0;
*cmd_buf = SBUF;
cmd_buf++;
RECV_LEN++;
if( RECV_LEN == 64 )
{
while( 1 )
{
count=10000;
while( RI==0 )
{
count--;
if( count==0 )
return;
}
RI=0;
buf=SBUF;
}
}
count=10000;
while( RI==0 )
{
count--;
if( count==0 )
return;
}
}
}
//-------------------------------------------------------------------------------------------------
// 
void main( void )
{
	unsigned char length;
	
	delay1s(); // 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 
	CH375_Init( ); // 初始化CH375 
	ComInit();
	led = 0;
	
	while( 1 )
	{
		if( RI == 1 )                     // 从串口接收到的数据 
		{
			LED_OUT_ACT( );               // Enable LED! 
			receive( );
			LED_OUT_INACT( );             // Disable LED! 
			
			// 将从串口接收到的数据发送到USB设备 
			ret_buf = RECV_BUFFER;        // 接收缓冲区 
			length = RECV_LEN;            // 刚接收到的数据长度 
			
			if( length != 0 )
			{
				xWriteCH375Cmd( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 
				xWriteCH375Data( length );// 首先写入后续数据长度 
				while( length-- )
				{
					xWriteCH375Data( *ret_buf++ );  // 数据 
				}
			}
		}
		
		CH375_INT_WIRE=1;
		if( CH375_INT_WIRE == 0 )         // 从USB设备接收到数据 
		{
			mCh375Interrupt( );
			
			// 将从USB设备接收到的数据发送到串口 
			ret_buf = RECV_BUFFER;        // 接收缓冲区 
			length = RECV_LEN;            // 刚接收到的数据长度 
			while( length-- )
			{
				SendChar( *ret_buf );
				ret_buf++;
			}
		}
	}
}

⌨️ 快捷键说明

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