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

📄 ggpdiusbd12.c

📁 自己写的usb啦
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************** 
TITLE:			GGPDIUSBD12.C
AUTHOR:			GanGuoqiang
DISCRIPTION: 	
NOTE:			
DATE :			2009.1.26
***********************************************************************/
#include "reg52.h"
#include "COMMON.H"
#include "GGPDIUSBD12.H"
sbit  D12IO=P0;
sbit  D12A0=P1^0;//extern
sbit  cs_D12=P1^1; 
sbit  ISR=P3^2;
sbit  D12WR=P3^6;
sbit  D12RD=P3^7;
extern UART51schar(char);			
extern UART51sstring(char []);
extern delayms(unsigned char );
void dispatch();
CONTROL_XFER CtrData;
//unsigned char idata Ep1Buf[16];//static
//unsigned char idata Ep2Buf[64];//static
/******************************************************************************/
/******************************************************************************/
/*union USBPC_FLAG pc_flag;
  union USBINT_FLAG int_flag;
  union USBLST_FLAG lst_flag;*/
/******************************************************************************/
/******************************************************************************/

/////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////
/*******************************写USB命令******************************************/
void D12write_COM(unsigned char D12com)
{
 	D12A0=1;
	D12WR=0;
	D12IO=D12com;
	//D12WR=0;
	D12WR=1;
	//D12IO=0xff;
}
/******************************************************************************/

/*****************************写USB数据*******************************************/
void D12write_DATA(unsigned char D12data)
{
 	D12A0=0;
	D12WR=0;
	D12IO=D12data;
	//D12WR=0;
	D12WR=1;
	//D12IO=0xff;
}
/******************************************************************************/

/******************************读USB数据************************************/
unsigned char D12read_DATA(void)
{
	unsigned char tmp;
 	D12A0=0x00;
	D12RD=0;
	tmp=D12IO;	
	D12RD=1;
	return tmp;
}
/************************************************************************************/
/***************************************INITIAL D12*********************************/
void D12_SetAddressEnable(unsigned char bAddress,unsigned char bEnable)
{
	D12write_COM(0XD0);//
	if(bEnable)
		bAddress|=0x80;
	D12write_DATA(bAddress);
	}
void D12_SetEndpointEnable(unsigned char bEnable)//D12_SetEndpointEnable(1);
{
	D12write_COM(0XD8);//
	if(bEnable)
	 	D12write_DATA(1);
	else D12write_DATA(0);
	}
void D12_SetMode(unsigned char bConfig,unsigned char bClkDiv) 	//
{
	D12write_COM(0Xf3);//
	D12write_DATA(bConfig);//67:ENDPOINT MODE4:SOFTCONNECT;E::INT MODE,CLK,NO LAZYCLK,RESERVED
	D12write_DATA(bClkDiv);//SOF_ONLY,SET BEFORE DMA,RESERVED,,3-0:CLKDIV=48/(N+1)	MHZ
	}
/*	
void D12_SetDMA(unsigned char bMode)
{
	D12write_COM(0Xfb);//
	D12write_DATA(bMode);//BUF EN,INFO EN,INT+SOF,AUTO RELOAD,DIRECTION 1W0R,DMA EN,1-0:ABRUCT CYCLE
	}
*/
/******************************************************************************/
/******************************************************************************/
D12init()
{
	unsigned char i=0;
	cs_D12=0;
	//disconnect();
	D12_SetMode(0x0e,0x43);
	for(i=0;i<200;i++)//////////
	delayms(100);
	D12_SetAddressEnable(0,1);
	D12_SetEndpointEnable(1);
	//D12_SetDMA(0x1c);//modify
	for(i=0;i<20;i++)
	delayms(100);
	D12_SetMode(0x1e,0x43);	
	//connect();
	cs_D12=0;
}

/******************************************************************************/
/************************读USB中断寄存器**************************************/
void read_int_register(void)
{
 D12write_COM(0xf4);
 int_flag.Register[0]=D12read_DATA();
 int_flag.Register[1]=D12read_DATA();
}
/******************************************************************************/
/******************************************************************************/
unsigned char D12_SelectEndpoint(unsigned char bEndp)
{
	D12write_COM(bEndp);	
	return D12read_DATA();
	}
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
{		
	D12write_COM(0X40+bEndp);
	return D12read_DATA();
		}	
void D12_SetEndpointStatus(unsigned char bEndp,unsigned char bStalled)
	{
		D12write_COM(0X40+bEndp);	
		D12write_DATA(bStalled);
	}
/******************************************************************************/
/****************************USB总线复位处理***********************************/
void busRST()
{
	pc_flag.Register=0;
	D12_SetEndpointEnable(1);
}
/******************************************************************************/
/*****************************USB总线挂起处理**********************************/
busSUS()
{
	;
}
/******************************************************************************/

///////////////////////////////////////////////////////////
/*++
						READ &	WRITE		& ACKNOWLEDGE
--*/
///////////////////////////////////////////////////////////
unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,unsigned char *buf)
{
	unsigned char i,j;
	if((D12_SelectEndpoint(endp)&0x01)==0)
		return 0;
/*	D12write_COM(endp);			//select an endpoint then* read a data::1-0:stall bit ,full/empty;
	if((D12read_DATA()&0x01)==0)//0x01	D12_FULLEMPTY
		return 0;//is empty*/
	/*if(!(D12_SelectEndpoit(endp)&0x01)) return 0;*/
	D12write_COM(endp+0x80);
	i=D12read_DATA();
	i&=0x60;
	/*	if(endp==2)
			{
				if(i==0x60)
					 pc_flag.bits.ep1buf_full=1;
				else pc_flag.bits.ep1buf_full=0;
			}
		if(endp==4)
			{
				if(i==0x60)
					 pc_flag.bits.ep2buf_full=1;
				else pc_flag.bits.ep2buf_full=0;
			}*/
	D12write_COM(0XF0);//can be int by other comm except select endp
	j=D12read_DATA();//reserved
	j=D12read_DATA();//length ;eop of the usb msg packet to decide which to be the last byte
	if(j>len)
		j=len;
	for(i=0;i<j;i++)
		*(buf+i)=D12read_DATA();
	D12write_COM(0XF2);							//clear buffer,except SETUP packet
	return j;											//length that you read in endp;
	}
