📄 usb_main.c
字号:
//----------------------------------------------------------------
//
// F320 USB Speed Test
//
//----------------------------------------------------------------
// Include files
#include <c8051f320.h> // Header file for SiLabs c8051f320
#include <stddef.h> // Used for NULL pointer definition
#include "USB_API.h" // Header file for USB_API.lib
// Message Types
#define START_MSG 0x00 // Message types for communication with host
#define STOP_MSG 0x01
// Machine States
#define ST_WAIT_DEV 0x01 // Wait for application to open a device instance
#define ST_IDLE_DEV 0x02 // Device is open, wait for Setup Message from host
#define ST_RX 0x04 // Received Setup Message, decode and wait for data
#define ST_TX 0x08 // Receive file data from host
data BYTE M_State; // Current Machine State
data BYTE TX_ON;
data UINT BytesToWrite = 4096;
data BYTE *pBytesToWrite = (unsigned char *)&BytesToWrite;
data BYTE Buffer[3];
code BYTE TestBuf[4096] _at_ 0x1200; // Buf To Send
void Port_Init(void); // Initialize Ports Pins and Enable Crossbar
void State_Machine(void); // Determine new state and act on current state
//void Suspend_Device(void); // Place the device in suspend mode
//code BYTE ProductStr[] =
code BYTE SerialNumberStr[] = {22,0x03,'S',0,'p',0,'e',0,'e',0,'d',0,' ',0,'T',0,'e',0,'s',0,'t',0};
//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
void main(void)
{
PCA0MD &= ~0x40; // Disable Watchdog timer
USB_Init(0,0,NULL,NULL,SerialNumberStr,30,0x80,0x0207);// Initialize USB_API
CLKSEL |= 0x02;
RSTSRC |= 0x02;
Port_Init(); // Initialize crossbar and GPIO
USB_Int_Enable(); // Enable USB_API Interrupts
TX_ON = 0;
while (1);
}
void Port_Init(void)
{
P2MDOUT |= 0x0C; // Port 2 pins 0,1 set high impedence
XBR0 = 0x00;
XBR1 = 0x40; // Enable Crossbar
}
void State_Machine(void)
{
switch (M_State)
{
case ST_RX:
Block_Read(&Buffer, 3); // Receive and decode host Setup Message
if(Buffer[0] == 0)
{
TX_ON = 1;
pBytesToWrite[0]=Buffer[2];
pBytesToWrite[1]=Buffer[1];
Block_Write((BYTE*)&TestBuf,BytesToWrite);
}
else
{
TX_ON = 0;
}
break;
case ST_TX:
Block_Write((BYTE*)&TestBuf,BytesToWrite); // Receive File data from host
break;
default:
break;
}
}
// ISR for USB_API, run when API interrupts are enabled, and an interrupt is received
void USB_API_TEST_ISR(void) interrupt 16
{
BYTE INTVAL = Get_Interrupt_Source(); // Determine type of API interrupts
if (INTVAL & USB_RESET) // Bus Reset Event, go to Wait State
{
M_State = ST_WAIT_DEV;
}
if (INTVAL & DEVICE_OPEN) // Device opened on host, go to Idle
{
M_State = ST_IDLE_DEV;
}
if (INTVAL & TX_COMPLETE)
{
if (TX_ON) // Ack Transmit complete, go to RX state
{
M_State = ST_TX;
}
else // File block transmit complete, go to TX state
{
M_State = ST_IDLE_DEV; // Go to Idle when done
}
}
if (INTVAL & RX_COMPLETE) // RX Complete, go to RX Setup or RX file state
{
M_State = ST_RX;
}
if (INTVAL & DEVICE_CLOSE) // Device closed, wait for re-open
{
M_State = ST_WAIT_DEV;
}
if (INTVAL & FIFO_PURGE) // Fifo purged, go to Idle State
{
M_State = ST_IDLE_DEV;
}
State_Machine(); // Call state machine routine
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -