📄 endp0_r_w.c
字号:
//中断服务程序
void fn_usb_isr()
{
unsigned int i_st;
bEPPflags.bits.in_isr= 1;
i_st = D12_ReadlnterruptRegister();
if( i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
bEPPflags.bits.bus_reset = 1;
if(i_st & D12_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend = 1;
if(i_st & D12_INT_ENDPOIN)
ep0_rxdone() ;
if(i_st & D12_INT_ENDPOOUT)
ep0_rxdone();
if(i_st & D12_INT_ENDPIIN)
epl_txdone();
if(i_st & D12_INT ENDP1OUT)
epl_rxdone();
if(i_st & D12_INT_ENDP2IN)
main_txdone();
if(ist & D12_INT_ENDP2OUT)
main_rxdone( );
}
bEPPflags.bits.in_isr = 0
}
//端点0 out 服务程序
void epO_rxdone(void)
{
unsigned char ep_last, i;
ep_last = D12_ReadLastTransactionStatus(0);
if (ep_last & D12_SETUPPACKET)
{
ControlData.wLength = 0;
ControlData.wCount = 0;
if( D12 ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
(unsigned char*) (& (ControlData.DevieeRequest)) ) !=sizeof(DEVICE_REQUEST))
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
bEPPfiags.bits.controlstate = USB_IDLE;
return;
}
//数据高低字节互换
ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
ControtData.DeviceRequest.windex = SWAP(ControlData.DeviceRequest.windex);
ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
//对控制端点的输入/输出进行应答
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint (1);
ControlData.wLength= ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
if(ControlData.DeviceRequest.bmRequestType
&(unsigned char) USB_ENDPOINT_DIRECTION_MASK)
{
//从主机传送数据
bEPPflags.bits.setup_packet=1;
bEPPilags.bits.control_state = USB_TRANSMIT; //设置状态
}
else
{
if(ControlData.DeviceRequest.wLength ==0)
{
bEPPflags.bits.setup_packet=1;
bEPPflags.bits.control_state=USB_IDLE//设置状态
}
else
{
if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
{ //接收数据长度为0
bEPPfiags.bits.control_state = USB_IDLE;
D12_SetEndpointStatus(0,1);
D12_SetEndpointStatus(1,1);
}
else
{ bEPPflags.bits.control_state = USB_RECEIVE; //set receive state
}
} // set command with data
}/ / else set command
}//if setup packet
else if (bEPPflags.bits.control_state = = USB_RECEIVE)
{ //to receive datas
i= D12_ReadEndpoint(0, EP0_PACKET_SIZE,
ControlData.dataBuffer + ControlData.wCount)
ControlData.wCount + = i
if( i != EP0_PACKET_SIZE || ControlData.wCount>=ControlData.wLength)
{ //datas hve been received
bEPPfiags.bits.setup_phcket = 1;
bEPPfiags.bits.control_state = USB_IDLE;
}
}
else{
bEPPflags.bits.control_state = USB_IDLE; //go into waite state
}
}
//endp0 IN
void ep0_txdone(void)
{
short i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1); //清中断标志位
if (bEPPflags.bits.control_state ! = USB_TRANSMIT)
return;
if( i >= EP0_PACKET_SIZE) //剩下数据大于16K发送16K
{
ControlData.wLength)
D12_WriteEndpoint(l, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount)
ControlData.wCount + = EP0_PACKET_SIZE;
bEPPfiags.bits.controLstate = USB_TRANSMIT;
}
else if( i != 0)
{ //发送剩下的数据
D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
ControlData.wCount + = i;
bEPPflags.bits.control_state = USB_IDLE;
}
else if (i == 0)
{
D12_WriteEndpoint(l, 0, 0)
bEPPflags.bits.controlstate = USB_IDLE; //发送完毕
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -