📄 usbmain.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 + -