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

📄 endpointfun.c

📁 AVR单片机 C语言程序设计经典实用
💻 C
字号:


#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "initial.h"
#include "pdiusbd12.h"
#include "endpointfun.h"
#include "descriptor.h"
#include "chap9.h"


void Control_In()
{
	uchar i;
	uint temp;
	temp = ControlData.wLength - ControlData.wCount;  
	i=D12_ReadLastStatus(1); 
	if(bEPPflags.bits.control_state != USB_TRANSMIT)
	{
		single_transmit(0, 0);
		return ;
	}
	if( temp >= 16) {							
		const_WriteEndpoint(1, 16, ControlData.pData + ControlData.wCount);
		ControlData.wCount += 16;
		bEPPflags.bits.control_state = USB_TRANSMIT;	
	}
	else if( temp != 0) {								
		const_WriteEndpoint(1,temp, ControlData.pData + ControlData.wCount);
		ControlData.wCount += temp;
		bEPPflags.bits.control_state = USB_IDLE;	
	}
	else if (temp== 0){
		const_WriteEndpoint(1, 0, 0); 			
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

void Control_Out()
{
	uchar req[8];
	uchar last,i;
	
	last=D12_ReadLastStatus(0);
	if(last & 0x20)
	{
		ControlData.wLength=0;
		ControlData.wCount =0;
		if(D12_ReadEndpoint(0,8,req) != 8)
		{
			D12_SetEndpointStatus(0,1); 
			D12_SetEndpointStatus(1,1);

			bEPPflags.bits.control_state = USB_IDLE;
			return;
		}
		
		ControlData.DeviceRequest.bmRequestType = req[0];
		ControlData.DeviceRequest.bRequest	    = req[1];
		ControlData.DeviceRequest.wValue 	 	= req[3] * 256 + req[2]; 
		ControlData.DeviceRequest.wIndex        = req[5] * 256 + req[4];
		ControlData.DeviceRequest.wLength       = req[7] * 256 + req[6];

	
		
		D12_Ackonwledge(0);
		D12_Ackonwledge(1);
		ControlData.wLength = ControlData.DeviceRequest.wLength;  
		if(ControlData.DeviceRequest.bmRequestType & (uchar)0x80)  
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.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 > 8)
				{
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0,1); /
					D12_SetEndpointStatus(1,1);
				}
				else
				  	bEPPflags.bits.control_state = USB_RECEIVE;
			}

		}	

	}
	else if(bEPPflags.bits.control_state == USB_RECEIVE)
	{
		i = D12_ReadEndpoint(0, 16,ControlData.dataBuffer + ControlData.wCount);	 	     

			 ControlData.wCount += i;					 			 
			 if( i != 16 || ControlData.wCount >= ControlData.wLength) 
			{  		                                                          	
				 bEPPflags.bits.setup_packet = 1;			     	    
				 bEPPflags.bits.control_state = USB_IDLE;	          
			 }
	}else 
		
		bEPPflags.bits.control_state = USB_IDLE;		

}




void Endpoint_1_In()
{
	uchar temp;
	temp= D12_ReadLastStatus(3);

}

void Endpoint_1_Out()
{
	uchar temp,full;
	temp = D12_ReadLastStatus(2);  
	full=D12_ReadEndpoint(2,16,GenEpBuf);
	if(full !=0)
		bEPPflags.bits.ep1_rxdone=1;
	
}


void MainInEndpoint()
{
	uchar temp;
	temp=D12_ReadLastStatus(5);
	

}

void MainOutEndpoint()
{
	uchar temp;
	temp=D12_ReadLastStatus(4);
	temp=D12_ReadEndpoint(4,64,EpBuf);
	if(temp !=0)
		bEPPflags.bits.ep2_rxdone=1;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -