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

📄 main._c

📁 基于D12
💻 _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 + -