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

📄 usbmain.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 C
字号:
//========================================================================
//	The information contained herein is the exclusive property of
//	Sunnnorth Technology Co. And shall not be distributed, reproduced,
//	or disclosed in whole in part without prior written permission.
//	(C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
//	ALL RIGHTS RESERVED
//	The entire notice above must be reproduced on all authorized copies.
//========================================================================
//=====================================================================================================
//  工程名称:	usb061
//  功能描述:   《实验箱指导书》综合实验
//              USB实现语音录放及其上传下载
//              通过USB接口模组和SPCE061A单片机的控制,可以把SPR4096A存储器的数据上传到PC机,也可以把
//              PC机的二进制文件下载到SPR4096A存储器。
//  涉及的库:	CMacro1016.lib
//            	SacmV26e.lib
//
//  组成文件:	usbmain.c/chap9.c/D12CI.c/ExternInt.c/SIODVR.c
//				isr.asm/hardware.asm/d12.asm/SP_SerialFlashV1.asm/SystemInital.asm
//     			chap9.h/D12CI.h/dvr.h/hardware.h/isr.h/key.h/usb11.h/usbmain.h
//              hardware.inc/key.inc
// 	硬件连接:  IOA0~2接按键S20~S22, 
//              IOA8~IOA15和D0~D7连接,IOB2->/INT,IOB3->/RES,IOB4->/RD,IOB5->/WR,IOB6->ALE,IOB8->/CS
//  维护记录:  	2003-04-03
//              2005-10-18  规范注释
//====================================================================================================
//============================================================================//
// 语法格式:	usbmain.c
// 功能描述: 	该文件是主程序文件,程序是一个大的循环体,不断扫描标志变量,根据标
//            	志变量的值执行相应的动作.
// 维护记录: 	2003/04/03
//            	2005/10/18  规范注释
//=============================================================================//
#include "usbmain.h"
#include "D12CI.h"
#include "chap9.h"
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//   external function and variable
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
extern void SP_ClrWatchDog(void);
extern void Interrupt_Off(void);
extern void Interrupt_On(void);
extern void Interrupt_Off_True(void);
extern void Interrupt_On_True(void);
extern void System_Initial0(void);
extern void Delay1(void);
extern EPPFLAGS bEPPflags;
extern unsigned long int Addr_UpLoad;
extern unsigned long int Down_Flash_Addr_Up;
extern unsigned long int Up_Flash_Addr_Up;
extern unsigned long int FlashAdd_Up;
extern void IsoDvrHandle(void);
extern void SP_SIOMassErase(void);
extern void SP_SIOSendAWord(unsigned long int,unsigned int);
extern unsigned int SP_SIOReadAWord(unsigned long int);
extern void D12_SetEndpointStatus(unsigned int bEndp, unsigned int bStalled);
extern void UpLoad(void);
extern void DownLoad(void);
extern unsigned int m_CtrlRecFileData;
extern unsigned long int DownLoadFileLen_Up;
extern unsigned long int SpeechFileLength;
extern unsigned SP_GetCh(void);
extern void System_ServiceLoop(void);
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//   function declare
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void disconnect_USB(void);
void connect_USB(void);
void reconnect_USB(void);
void stall_ep0(void);
void init_unconfig(void);
void init_config(void);
void single_transmit(unsigned int * buf, unsigned int len);
void code_transmit(unsigned int * pRomData, unsigned long int len);
void control_handler(void);
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//   define variable
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
CONTROL_XFER ControlData;
unsigned int Key=0;
unsigned int G_UpLoad_Flag=0;
unsigned int MainEpBuf[64];
unsigned int KeyStatus = Stop;
unsigned int FileLength[5];
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
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 disconnect_USB(void)
// 实现功能:	PC机断开USB设备
// 参数:    	无
// 返回值:  	无
//=====================================================================
void disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//=====================================================================
// 语法格式:   void connect_USB(void)
// 实现功能:   USB设备连接PC机
// 参数:    	无
// 返回值:    	无
//=====================================================================
void connect_USB(void)
{          
	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE); 
	D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M );
}
//=====================================================================
// 语法格式:   void reconnect_USB(void)
// 实现功能:   USB设备重连接
// 参数:    	无
// 返回值:    	无
//=====================================================================
void reconnect_USB(void)
{
	int i,j;
	disconnect_USB();
 	for(i=0;i<=500;i++)
    {
		for(j=0;j<1000;j++)
		{
         	SP_ClrWatchDog();
		};
	};
	connect_USB();
}
//=====================================================================
// 语法格式:   void stall_ep0(void)
// 实现功能:   端点0禁止
// 参数:    	无
// 返回值:    	无
//=====================================================================
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}
void init_unconfig(void)
{
	D12_SetEndpointEnable(0);	                /* Disable all endpoints but EPP0. */
}
void init_config(void)
{
	D12_SetEndpointEnable(1);	                /* Enable  generic/iso endpoints. */
}
//=====================================================================
// 语法格式:   void single_transmit(void)
// 实现功能:   使用端点0的IN 传输一次,最大传送16bytes数据
// 参数:   	无
// 返回值:   	无
//=====================================================================
void single_transmit(unsigned int * buf, unsigned int len)
{
	if( len <= EP0_PACKET_SIZE) 
	{
		D12_WriteEndpoint(1, len, buf);
	}
}
//=====================================================================
// 语法格式:   void code_transmit(void)
// 实现功能:   使用端点0的IN 传输多次,可以传送大于16BYTES的数据
// 参数:   	无
// 返回值:    	无
//=====================================================================
void code_transmit(unsigned int * pRomData, unsigned long int len)
{
	ControlData.wCount = 0;
	if(ControlData.wLength > len)
		ControlData.wLength = len;
	ControlData.pData = pRomData;
	if( ControlData.wLength >= EP0_PACKET_SIZE) 
	{	
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
		ControlData.wCount += EP0_PACKET_SIZE;
		Interrupt_Off();
		bEPPflags.bits.control_state = USB_TRANSMIT;
		Interrupt_On();
	}
	else
    {					
		D12_WriteEndpoint(1, ControlData.wLength, pRomData);
		ControlData.wCount += ControlData.wLength;
		Interrupt_Off();
		bEPPflags.bits.control_state = USB_IDLE;
		Interrupt_On();
	}
}
//=====================================================================
// 语法格式:   void control_handler(void)
// 实现功能:   判断windows的USB协议请求,并调用相应的处理函数进行处理
// 参数:    	无
// 返回值:    	无
//=====================================================================
void control_handler()
{
	unsigned int 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
		stall_ep0();
}
//======================================================================================
// 语法格式:   void main(void)
// 实现功能:   进行初始化处理,判断标志处理,根据标志变量执行相应的程序,是一个大的循环体
// 参数:    	无
// 返回值:    	无
//======================================================================================
main()
{
	int i=0;
	unsigned int Ret=0;
	System_Initial0();
	for(i=0;i<64;i++)
	{
		MainEpBuf[i]=0;
	};
		
	reconnect_USB();
    SP_InitWriteD12();
	Interrupt_On();
	while( TRUE )
	{
	    if (bEPPflags.bits.bus_reset)
		{
			bEPPflags.bits.bus_reset = 0;
		}   
		if (bEPPflags.bits.suspend)
	    {
		    bEPPflags.bits.suspend= 0;
		} 
		if (bEPPflags.bits.setup_packet)
		{
			bEPPflags.bits.setup_packet = 0;
			control_handler();
		}
		Key = SP_GetCh();
		SP_ClrWatchDog();
		if(Key==1||Key==2||Key==4||KeyStatus!=Stop)
		{
			Ret=0;
			IsoDvrHandle();
			Ret=0;
		
		}
	    if(bEPPflags.bits.ep2_rxdone==1)
		{
			bEPPflags.bits.ep2_rxdone = 0;
		    Ret= D12_ReadEndpoint(4,64,MainEpBuf);//FileLen_Block为缓冲区中有效数据的长度 
			if(MainEpBuf[0]==ID0)                 //ID0=1  for test
			{   
		 	 	D12_WriteEndpoint(5,1,MainEpBuf); //将ID0送到PC
			}
			   
			if(MainEpBuf[0]==ID3)                 //ID3=4  for dvr
			{
	       
			}
			if(MainEpBuf[0]==ID4)                  //ID4=5   UPLOAD
			{ 
				if(MainEpBuf[1]==1)
				{
				    Interrupt_Off_True();
					FileLength[0]=5;               //APPLY ID
					FileLength[1]=(unsigned int)(0x000000FF&SpeechFileLength);
					FileLength[2]=(unsigned int)((0x0000FF00&SpeechFileLength)>>8);
					FileLength[3]=(unsigned int)((0x00FF0000&SpeechFileLength)>>16);
					FileLength[4]=(unsigned int)((0xFF000000&SpeechFileLength)>>24);
				    ////
				    Addr_UpLoad=0;
				    Up_Flash_Addr_Up=0x0000;
				    FlashAdd_Up=0;
				    D12_WriteEndpoint(5,5,FileLength);//将FileLength送到PC
				    G_UpLoad_Flag=1;
				    Interrupt_On_True();
 
				}
			}
			if(MainEpBuf[0]==ID5)                    //ID5=6  DOWNLOAD
			{
			    
				if(MainEpBuf[1]==1)
				{
					Interrupt_Off_True();
				    SP_SIOMassErase();
				    SP_ClrWatchDog();
				    SpeechFileLength=256*MainEpBuf[5]+MainEpBuf[4];
				    SpeechFileLength=256*(SpeechFileLength)+MainEpBuf[3];
				    SpeechFileLength=256*(SpeechFileLength)+MainEpBuf[2];
				    DownLoadFileLen_Up=0x0000;
				    Down_Flash_Addr_Up=0x0000;
				    FlashAdd_Up=0;
				   	D12_WriteEndpoint(5,1,MainEpBuf);
				    m_CtrlRecFileData=1;
				    Interrupt_On_True(); //
				}
			}                                               //end if download
		}                                                   //end if ep2_rxdone==1
	}                                                       // Main Loop

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -