📄 main.c
字号:
#include<reg52.h>
#include <stdio.h>
#include <string.h>
#include "hard.h"
#include "D12.h"
#include "main.h"
#include "USB.h"
#include "mydev.h"
//#include "myusb100.h"
//*************************************************************************
// USB 标准设备请求入口地址表
//*************************************************************************
code void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
//*************************************************************************
// 厂商请求入口地址表
//*************************************************************************
code void (*VendorDeviceRequest[])(void) =
{
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
read_write_register,
reserved,
reserved,
reserved
};
/////////////////////////////////////////////////////////////////
extern EPPFLAGS bEPPflags;
CONTROL_XFER ControlData;
//unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
extern int iEp1InLength ;
extern unsigned char idata GenEpBuf[];
unsigned char fa;
int loopback = 0;
int ledon = 0;
///////////////////////////////////////////////////////////////
/*void init_timer0(void)
{
TMOD &= 0XF0; // clear Timer 0
TMOD |= 0X1;
TL0 = 0X0; // value set by user
TH0 = 0X0; //value set by user
ET0 = 1; //IE.1
TR0 = 1; // TCON.4 start timer
PT0 = 1;
EA = 1;
} */
void init_serial(void)
{
SCON= 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON= 0x00; //SMOD=0;
TH1 = 0xFD; //Baud:9600 fosc=11.0592MHz
TR1 = 1; // timer 1 run
IE = 0x90; //Enable Serial Interrupt
}
void init_port()
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
}
void init_special_interrupts(void)
{
IT0 = 0;
EX0 = 1;
PX0 = 0;
}
//////////////////////////////////////////////////////////
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
void single_transmit(unsigned char * buf, unsigned char len)
{
if( len <= EP0_PACKET_SIZE) {
D12_WriteEndpoint(1, buf, len);
}
}
void code_transmit(unsigned char code * pRomData, unsigned short len)
{
ControlData.wCount = 0;
if(ControlData.wLength > len)
ControlData.wLength = len;
ControlData.pData = pRomData;
if( ControlData.wLength >= EP0_PACKET_SIZE) {
D12_WriteEndpoint(1, ControlData.pData, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
DISABLE;
bEPPflags.bits.control_state = USB_TRANSMIT;
ENABLE;
}
else {
D12_WriteEndpoint(1, pRomData, ControlData.wLength);
ControlData.wCount += ControlData.wLength;
DISABLE;
bEPPflags.bits.control_state = USB_IDLE;
ENABLE;
}
}
void init_unconfig(void)
{
// unsigned char i;
D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
}
void init_config(void)
{
D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
}
void delay(unsigned int i)
{
while((i--));
}
//////////////////////////////////////////////////////////
void disconnect_USB(void)
{
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING, D12_SETTOONE | D12_CLOCK_12M);
}
void connect_USB(void)
{
// reset event flags
DISABLE;
bEPPflags.value = 0;
ENABLE;
// V2.1 enable normal+sof interrupt
D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
}
void reconnect_USB(void)
{
disconnect_USB();
delay(5000);
connect_USB();
}
//////////////////////////////////////////////////////////
void control_handler()
{
unsigned char type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
if (type == USB_STANDARD_REQUEST)
(*StandardDeviceRequest[req])(); //标准设备请求处理
else if (type == USB_VENDOR_REQUEST)
(*VendorDeviceRequest[req])(); //厂商请求处理
else
stall_ep0();
}
void Check_led(void)
{
char i;
if(bEPPflags.bits.ep1_rxdone)
{
DISABLE;
bEPPflags.bits.ep1_rxdone = 0;
ENABLE;
if(iEp1InLength == 10)
{
if((GenEpBuf[0] == 'l') && (GenEpBuf[1] == 'o') && (GenEpBuf[2] == 'o') &&
(GenEpBuf[3] == 'p') && (GenEpBuf[4] == 'b') && (GenEpBuf[5] == 'a') &&
(GenEpBuf[6] == 'c') && (GenEpBuf[7] == 'k') && (GenEpBuf[8] == 'e') &&
(GenEpBuf[9] == 'n'))
{
loopback = 1;
return ;
}
else if((GenEpBuf[0] == 'l') && (GenEpBuf[1] == 'o') && (GenEpBuf[2] == 'o') &&
(GenEpBuf[3] == 'p') && (GenEpBuf[4] == 'b') && (GenEpBuf[5] == 'a') &&
(GenEpBuf[6] == 'c') && (GenEpBuf[7] == 'k') && (GenEpBuf[8] == 'd') &&
(GenEpBuf[9] == 'e'))
{
loopback = 0;
return ;
}
}
if(iEp1InLength == 5)
{
if((GenEpBuf[0] == 'l') && (GenEpBuf[1] == 'e') && (GenEpBuf[2] == 'd') &&
(GenEpBuf[3] == 'e') && (GenEpBuf[4] == 'n'))
{
ledon = 1;
GenEpBuf[0]=0x00;
return ;
}
else if((GenEpBuf[0] == 'l') && (GenEpBuf[1] == 'e') && (GenEpBuf[2] == 'd') &&
(GenEpBuf[3] == 'd') && (GenEpBuf[4] == 'e'))
{
ledon = 0;
P1=0xff;//关灯
return ;
}
}
if(ledon)
{
P1=~GenEpBuf[0];
return ;
}
for(i=0;i<iEp1InLength;i++)
{
DISABLE;
SBUF=GenEpBuf[i];
while(TI==0);
TI=0;
ENABLE;
return ;
}
}
}
void main(void)
{
init_port();
init_serial();
// init_timer0();
init_special_interrupts();
connect_USB();
DISABLE;
delay(5000);
reconnect_USB();
ENABLE;
/* Main program loop */
while( TRUE )
{
if (bEPPflags.bits.setup_packet)
{
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
} // if setup_packet
if (bEPPflags.bits.configuration)
Check_led();
if (bEPPflags.bits.serial&loopback)
{
DISABLE;
bEPPflags.bits.serial=0;
D12_WriteEndpoint(3,&fa,1);
ENABLE;
}
}
}
//D12中断服务
void usb_isr(void) interrupt 0
{
DISABLE;
fn_usb_isr();//调用D12中断服务子程序
ENABLE;
}
void serial(void) interrupt 4
{
DISABLE;
if(RI)
{
RI=0;
TI=0;
bEPPflags.bits.serial=1;
fa=SBUF;
SBUF=fa;
while(TI==0);
TI=0;
}
ENABLE;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -