📄 ch375slaver.c
字号:
//=================================================================================================
//*************************************************************************************************
// 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 + -