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

📄 usb_main.c

📁 8051F320系列单片机内置USB控制器的使用源代码
💻 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 + -