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

📄 usbmain.c

📁 D12 Mcu 凌阳.用BULK传输方式,实现语音播放
💻 C
字号:
//============================================================================//
// 文件名:    usbmain.c
// 描  述:   该文件是主程序文件,程序是一个大的循环体,不断扫描标志变量,根据标
//            志变量的值执行相应的动作.
// 日  期:   2003/04/03
// 库文件:   NONE
//=============================================================================//
#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
};
//=====================================================================
// 函数:    disconnect_USB
// 语法:    void disconnect_USB(void)
// 描述:    PC机断开USB设备
// 参数:    NONE
// 返回:    NONE
//=====================================================================
void disconnect_USB(void)
{
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//=====================================================================
// 函数:    connect_USB
// 语法:    void connect_USB(void)
// 描述:    USB设备连接PC机
// 参数:    NONE
// 返回:    NONE
//=====================================================================
void connect_USB(void)
{          
	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE); 
	D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M );
}
//=====================================================================
// 函数:    reconnect_USB
// 语法:    void reconnect_USB(void)
// 描述:    USB设备重连接
// 参数:    NONE
// 返回:    NONE
//=====================================================================
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();
}
//=====================================================================
// 函数:    stall_ep0
// 语法:    void stall_ep0(void)
// 描述:    端点0禁止
// 参数:    NONE
// 返回:    NONE
//=====================================================================
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. */
}
//=====================================================================
// 函数:    single_transmit
// 语法:    void single_transmit(void)
// 描述:    使用端点0的IN 传输一次,最大传送16bytes数据
// 参数:    NONE
// 返回:    NONE
//=====================================================================
void single_transmit(unsigned int * buf, unsigned int len)
{
	if( len <= EP0_PACKET_SIZE) 
	{
		D12_WriteEndpoint(1, len, buf);
	}
}
//=====================================================================
// 函数:    code_transmit
// 语法:    void code_transmit(void)
// 描述:    使用端点0的IN 传输多次,可以传送大于16BYTES的数据
// 参数:    NONE
// 返回:    NONE
//=====================================================================
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();
	}
}
//=====================================================================
// 函数:    control_handler
// 语法:    void control_handler(void)
// 描述:    判断windows的USB协议请求,并调用相应的处理函数进行处理
// 参数:    NONE
// 返回:    NONE
//=====================================================================
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();
}
//======================================================================================
// 函数:    main
// 语法:    void main(void)
// 描述:    进行初始化处理,判断标志处理,根据标志变量执行相应的程序,是一个大的循环体
// 参数:    NONE
// 返回:    NONE
//======================================================================================
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 + -