📄 main._c
字号:
#include <iom162v.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>
#include "MAIN.H"
#include "D12CI.H"
#include "CHAP9.H"
#include "BulkOnly.H"
///////////////////////////////////
#include "Fat.h"
///////////////////////////////////
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
};
void(* VendorDeviceRequest[])(void)=
{
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved,
reserved
};
extern EPPFLAGS bEPPflags;
extern IO_REQUEST ioRequest;
CONTROL_XFER ControlData;
void init_port()
{
PORTC = 0xff;
DDRC = 0xff;//保持状态
DDRD = 0xea; //1110 1010关闭引脚上拉电阻,使正确读取引脚输入
PORTD = 0xd8; //1101 1000
DDRA = 0xff; //关闭上拉电阻,使正确读写外部SRAM
DDRC = 0x00;
MCUCR = 0xc0;
GICR|=BIT(INT0);
}
void init_serial(void)
{
UBRR0H=(unsigned char)(51>>8);
UBRR0L=(unsigned char)51;
UCSR0B=BIT(TXEN0);
UCSR0C=(1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
}
void disconnect_USB(void)
{
D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING,D12_SETTOONE|D12_CLOCK_8M);
}
void connect_USB(void)
{
DISABLE;
bEPPflags.value=0;
ENABLE;
D12_SetEndpointStatus(4,0);
D12_SetEndpointStatus(5,0);
D12_SetDMA(0);
D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING|D12_SOFTCONNECT,D12_SETTOONE|D12_CLOCK_8M);
}
void reconnect_USB(void)
{
unsigned int i;
disconnect_USB();
ENABLE;
for(i=0;i<50000;i++);
DISABLE;
connect_USB();
}
void stall_ep0()
{
D12_SetEndpointStatus(0,1);
D12_SetEndpointStatus(1,1);
}
void init_unconfig(void)
{
D12_SetEndpointEnable(0);
}
void init_config(void)
{
D12_SetEndpointEnable(1);
}
void single_transmit(unsigned char * buf,unsigned char len)
{
if(len<=EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1,len,buf);
}
}
void code_transmit(const unsigned char * pRomData,unsigned short len)
{
ControlData.wCount=0;
if(ControlData.wLength>len)
ControlData.wLength=len;
ControlData.pCData=pRomData;
if(ControlData.wLength>=EP0_PACKET_SIZE)
{
bEPPflags.bits.rom_state=1;
D12_CWriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pCData);
ControlData.wCount+=EP0_PACKET_SIZE;
DISABLE;
bEPPflags.bits.control_state=USB_TRANSMIT;
ENABLE;
}
else
{
D12_CWriteEndpoint(1,ControlData.wLength,pRomData);
ControlData.wCount+=ControlData.wLength;
DISABLE;
bEPPflags.bits.control_state=USB_IDLE;
ENABLE;
}
}
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 main(void)
{
NOP();NOP();
NOP();NOP();
init_port();
init_serial();
// Format_Fat16Media();
D12_ReadInterruptRegister();
D12_ReadLastTransactionStatus(0);
D12_ReadLastTransactionStatus(1);
D12_ReadLastTransactionStatus(2);
D12_ReadLastTransactionStatus(3);
D12_ReadLastTransactionStatus(4);
D12_ReadLastTransactionStatus(5);
ENABLE;
reconnect_USB();
ENABLE;
while(TRUE)
{
if(bEPPflags.bits.bus_reset)
{
DISABLE;
bEPPflags.bits.bus_reset=0;
ENABLE;
}
if(bEPPflags.bits.suspend)
{
DISABLE;
bEPPflags.bits.suspend=0;
ENABLE;
}
if(bEPPflags.bits.setup_packet)
{
DISABLE;
bEPPflags.bits.setup_packet=0;
ENABLE;
control_handler();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -