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

📄 ch375slaver.c

📁 USB 1.1 U Device for CH375 & USB 2.0 for CH375A 读写usb超精简的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//=================================================================================================
//*************************************************************************************************
// Module Name  : CH375Slaver.C
// Device object: 
// Create date  : 2005-11-5 
// Modify date  : 2005-11-7 
// Description  : USB 1.1 Slaver for CH375 
//                
// Author       : Li yuanzheng 
// Version      : V1.0  
//*************************************************************************************************
//=================================================================================================
// 
//-------------------------------------------------------------------------------------------------
// Includes 
//-------------------------------------------------------------------------------------------------
// 未调试过
// 

#include <REGX52.h>                       // SFR declarations 
#include <INTRINS.H>
#include "Function.H"
#include "CH375Slaver.H"

//=================================================================================================

unsigned char RECV_LEN;                   // 刚接收到的数据的长度 
unsigned char idata RECV_BUFFER[ CH375_MAX_DATA_LEN ];     // 数据缓冲区,用于保存接收到的下传数据,长度为0到64字节 
unsigned char idata *cmd_buf;
unsigned char idata *ret_buf;

//-------------------------------------------------------------------------------------------------
// Request Pack 
typedef union _REQUEST_PACK
{
	unsigned char buffer[8];
	struct
	{
		unsigned char bmRequestType;      // 标准请求字 
		unsigned char bRequest;           // 请求代码 
		unsigned int  wValue;             // 特性选择高 
		unsigned int  wIndex;             // 索引 
		unsigned int  wLength;            // 数据长度 
	}r;
}mREQUEST_PACKET, *mpREQUEST_PACKET;

//=================================================================================================
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// 设备描述符 ( Device Descriptor ) 
unsigned char code DevDes[]=
{
	 0x12   // bLength                 --描述符大小 ( 18B )
	,0x01   // bDescriptorType         --常数Device ( 01H ) 
	,0x10   // bcdUSB                  --USB规范版本信息 ( 1.1 )
	,0x01
	,0x00   // bDeviceClass            --类别码 
	,0x00   // bDeviceSubClass         --子类别码 
	,0x37   // bDeviceProtocol         --协议码 
	,0x08   // bMaxPacketSize          --端点0的最大信息包大小 ( 8B )
	,0x48   // idVendor                --厂商ID 
	,0x43
	,0x37   // idProduct               --产品ID 
	,0x55
	,0x00   // bcdDevice               --设备版本号码 
	,0x01
	,0x00   // iManufacturer           --制造者的字符串描述符的索引值 
	,0x00   // iProduct                --产品的字符串描述符的索引值 
	,0x00   // iSerialNumber           --序号的字符串描述符的索引值 
	,0x01   // bNumConfigurations      --可能配置的数目 

	,0x00   // --无意义 
	,0x00
	,0x00
	,0x00
	,0x00
	,0x00
};

//-------------------------------------------------------------------------------------------------
// 配置描述符 ( The marshal of Configuration Descriptor ) 
unsigned char code ConDes[]=
{
	 0x09   // bLength                 --描述符大小        ( 09B )
	,0x02   // bDescriptorType         --常数Configuration ( 02H ) 
	,0x27   // wTotalLength            --此配置传回所有数据大小 ( B )
	,0x00   // 
	,0x01   // bNumberInterfaces       --此配置支持的接口数目 
	,0x01   // bConfigurationValue     --要求的标识符 
	,0x00   // iConfiguration          --此配置的字符串描述符的索引值 
	,0x80   // bmAttributes            --电源设置 
	,0x40   // MaxPower                --需要总线电源 ( /2mA ) 
	
	//-------------------------------------------
	// 接口描述符 ( Interface Descriptor ) 
	,0x09   // bLength                 --描述符大小    ( 09B )
	,0x04   // bDescriptorType         --常数Interface ( 04H )
	,0x00   // bInterfaceNumber        --此接口的识别码 
	,0x00   // bAlternateSetting       --代替设置的数值 
	,0x03   // bNumEndpoints           --除了端点0外,支持的端点数 
	,0x08   // bInterfaceClass         --类别码 
	,0x08   // bInterfaceSubClass      --子类别码 
	,0x37   // bInterfaceProtocol      --协议码 
	,0x00   // iInterface              --此接口的字符串描述符的索引值 
	
	//-------------------------------------------
	// 端点描述符 ( Endpoint Descriptor ) 

	// EndPoint 2 
	,0x07   // bLength                 --描述符大小   ( 07B ) 
	,0x05   // bDescriptorType         --常数EndPoint ( 05H ) 
	,0x82   // bEndpointAddress        --端点数目及方向 ( 上传端点号 ) 
	,0x02   // bmAttributes            --支持的传输类型 ( Bulk ) 
	,0x40   // wMaxPacketSize          --支持的最大信息包大小 ( 64B ) 
	,0x00
	,0x00   // bInterval               --最大延迟/轮询时距/NAK速率 

	,0x07   // bLength                 --描述符大小   ( 07B ) 
	,0x05   // bDescriptorType         --常数EndPoint ( 05H ) 
	,0x02   // bEndpointAddress        --端点数目及方向 ( 下传端点号 ) 
	,0x02   // bmAttributes            --支持的传输类型 ( Bulk ) 
	,0x40   // wMaxPacketSize          --支持的最大信息包大小 ( 64B ) 
	,0x00
	,0x00   // bInterval               --最大延迟/轮询时距/NAK速率 
	
	// EndPoint 1 
	,0x07   // bLength                 --描述符大小   ( 07B ) 
	,0x05   // bDescriptorType         --常数EndPoint ( 05H ) 
	,0x81   // bEndpointAddress        --端点数目及方向 ( 上传端点号 ) 
	,0x03   // bmAttributes            --支持的传输类型 ( Interrupt ) 
	,0x08   // wMaxPacketSize          --支持的最大信息包大小 ( 8B ) 
	,0x00
	,0x01   // bInterval               --最大延迟/轮询时距/NAK速率 ( /mS ) 

	,0x07   // bLength                 --描述符大小   ( 07B ) 
	,0x05   // bDescriptorType         --常数EndPoint ( 05H ) 
	,0x01   // bEndpointAddress        --端点数目及方向 ( 下传端点号 ) 
	,0x02   // bmAttributes            --支持的传输类型 ( Bulk ) 
	,0x08   // wMaxPacketSize          --支持的最大信息包大小 ( 8B ) 
	,0x00
	,0x00   // bInterval               --最大延迟/轮询时距/NAK速率 
}; 

//-------------------------------------------------------------------------------------------------
// 语言描述符 ( String Descriptor ) 
unsigned char code LangDes[]={ 0x04,0x03,0x09,0x04 }; 

//-------------------------------------------------------------------------------------------------
// 字符串描述符 ( Unicode ) 
unsigned char code SerDes[]={ 0x12,0x03,'C',0,'H',0,'3',0,'7',0,'5',0,'U',0,'S',0,'B',0 }; 

//=================================================================================================
//-------------------------------------------------------------------------------------------------
//

unsigned char mVarSetupRequest;           // USB请求码 
unsigned char mVarSetupLength;            // 后续数据长度 
unsigned char code * VarSetupDescr;       // 描述符偏移地址 

unsigned char VarUsbAddress ; // 
bit CH375FLAGERR; // 错误清0 
bit CH375CONFLAG; // 配置标志 

mREQUEST_PACKET request;

//=================================================================================================
//=================================================================================================
// 
// 
//=================================================================================================
//=================================================================================================
// 
//-------------------------------------------------------------------------------------------------
// 设置CH37X的工作模式 
void CH375_SetUSBMode( unsigned char mode )
{
	unsigned char i;
	
	xWriteCH375Cmd( CMD_SET_USB_MODE );   // 设置USB工作模式 
	xWriteCH375Data( mode );
//	Endp6Mode = Endp7Mode = 0x80;         // 主机端复位USB数据同步标志 ( 用于主机方式 ) 

	for( i=100; i!=0; i-- )               // 等待设置模式操作完成,不超过30uS 
	{
	    if( xReadCH375Data( ) == CMD_RET_SUCCESS ) return; // 成功 
	}
	mStopIfError( 0xFF );                 // CH375出错 
}

