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

📄 dvr_updown.c

📁 利用sunplus16位单片机实现USB接口的全套技术资料
💻 C
字号:
// =========================================
// 文件名称:DVR_UPDOWN.c
// 功能描述:DVR程序,包括录、放音程序;语音数据的上传、下载
// 库文件:  sacmv26e.lib
// 维护记录:modified by liuxue v1.0 2007-03-16
// =========================================

#include "SPCE061A.h"
#include "dvr.h"
#include "4096.h"
#include "D12_Driver.h"
#include "System.h"

// =========================================
// 函数:void Dvr(void)
// 描述:录放音处理
// 参数:无
// 返回:无
// =========================================
void Dvr(void)
{
	static unsigned long ulAddr;
	unsigned int uiRet;

	switch(uiKey)
	{
		case KEY_NO:
			break;
		case KEY_REC:
			if(uiStatus == RECORD)
			{
				SACM_DVR_Stop();
			}
			uiStatus = RECORD;
			SP_SIOMassErase();
			SACM_DVR_Initial(0);	// 手动录音
			SACM_DVR_InitQueue();	// 初始化队列
			SACM_DVR_InitEncoder(1);// 初始化编码器
			ulAddr = START_ADDR;
			SpeechFileLength = 0;
			break;
		case KEY_STOP:
			switch(uiStatus)
			{
				case RECORD:
					SACM_DVR_Stop();						// 编码
					while(SACM_DVR_TestQueue() != EMPTY)		// 录音语音队列是否为空
					{
						uiRet = SACM_DVR_FetchQueue();		// 从录音队列中取语音资源
						SP_SIOSendAWord(ulAddr, uiRet);	// 写到FLASH中
						ulAddr+=2;							// 地址变量加2
						SpeechFileLength += 2;
					}
					break;
				case PLAY:
					SACM_DVR_Stop();
					break;
				default:
					SACM_DVR_Stop();
					break;
			}
			uiStatus = STOP;
			break;
		case KEY_PLAY:
			SACM_DVR_Stop();
			if(uiStatus == RECORD)
			{
				while(SACM_DVR_TestQueue() != EMPTY)
				{
					uiRet = SACM_DVR_FetchQueue();		// 从录音队列中取语音资源
					SP_SIOSendAWord(ulAddr, uiRet);		// 写到FLASH中
					ulAddr += 2;						// 地址变量加2
					SpeechFileLength += 2;
				}
			}
			uiStatus = PLAY;
			ulAddr = START_ADDR;
			
			SACM_DVR_InitQueue();
			while(SACM_DVR_TestQueue() != FULL)
			{
				uiRet = SP_SIOReadAWord(ulAddr);        // 读FLASH取语音资源
				SACM_DVR_FillQueue(uiRet);				// 填充语音队列
				ulAddr += 2;
				if(ulAddr > START_ADDR+SpeechFileLength)
					break;
			}
			SACM_DVR_InitDecoder(3);
			break;
		default:
			break;
	}
	switch(uiStatus)
	{
		case RECORD:
			SACM_DVR_Encoder();
			if(ulAddr < END_ADDR)
			{
				if(SACM_DVR_TestQueue() != EMPTY)
				{
					uiRet = SACM_DVR_FetchQueue();
					SP_SIOSendAWord(ulAddr, uiRet);		// 写到FLASH中
					ulAddr += 2;
					SpeechFileLength += 2;
				}
			}
			else
			{
				SACM_DVR_Stop();
				while(SACM_DVR_TestQueue() != EMPTY)
				{
					uiRet = SACM_DVR_FetchQueue();
					SP_SIOSendAWord(ulAddr, uiRet);		// 写到FLASH中
					ulAddr += 2;
					SpeechFileLength += 2;
				}
				uiStatus = STOP;
			}
			break;
		case PLAY:
			if(SACM_DVR_TestQueue() != FULL)
			{
				uiRet = SP_SIOReadAWord(ulAddr);        // 读FLASH取语音资源
				SACM_DVR_FillQueue(uiRet);
				ulAddr += 2;
			}
			if(SACM_DVR_Status()&0x01)
				SACM_DVR_Decoder();
			else
			{
				SACM_DVR_Stop();
				uiStatus = STOP;
			}
			break;
		case STOP:
		default:
			SACM_DVR_Stop();
			break;
	}
	*P_Watchdog_Clear = 0x01;
}

// =========================================
// 函数:void UpLoad(void)
// 描述:每中断一次就调用一次,从FLASH中读取语音数据,并写入D12芯片
// 参数:无
// 返回:无
// =========================================
void UpLoad(void)
{
	unsigned int Ret;
	unsigned int i = 0;
	unsigned int Block = 64;
	
	Leave_Len = SpeechFileLength - (Addr_UpLoad-START_ADDR);		// Leave_Len值为偶数
	if(Leave_Len <= 64)
	{
		Block = (unsigned int)Leave_Len;
	}
	while(i < Block)
	{
		Ret = SP_SIOReadAWord(Addr_UpLoad);
		MainEpBuf[i++] = (Ret & 0x00ff);
		Ret >>= 8;
		MainEpBuf[i++] = Ret;
		Addr_UpLoad += 2;
	}
	if(Leave_Len > 64)
	{
		D12_WriteEndpoint(5, 64, MainEpBuf);
	}
	else
	{
		D12_WriteEndpoint(5, Block, MainEpBuf);
		G_UpLoad_Flag = 0;		// over
	}
}


// =========================================
// 函数:void DownLoad(void)
// 描述:每中断一次就调用一次,存储PC机下载的数据
// 参数:无
// 返回:无
// =========================================
void DownLoad(void)
{
	unsigned int Block = 64;
	unsigned int i, TempWord;
	
	Leave_Len = SpeechFileLength - (Addr_UpLoad-START_ADDR);
	
	if(Leave_Len>64)
	{
		D12_ReadEndpointAndClrD12Int(4, 64, MainEpBuf);
	}
	else
	{
		Block = Leave_Len;
		D12_ReadEndpointAndClrD12Int(4, Block, MainEpBuf);
	}
	for(i = 0; i < Block; i += 2 )
	{
		TempWord = MainEpBuf[i+1] << 8;
		TempWord += MainEpBuf[i];
		SP_SIOSendAWord(Addr_UpLoad, TempWord);
		Addr_UpLoad += 2;
	}
	if(Block<64)
	{
		G_UpLoad_Flag = 0;		// over
	}
}

⌨️ 快捷键说明

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