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

📄 ch375.c.bak

📁 使用ch375和stc 51写的usb鼠标的代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#ifndef __CH375_C__
#define __CH375_C__
#endif

#include "head.h"
#include "ch375inc.h"
#include "usbDef.h"
#include "descriptor.h"
#include "ch375.h"
#include "mcuFun.h"
#include "uart.h"

#define CMD_PORT		XBYTE[0x7fff]
#define DAT_PORT		XBYTE[0x3fff]


extern uint8 eaCount, debug;
extern uint16 tCount;
extern uint8 idata ep1Buf[8];

extern unsigned char RECV_LEN;       			// 刚接收到的数据的长度 
extern unsigned char RECV_BUFFER[ CH375_MAX_DATA_LEN ];  /* 数据缓冲区,用于保存接收到的下传数据,长度为0到64字节 */
extern unsigned char *cmd_buf;
extern unsigned char *ret_buf;
extern unsigned char mVarSetupRequest; 			// USB请求码
extern unsigned char mVarSetupLength; 			// 后续数据长度
extern unsigned char * VarSetupDescr; 			// 描述符偏移地址
extern unsigned char VarUsbAddress ; 			//USB设备地址
extern bit CH375FLAGERR; 									//错误清0
extern bit CH375CONFLAG; 									//配置标志
extern mREQUEST_PACKET  request;
sbit led = P1^0;
/* 与CH372/CH375有关的基本I/O操作 */
/* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
void CH375_WR_CMD_PORT( unsigned char cmd )
{
		_nop_();
		CMD_PORT=cmd;
}		

//向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 
void CH375_WR_DAT_PORT( unsigned char dat )
{
		_nop_();
		DAT_PORT=dat;
}		

// 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
unsigned char CH375_RD_DAT_PORT(void)
{
		_nop_();
		return(DAT_PORT);
}		
//----------------------------------------
//设置CH37X的工作模式
//如果设置不成功的话, 指示灯会闪烁
//----------------------------------------
void set_usb_mode( unsigned char mode )
{
	unsigned char i;
	unsigned char RD_Data;
	
	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
	CH375_WR_DAT_PORT( mode );
	
	for( i=100; i!=0; i-- )   	// 等待设置模式操作完成,不超过30uS 
	{
		RD_Data=CH375_RD_DAT_PORT();
		if( RD_Data == CMD_RET_SUCCESS )
		{
			if(debug) uartPrint("set usb mode % ok\n\r", &mode, 1);
			return;  	// 成功 
		}	
	}

	while(1)
	{
		flash_led();  	// CH375出错 
	}
}

//ch375硬复位	
void disConnect()
{
	CH375_WR_CMD_PORT( CMD_RESET_ALL );			//似乎是他模拟了一次插拔
	delay1s();
}	
	
//-----------------------------------
//CH375初始化子程序
//先检查CH375工作是否正常
//然后设置工作模式
//-----------------------------------
void CH375_Init( void )
{
	unsigned char i, k;
	unsigned char RD_Data;
	
	// 测试CH375是否正常工作
	for( k=100; k!=0; k-- )
	{
		CH375_WR_CMD_PORT( CMD_CHECK_EXIST );  // 测试CH375是否正常工作 
		i = 0x5A;
		CH375_WR_DAT_PORT( i ); // 写入测试数据 
		i = ~i;  								// 返回数据应该是测试数据取反 
		RD_Data = CH375_RD_DAT_PORT();
		if ( RD_Data != i )   	// CH375不正常 
		{
			for ( i=5; i!=0; i-- )
			{
					CH375_WR_CMD_PORT( CMD_RESET_ALL );  // 多次重复发命令,执行硬件复位 
			}
			delay50ms();  				// 延时50ms 
		}
		else
		{
			break;
		}
	}
	if( k==0 )
	{
		while(1)
		{
			flash_led();  // CH375出错 
		}
	}
	/*
	#ifdef MY_USB_VENDOR_ID
	#ifdef MY_USB_DEVICE_ID
	// 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID,
	//   如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改
	CH375_WR_CMD_PORT( CMD_SET_USB_ID );  // 设置外部自定义的USB设备VID和PID,可选操作
	CH375_WR_DAT_PORT( (unsigned char)MY_USB_VENDOR_ID );  // 写入厂商ID的低字节
	CH375_WR_DAT_PORT( (unsigned char)(MY_USB_VENDOR_ID>>8) );  // 写入厂商ID的高字节
	CH375_WR_DAT_PORT( (unsigned char)MY_USB_DEVICE_ID );  // 写入设备ID的低字节
	CH375_WR_DAT_PORT( (unsigned char)(MY_USB_DEVICE_ID>>8) );  // 写入设备ID的高字节
	#endif
	#endif
	*/
	/* 设置USB工作模式, 必要操作 */
	set_usb_mode( 1 ); 			//外部固件模式
	//set_usb_mode( 2 ); 		//内部固件模式
}