//-------------------------------------------------------------------------------------------------
// CH375初始化子程序 ( 设备方式 ) 
void CH375Init( void )
{
	unsigned char i, k;
	unsigned char DataRead;
	
//	CH375_PORT_INIT( );
	
	// 测试CH375是否正常工作 
	for( k=100; k!=0; k-- )
	{
		xWriteCH375Cmd( CMD_CHECK_EXIST );// 测试CH375是否正常工作 
		i = 0x5A;
		xWriteCH375Data( i );             // 写入测试数据 
		i = ~i;                           // 返回数据应该是测试数据取反 
		DataRead = xReadCH375Data( );
		if( DataRead != i )               // CH375不正常 
		{
			for( i=5; i!=0; i-- ) xWriteCH375Cmd( CMD_RESET_ALL ); // 多次重复发命令,执行硬件复位 
			mDelaymS( 50 );               // 延时50ms 
		}
		else break;
	}
	// CH375出错 
	if( k==0 ) mStopIfError( 0xFF );

#ifdef MY_USB_VENDOR_ID 
    #ifdef MY_USB_DEVICE_ID 
	// 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID, 
	// 如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改 
	xWriteCH375Cmd( CMD_SET_USB_ID );     // 设置外部自定义的USB设备VID和PID,可选操作 
	xWriteCH375Data( (unsigned char)MY_USB_VENDOR_ID      );  // 写入厂商ID的低字节 
	xWriteCH375Data( (unsigned char)(MY_USB_VENDOR_ID>>8) );  // 写入厂商ID的高字节 
	xWriteCH375Data( (unsigned char)MY_USB_DEVICE_ID      );  // 写入设备ID的低字节 
	xWriteCH375Data( (unsigned char)(MY_USB_DEVICE_ID>>8) );  // 写入设备ID的高字节 
    #endif
#endif

	// 设置USB工作模式, 必要操作 
//	CH375_SetUSBMode( 1 );                // 设备方式,外部固件模式 
	CH375_SetUSBMode( 2 );                // 设备方式,内部固件模式 
}

//=================================================================================================
// 串行口通讯子程序 
//=================================================================================================
// 

//=================================================================================================
//=================================================================================================
// 端点0数据上传, 长度小于等于8的数据 
void mCH375Endpoint0Up( void )
{
	unsigned char i,length;

	if( mVarSetupLength )                 // 长度不为0传输具体长度的数据 
	{
		if( mVarSetupLength <= 8 )        // 长度小于8则传输要求的长度 
		{
			length = mVarSetupLength;
			mVarSetupLength = 0;
		} 
		else                              // 长度大于8则传输8个,切总长度减8 
		{
			length = 8;
			mVarSetupLength -= 8;
		}                 
		xWriteCH375Cmd( CMD_WR_USB_DATA3 ); // 发出写端点0的命令 
		xWriteCH375Data( length );          // 写入长度 
		for( i=0; i<length; i++ ) xWriteCH375Data( request.buffer );// 循环写入数据 
	}
	else
	{
		xWriteCH375Cmd( CMD_WR_USB_DATA3 ); // 发出写端点0的命令 
		xWriteCH375Data( 0 );               // 上传0长度数据,这是一个状态阶段 
	}
}

//-------------------------------------------------------------------------------------------------
// 复制描述符以便上传 
void mCH375DescriptorUp( void )
{
	unsigned char i;
	
	for( i=0; i!=8; i++ )
	{
		request.buffer[i] = *VarSetupDescr;// 依次复制8个描述符 
		VarSetupDescr++;
	}
}

//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// CH375数据接收程序 
void mCH375Interrupt( void )
{
	unsigned char InterruptStatus;
	unsigned char length, len;
	

⌨️ 快捷键说明

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