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