//////////////////////////////////////////////////////////////////////////////////////////////////
void D12_AcknowledgeEndpoint(unsigned char endp)
{
	D12write_COM(endp);	//sent to endp
	D12write_COM(0xf1);	
	if(endp==0)
		D12write_COM(0xf2);	
	}
//////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char D12_WriteEndpoint(unsigned char endp ,unsigned char len, unsigned char * buf)
{
	unsigned char i;
	D12write_COM(endp);
	D12read_DATA();
	D12write_COM(0xf0);
	D12write_DATA(0);
	D12write_DATA(len);
	for(i=0;i<len;i++)
		 D12write_DATA(*(buf+i));
	D12write_COM(0xFA);//en buffer
	return len;
	}
//////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/******************************************************************************/
endp0_rxout() 	
{
	//unsigned char i;
	lst_flag.Register=D12_ReadLastTransactionStatus(0);//clr int
	if(lst_flag.bits.setup_packet)//assure setup_packet
		{
					CtrData.wLength=0;
					CtrData.wCount=0;
					//SETUP PACKET WRONG!
					if(D12_ReadEndpoint(
										0,
										sizeof(CtrData.DeviceRequest),
										(unsigned char *)(&(CtrData.DeviceRequest))													
										)
						!=sizeof(DEVICE_REQUEST)	
						)									  
						{
							//NAK_ep0();
							D12_SetEndpointStatus(0,1);
							D12_SetEndpointStatus(1,1);
							//pc_flag.bits.usb_idle=1;//nonsense
							return;
							}
					//keil c51 ^ usb//correctly received
					CtrData.DeviceRequest.wValue=SWAP16(CtrData.DeviceRequest.wValue);
					CtrData.DeviceRequest.wIndex=SWAP16(CtrData.DeviceRequest.wIndex);
					CtrData.DeviceRequest.wLength=SWAP16(CtrData.DeviceRequest.wLength);
					//ack
					D12_AcknowledgeEndpoint(0);//clear buffer
					D12_AcknowledgeEndpoint(1);

					//D12_SelectEndpoint(0);
					//D12write_COM(0XF2);//clear buffer
					CtrData.wLength=CtrData.DeviceRequest.wLength;
					CtrData.wCount=0;
					if(CtrData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
						{
							//START TRANSMIT TO PC
							pc_flag.bits.setup_packet=1;
							pc_flag.bits.control_in_endp=1;//SET STATUS	state=USB_TRANSMIT
						}//TRANSMIT
					else 
						{
								/*if(CtrData.DeviceRequest.wLength==0)//did not OUT
									 {
											//pc_flag.bits.setup_packet=1;
											pc_flag.bits.usb_idle=1;//SET STATUS
											//D12_SetEndpointStatus(0,1);
											//D12_SetEndpointStatus(1,1);
									  }//LENGTH=0;
								  else 
									  { 
											if(CtrData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
												 {
														pc_flag.bits.usb_idle=1;//control_state=USB_IDLE
														D12_SetEndpointStatus(0,1);
														D12_SetEndpointStatus(1,1);
												  }
									*/
								if(CtrData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE||CtrData.DeviceRequest.wLength==0)
									 {
											//pc_flag.bits.usb_idle=1;//control_state=USB_IDLE
											//NAK_ep0();
											D12_SetEndpointStatus(0,1);
											D12_SetEndpointStatus(1,1);
									  }
									else 
										{
											pc_flag.bits.setup_packet=1;	
											pc_flag.bits.control_out_endp=1;//SET RECEIVE STATUS	state=USB_RECEIVE
										 }
									 
								   //}//SET COMMAND WITH DATA	
								
						  }//ELSE RECEIVE
											
			}//IF SETUP PACKET		
			
/*	 else if(pc_flag.bits.control_out_endp)		//RECEIVE DATA	state==USB_RECEIVE	&!usb_idle
		 	{
		 		i=D12_ReadEndpoint(0,EP0_PACKET_SIZE,CtrData.dataBuffer+CtrData.wCount);//POINTER+COUNT,![0]+COUNT
		 		CtrData.wCount+=i;
		 		if(i!=EP0_PACKET_SIZE||CtrData.wCount>=CtrData.wLength)//RECEIVE FINISHED
		 			{
		 				pc_flag.bits.setup_packet=1;//seems not indispensible
		 				pc_flag.bits.control_out_endp=0;
						//UART51schar(0x0c);	
						//dispatch();	   						
		 			 }
		 	  }/*
		  else 
	 		 {
	 			pc_flag.bits.usb_idle=1;// STEP INTO WAITING STATE;usb_idle=0 not available
	 		  }	*/	
	else if(pc_flag.bits.control_out_endp) dispatch();	
}
/******************************************************************************/
/******************************************************************************/
void endp0_txin(void)
{
	short i=CtrData.wLength-CtrData.wCount;
	D12_ReadLastTransactionStatus(1);
	if(!pc_flag.bits.control_in_endp)//state!=USB_TRANSMIT
		return;

⌨️ 快捷键说明

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