⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 endp0_r_w.c

📁 D12 的源代码
💻 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 + -