//---------------------------------
//函数说明: 端点0数据上传
//上传的数据的长度放在变量
//mVarSetupLength中, 数据放在
//结构request中
//---------------------------------
void mCh375Ep0Up(void)
{
	unsigned char i,len;

	if( mVarSetupLength ) 	//长度不为0传输具体长度的数据
	{
		if( mVarSetupLength<=8 )
		{
			len=mVarSetupLength;
			mVarSetupLength=0;
		} //长度小于8则传输要求的长度
		else
		{
			len=8;
			mVarSetupLength-=8;
		} //长度大于8则传输8个,切总长度减8
	  	CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); 	//发出写端点0的命令
	  	CH375_WR_DAT_PORT( len ); 							//写入长度
		for( i=0; i!=len; i++ )
		{
		 	CH375_WR_DAT_PORT( request.buffer[i] );  //循环写入数据
		}  
		if(debug) uartPrint("EP0_UP dat: %\n\r", request.buffer, len); 
	}
	else
	{
		CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 ); 			//发出写端点0的命令
		CH375_WR_DAT_PORT( 0 );                     //上传0长度数据,这是一个状态阶段
		if(debug) uartPutStr("NO data left!\n\r");
	}
}
//-------------------------------------
//函数名:	ep1Up
//作用:		端点1上传数据, 把数
//			据写入缓冲区一般在调用它后, 
//			要把缓冲区释放
//参数:		要发送的数据长度
//-------------------------------------
void ep1Up(uint8 len)
{
	uint8 i;

	if(0!=len)
	{
		CH375_WR_CMD_PORT( CMD_WR_USB_DATA5 );
		CH375_WR_DAT_PORT( len );
		for(i=0; i<len; i++)
		{
			CH375_WR_DAT_PORT( ep1Buf[i] );
		}	
	}	
}	
//-----------------------------------------------------
//函数名: 	mCh375DesUp
//作用:		复制描述符放到request结构中
//			变量*VarSetupDescr指向描述中
//参数:		无
//----------------------------------------------------
void mCh375DesUp(void)
{
	unsigned char k;
	for (k=0; k!=8; k++ )
	{
		request.buffer[k]=*VarSetupDescr;   //依次复制8个描述符,
		VarSetupDescr++;
  	}
}
//-------------------------------------------------------
//函数名:	rdData
//作用:		读取当前结点的数据
//参数:		无
//返回:		读取得数据的长度
//-------------------------------------------------------
uint8 rdData()
{
	uint8 length, *ret_buf;
	CH375_WR_CMD_PORT( CMD_RD_USB_DATA );  	// 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 
	length = CH375_RD_DAT_PORT();  			// 首先读取后续数据长度 
	if ( 0 != length )  					// 如果长度为0则不处理 
	{
		RECV_LEN = length; 				 	// 命令包的数据长度 
		ret_buf = RECV_BUFFER;  			// 接收缓冲区 
		while ( length -- )
		{
			*ret_buf = 	CH375_RD_DAT_PORT();
			ret_buf++;
		}
		return(RECV_LEN);
	}
	else
	{
		return(0);
	}	
}	
//-------------------------------
//函数名:	mCh375Interrupt
//作用: 	CH375中断处理  
//参数:			

⌨️ 快捷键说明

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