📄 endp0.c
字号:
#include "function.h"
#include <stdio.h>
#include "global.h"
/******************************************/
//函数入口表//函数入口表//函数入口表
code void (* StandardDeviceRequest[])()=
{
Get_Status,
Clean_Feature,
Reserved,
Set_Feature,
Reserved,
Set_Address,
Get_Descriptor,
Set_Descriptor,
Get_Configuration,
Set_Configuration,
Get_Interface,
Set_Interface,
Reserved
};
code void (* ClassRequest[])()=
{
Reserved,
Get_Report,
Get_Idle,
Get_Protocol,
Reserved,
Reserved,
Reserved,
Reserved,
Reserved,
Set_Report,
Set_Idle,
Set_Protocol,
Reserved,
Reserved,
Reserved
};
void Control_Handler()
{
uchar type,req;
type=((Control_Buffer.Device_Request.bmRequestType&0x60)>>5);
req=(Control_Buffer.Device_Request.bRequest&0x0f);
if(type==0)
{printf("标请函数查询\n");(* StandardDeviceRequest[req])();} //标准请求
else if(type==1)
{printf("类请求函数查询\n");(* ClassRequest[req])();}//类型请求
else if(type==2)
{}//厂商请求
}
void Endp0_rx()
{
Last_Status=Read_Last_Status(0);
if(Last_Status&0x20) //如果有一个setup包
{
Control_Buffer.wLength=0;
Control_Buffer.wCount=0;
if(Read_Endp_Buffer(0,sizeof(Control_Buffer.Device_Request),(uchar*)(&Control_Buffer.Device_Request))!=8)//请求数据长度是否错误
{
Soft_Flag.Registerbit1.Control_Status=0;//传输状态为空闲
set_endpoint_status(0,1);
set_endpoint_status(0,1);
Soft_Flag.Registerbit1.Endp1_In=0;//不允许端点1进行控制输入传输
printf("出错,不应答!\n");
return;
}
Ack_Setup(0); //对主机应答 控制事物处理的第三个时相
Ack_Setup(1); //对主机应答 控制事物处理的第三个时相,其余两个时相由D12自动完成
//Select_point(0);
//Clean_Buffer();
printf("setup包\n");
Control_Buffer.Device_Request.wValue=SWAP(Control_Buffer.Device_Request.wValue);
Control_Buffer.Device_Request.wIndex=SWAP(Control_Buffer.Device_Request.wIndex);
Control_Buffer.Device_Request.wLength=SWAP(Control_Buffer.Device_Request.wLength);
Control_Buffer.wLength=Control_Buffer.Device_Request.wLength;
//////////////标志///////////////////
Soft_Flag.Registerbit1.Endp1_In=1; //准许端点1控制输入传输传输数据
Soft_Flag.Registerbit1.Control_Status=0;//传输状态改为空闲,在正在传输的时候才改为传输,避免破坏数据指针
Soft_Flag.Registerbit1.Pc_Rx=0;
Soft_Flag.Registerbit1.Pc_Tx=0;
if(Control_Buffer.Device_Request.bmRequestType&0x80)//从设备到主机
{Soft_Flag.Registerbit1.Pc_Rx=1;Soft_Flag.Registerbit1.Pc_Tx=0;}
else {Soft_Flag.Registerbit1.Pc_Tx=1;Soft_Flag.Registerbit1.Pc_Rx=0;}
}
else
{
printf("不是setup\n");
Soft_Flag.Registerbit1.Control_Status=0;//传输状态为空闲
Select_point(0);
Clean_Buffer();
Soft_Flag.Registerbit1.Endp1_In=0;//不允许端点1进行控制输入传输
//return;
}
//////////////标志///////////////////
}
void Endp0_tx()
{
Read_Last_Status(1);
if(Soft_Flag.Registerbit1.Control_Status==0)
Control_Handler();
if(Soft_Flag.Registerbit1.Pc_Rx)
{
if(Control_Buffer.wLength>=16)
{
Write_Endp_Buffer(1,16,Control_Buffer.pData+Control_Buffer.wCount);
Control_Buffer.wLength=Control_Buffer.wLength-16;
Control_Buffer.wCount=Control_Buffer.wCount+16;
Soft_Flag.Registerbit1.Control_Status=1;
printf("传输了16个字节\n");
if(Soft_Flag.Registerbit1.Address==0)
Soft_Flag.Registerbit1.Control_Status=0;
}
else
{
Write_Endp_Buffer(1,Control_Buffer.wLength,Control_Buffer.pData+Control_Buffer.wCount);
Soft_Flag.Registerbit1.Control_Status=0;
Soft_Flag.Registerbit1.Endp1_In=0; //端点1不能在发送数据,直到端点0受到发送数据的命令
Soft_Flag.Registerbit1.Pc_Rx=0;
printf("传输最后几个字节\n");
}
}
if(Soft_Flag.Registerbit1.Pc_Tx)
{}
}
void Main_rx()
{
Read_Last_Status(4);
}
void Main_tx()
{
Read_Last_Status(5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -