?? endp0_r_w.c
字號:
//中斷服務程序
void fn_usb_isr()
{
unsigned int i_st;
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
}
}/ / 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 + -