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

📄 main.c

📁 利用sunplus16位单片机实现USB接口的全套技术资料
💻 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.
//========================================================

//========================================================
//	工程名称:	USBMUSIC_UPDOWN_FOR_61BOARD.spj
//	功能描述:	(61板)通过USB通讯,实现文件的上传和下载,结合语音录放(DVR 实验)功能将压缩后的语
//				音通过PC机解码播放
//	涉及的库:	CMacro1016.lib
//	组成文件:	main.c				主文件
//				ISR.asm				SPCE061的中断处理函数,调用PDIUSBD12中断处理函数
//				SPCE061a.h			SPCE061a的宏定义
//				SPCE061a.inc		SPCE061a的宏定义,for 汇编
//				D12_HAL.asm			USB设备控制驱动,与具体使用的MCU及硬件相关
//				D12_HAL.h			USB设备控制驱动d12hal.asm的头文件
//				D12_CI.c			USB接口控制驱动,与具体使用的USB芯片相关
//				D12_CI.h			USB接口控制驱动d12ci.c的头文件
//				D12_Descriptor.c	USB协议层,PDIUSBD12所有描述符取值
//				D12_Descriptor.h	USB描述符结构体的定义,以及PDIUSBD12用到的一些宏定义的取值
//				D12_Chap9.c			USB协议层,完成所有与控制传输相关的工作
//				D12_Chap9.h			USB协议层chap9.c的头文件,包含控制传输用到的结构体的定义
//				D12_User.c			USB应用层,包含提供给用户使用的API函数
//				D12_User.h			USB应用层头文件.h
//				D12_Config.inc		USB模块的硬件接口配置文件
//
//	硬件连接:
// 				SPCE061A --- PDIUSBD12
// 				IOA8~IOA15 - D0~D7
// 				IOB2 ------- INT_N
// 				IOB3 ------- RESET_N
// 				IOB4 ------- CS_N
// 				IOB5 ------- ALE
// 				IOB6 ------- WR_N
// 				IOB7 ------- RD_N
//
//	维护记录:	2007-03-15	v1.0
//				modified by liuxue
//				liuxue@sunnorth.com.cn
//========================================================

// =========================================
// 文件名称:main.c
// 功能描述:该文件是主程序文件,程序是一个大的循环体
//			 不断扫描中断标志变量,根据标志变量的值执行
//			 相应的动作
// 维护记录:modified by liuxue v1.0 2007-03-15
// =========================================
#include "SPCE061A.h"
#include "D12_Driver.h"
#include "4096.h"
#include "key.h"
#include "DVR.h"
#include "System.h"

unsigned int uiKey = 0;
unsigned int uiStatus = 0;
unsigned int FileLength[5];
unsigned int MainEpBuf[64];
unsigned long int SpeechFileLength = 0;
unsigned long Addr_UpLoad = 0;
unsigned long Leave_Len = 0;
unsigned int G_UpLoad_Flag = 0;

int main(void)
{
	unsigned int i;
	
	for(i=0; i<=50000; i++)
		*P_Watchdog_Clear = 0x01;
	
	*P_SystemClock = C_Fosc_49M|C_Fosc;						// 系统时钟设置为49M
	SP_SIOInitial();
	D12_Initial();
	Key_Init();

	D12_Reconnect_USB();									// PDIUSBD12芯片的软连接
	while(1)
	{
		*P_Watchdog_Clear = 0x0001;
		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;				// 清标志
			D12_Control_Handler();
		}
	    if(bEPPflags.bits.Ep2_ReceiveDataFlag==1)
		{
			bEPPflags.bits.Ep2_ReceiveDataFlag = 0;			// 清标志
			
			D12_ReadEndpointAndClrD12Int(4, 64, MainEpBuf);		// 

			if(MainEpBuf[0] == ID0)							// ID0 = 1, for test
			{
				D12_WriteEndpointAndClrD12Int(5, 1, MainEpBuf);			// 将ID0送到PC
			}
			if(MainEpBuf[0] == ID4)							// ID4 = 5, for upload
			{
				if(MainEpBuf[1] == 1)
				{
					__asm("IRQ OFF");
					FileLength[0] = ID4;
					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 = START_ADDR;
					D12_WriteEndpoint(5, 5, FileLength);
					G_UpLoad_Flag = 1;
					__asm("IRQ ON");
				}
			}
			if(MainEpBuf[0] == ID5)							// ID5 = 6, for download
			{
				if(MainEpBuf[1] == 1)
				{
					SP_SIOMassErase();

					SpeechFileLength = 256 * MainEpBuf[5] + MainEpBuf[4];
					SpeechFileLength = 256 * (SpeechFileLength) + MainEpBuf[3];
					SpeechFileLength = 256 * (SpeechFileLength) + MainEpBuf[2];

					Addr_UpLoad = START_ADDR;
					D12_WriteEndpointAndClrD12Int(5, 1, MainEpBuf);
					G_UpLoad_Flag = 2;
				}
			}
		}
		if(bEPPflags.bits.Ep2_SendDataFlag==1)
		{
			bEPPflags.bits.Ep2_SendDataFlag = 0;
		}
		uiKey = Key_Get();
		if(uiKey == KEY_1 || uiKey == KEY_2 || uiKey == KEY_3 || uiStatus != STOP)
		{
			Dvr();
		}
	}
	return 0;
}

⌨️ 快捷键说明

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