📄 ggpdiusbd12.c
字号:
/********************************************************************
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 + -