#include<at89x52.h>
#define DEBUG0
#define DEBUG1
#define uint8 unsigned char
#define Fclk 22118400UL
#define BitRate 9600UL
#define D12SetCommandAddr() P3_5=1
#define D12SetDataAddr() P3_5=0
#define D12SetWr() P3_6=1
#define D12ClrWr() P3_6=0
#define D12SetRd() P3_7=1
#define D12ClrRd() P3_7=0
#define D12SetPortIn() P0=0xFF
#define D12SetPortOut()
#define D12SetData(Value) P0=Value
#define D12GetData() P0
#define D12_READ_BUFFER 0xF0
#define D12_ACKNOWLEDGE_SETUP 0xF1
#define D12_CLEAR_BUFFER 0xF2
#define D12_SET_MODE 0xF3
#define READ_INTERRUPT_REGISTER 0xF4
uint8 Sending;
uint8 Buffer[16];
code uint8 HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void D12Write(uint8 d){
D12ClrWr();
D12SetPortOut();
D12SetData(d);
D12SetWr();
D12SetPortIn();
}
void D12WriteByte(uint8 Value){
D12SetDataAddr();
D12Write(Value);
}
void D12WriteCommand(uint8 Command){
D12SetCommandAddr();
D12Write(Command);
}
uint8 D12ReadByte(){
uint8 temp;
D12SetDataAddr();
D12ClrRd();
temp=D12GetData();
D12SetRd();
return temp;
}
void InitUART(){
EA=0;
TMOD&=0x0F;
TMOD|=0x20;
PCON=0x80;
SCON=0x50;
TH1=256-Fclk/(BitRate*12*16);
TL1=256-Fclk/(BitRate*12*16);
ES=1;
EA=1;
TR1=1;
}
void UartISR() interrupt 4{
if(RI) RI=0;
else{
TI=0;
Sending=0;
}
}
void UartPutChar(uint8 d){
SBUF=d;
Sending=1;
while(Sending);
}
void Prints(uint8 *pd){
while(*pd!='\0')
UartPutChar(*pd++);
}
void PrintHex(uint8 d){
Prints("0x");
UartPutChar(HexTable[d>>4]);
UartPutChar(HexTable[d&0x0F]);
UartPutChar(' ');
}
void UsbConnect(){
#ifdef DEBUG0
Prints("连接USB。\r\n");
#endif
D12WriteCommand(D12_SET_MODE);
D12WriteByte(0x16);
D12WriteByte(0x47);
}
uint8 D12ReadEndpointLastStatus(uint8 Endp){
D12WriteCommand(0x40+Endp);
return D12ReadByte();
}
uint8 D12ReadEndpointBuffer(uint8 Endp,uint8 Len,uint8 *Buf){
uint8 i,j;
D12WriteCommand(0x00+Endp);
D12WriteCommand(D12_READ_BUFFER);
D12ReadByte();
j=D12ReadByte();
if(j>Len)
j=Len;
#ifdef DEBUG1
Prints("读端点");
UartPutChar('0'+Endp/2);
Prints("缓冲区");
PrintHex(j);
Prints("字节。\r\n");
#endif
for(i=0;i<j;i++){
*(Buf+i)=D12ReadByte();
#ifdef DEBUG1
PrintHex(*(Buf+i));
#endif
}
#ifdef DEBUG1
if(j%16!=0) Prints("\r\n");
#endif
return j;
}
void D12AcknowledgeSetup(void){
D12WriteCommand(0x00+1);
D12WriteCommand(D12_ACKNOWLEDGE_SETUP);
D12WriteCommand(0x00+0);
D12WriteCommand(D12_ACKNOWLEDGE_SETUP);
}
void UsbEp0Out(){
#ifdef DEBUG0
Prints("USB端点0输出中断。\r\n");
#endif
if(D12ReadEndpointLastStatus(0)&0x20){
D12ReadEndpointBuffer(0,16,Buffer);
D12AcknowledgeSetup();
}
else
D12ReadEndpointBuffer(0,16,Buffer);
D12WriteCommand(D12_ACKNOWLEDGE_SETUP);
}
void main(void){
uint8 InterruptSource;
InitUART();
UsbConnect();
while(1){
D12WriteCommand(READ_INTERRUPT_REGISTER);
InterruptSource=D12ReadByte();
if(InterruptSource&0x80) Prints("USB总线挂起。\r\n");
if(InterruptSource&0x40) Prints("USB总线复位。\r\n");
if(InterruptSource&0x01) UsbEp0Out();
}
}
用户1622434 2012-2-18 22:21