📄 usbofcompuer00.c
字号:
}
break;
default: break;
}
}
}
else
{
select_endpoint(0);
clear_buffer();
}
}
}
/******************************************************************************/
/***********************获取报告*********************************************/
void get_report(void)
{
#ifdef debug
Prints(" 获取报告.\r\n");
#endif
}
/******************************************************************************/
/**********************获取空闲状态*********************************************/
void get_idle(void)
{
#ifdef debug
Prints(" 获取空闲.\r\n");
#endif
write_endpoint_buff(1,1,&idle);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/*************************获取协议**********************************************/
void get_protocol(void)
{
#ifdef debug
Prints(" 获取协议.\r\n");
#endif
write_endpoint_buff(1,1,&protocol);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/***********************设置报告***********************************************/
void set_report(void)
{
#ifdef debug
Prints(" 设置报告.\r\n");
#endif
}
/******************************************************************************/
/***********************设置空闲***********************************************/
void set_idle(void)
{
#ifdef debug
Prints(" 设置空闲.\r\n");
#endif
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
idle=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/**********************设置协议**************************************************/
void set_protocol(void)
{
#ifdef debug
Prints(" 设置协议.\r\n");
#endif
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
protocol=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/****************************终端点0输入处理**************************************/
void endp0_in(void)
{
read_last_status(1);
//如果是输入请求包
if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
#ifdef debug
Prints("USB标准输入请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(0);break;
case 6: get_descriptor();break;
case 8: get_configuration();break;
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(1);break;
case 6: get_descriptor_interface();break;
case 10: get_interface();break;
default: break;
}
break;
case 2: //到端点
{
if(Control_Data.DeviceRequest.bRequest==0)get_status(2);
}
default: break;
}
break;
case 0x20: //类请求
#ifdef debug
Prints("USB类输入请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case GET_REPORT: get_report(); break; //获取报告
case GET_IDLE: get_idle(); break; //获取空闲状态
case GET_PROTOCOL: get_protocol(); break; //获取协议
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
break;
case 0x40: //用户请求
#ifdef debug
Prints("USB用户输入请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
}
return;
}
//如果是输出请求包
if(usb_flags.flags.setup_packet_out)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
#ifdef debug
Prints("USB标准输出请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(0);break;
case SET_FEATURE: set_feature(0);break;
case SET_ADDRESS: set_usb_address();break; //set_address
case SET_DESCRIPTOR: set_descriptor();break; //set_descriptor
case SET_CONFIGURATION: set_configuration(); break; //set_configurat
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(1);break;
case SET_FEATURE: set_feature(1); break;
case SET_INTERFACE: set_interface();break;
default: break;
}
break;
case 2: //到端点
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(2);break;
case SET_FEATURE: set_feature(2);break;
default: break;
}
break;
default: break;
}
break;
case 0x20: //类请求
#ifdef debug
Prints("USB类输出请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
case SET_REPORT: set_report(); break; //设置报告
case SET_IDLE: set_idle(); break; //设置空闲
case SET_PROTOCOL: set_protocol(); break; //设置协议
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}break;
default: break;
}
break;
case 0x40: //用户请求
#ifdef debug
Prints("USB用户输出请求.\r\n");
#endif
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
default: break;
}
}
}
}
/******************************************************************************/
/**********************端点1输出***********************************************/
void endp1_out(void)
{
uint8 c;
#ifdef debug
uint8 i;
#endif
c=read_endpoint_buff(2,64,OutBuffer); //读回接收到的数据
P2=~OutBuffer[0];//显示灯的状态
#ifdef debug
Prints("端点1输出.\r\n");
Prints(" 端点1的数据是 ");
for(i=0;i<c;i++)
{
PrintHex(OutBuffer[i]);
if(i==16)Prints("\r\n");
}
Prints("\r\n");
#endif
}
/******************************************************************************/
/*************************端点1输入*****************************************/
void endp1_in(void)
{
#ifdef debug
if(P1!=0xFF)
{
Prints("端点1输入.\r\n");
write_endpoint_buff(3,2,InBuffer);
}
#else
write_endpoint_buff(3,1,&KeyPress); //返回按键情况
#endif
}
/******************************************************************************/
/***************************端点2输出****************************************/
void endp2_out(void)
{
uint8 c,i;
c=read_endpoint_buff(4,64,OutBuffer); //读回接收到的数据
#ifndef debug
for(i=0;i<c;i++) //通过串口发送出去
{
UartPutChar(OutBuffer[i]);
}
#endif
#ifdef debug
Prints("端点2输出.\r\n");
Prints(" 端点2的数据是 ");
for(i=0;i<c;i++)
{
PrintHex(OutBuffer[i]);
if(i==16)Prints("\r\n");
}
Prints("\r\n");
#endif
}
/******************************************************************************/
/****************************主端点输入处理************************************/
void endp2_in(void)
{
#ifndef debug
uint8 p,c;
if(InCount>0) //如果接收到数据
{
ES=0; //禁止串口中断
p=pIn; //获取位置
if(p+InCount>64) //如果超过缓冲区
{
c=64-p; //只取前半段数据
InCount-=c; //个数减少c个
}
else
{
c=InCount; //否则可以取全部数据
InCount=0; //个数清0
}
pIn=(pIn+c)&0x3F; //将pIn移动到下一个位置
ES=1; //允许串口中断
write_endpoint_buff(5,c,InBuffer+p); //将数据返回给USB
}
#endif
#ifdef debug
if(P1!=0xFF)
{
Prints("端点1输入.\r\n");
write_endpoint_buff(5,2,InBuffer);
}
#endif
}
/******************************************************************************/
#ifdef debug
code uint8 HeadTable[][74]={
"********************************************************************\r\n",
"****** EDN USB学习板USB转串口程序 ******\r\n",
"****** AT89S52 CPU ******\r\n",
"****** 建立日期:",__DATE__," ******\r\n",
"****** 建立时间:",__TIME__," ******\r\n",
"****** 作者:电脑圈圈 ******\r\n",
"****** 欢迎访问作者的 ******\r\n",
"****** USB专区:http://group.ednchina.com/93/ ******\r\n",
"****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
"****** BLOG2:http://computer00.21ic.org ******\r\n",
"********************************************************************\r\n",
};
#endif
/***************************主函数**********************************************/
void main(void)
{
#ifdef debug
uint8 i;
#endif
InitUART(); //串口初始化
InitKeyboard();
pIn=0;
InCount=0;
Overflow=0;
SetUartBitRate(9600); //设置波特率
#ifdef debug
Printc(0x0c); //清屏
Printc(0x0c);
Prints("系统启动.\r\n");
#endif
#ifdef debug
for(i=0;i<15;i++) //显示信息
{
Prints(HeadTable[i]);
}
#endif
disconnect_usb(); //断开USB连接
delay(1000); //延迟
init_usb(); //初始化USB芯片
connect_usb(); //连接USB
while(1)
{
if(!USB_INT) //中断产生
{
read_interrupt_register();
if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;}
if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;}
if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;}
if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;}
if(Interrupt_Register.Interrupt.port_out_1)endp1_out();
if(Interrupt_Register.Interrupt.port_in_1){endp1_in();}
if(Interrupt_Register.Interrupt.main_out_port){endp2_out();}
if(Interrupt_Register.Interrupt.main_in_port){endp2_in();}
}
}
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -