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

📄 siodvr.c

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 C
字号:
//==================================================================================//
// 文件名:    SIODVR.C
// 描  述:   该文件主要处理DVR程序,包括录、放音程序、以及语音数据的上传、下载程序。
// 日  期:   2003/04/03
// 库文件:   sacmv26e.lib
//==================================================================================//

#include "usbmain.h"
#include "dvr.h"
#include "hardware.h"

extern void SP_ClrWatchDog(void);
extern unsigned int SP_SIOReadAByte(unsigned long int);

extern void SP_SIOMassErase(void);
extern void SP_SIOSendAWord(unsigned long int,unsigned int);
extern unsigned int SP_SIOReadAWord(unsigned long int);
extern void SP_SIOSendAByte(unsigned long int,unsigned int);
extern unsigned int D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf);
extern unsigned int D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf);
extern unsigned int  MainEpBuf[];
extern unsigned int FileLen_Block;
extern unsigned int m_CtrlRecFileData;
extern unsigned int G_UpLoad_Flag;
extern unsigned int Key;
extern unsigned int KeyStatus;

void IsoDvrHandle(void);
void UpLoad(void);
void DownLoad(void);

unsigned long int SpeechFileLength=0;
unsigned long int DownLoadFileLen_Up=0x0000;
unsigned int Block_i=0;
unsigned int Byte_Value=0;
unsigned long int Addr=0;
unsigned int FileLen_Block=0;
unsigned long int Addr_UpLoad=0;
unsigned long int Up_Flash_Addr_Up=0;
unsigned int UpLoad_Counter=0;
unsigned long int Leave_Len=0;
unsigned int FlashAdd_Up=0;
unsigned long int Down_Flash_Addr_Up=0;

//=========================================================================
// 函数:    IsoDvrHandle
// 语法:    void IsoDvrHandle(void)       
// 描述:    进行数码录、放音处理
// 参数:    无
// 返回:    无
//=========================================================================
void IsoDvrHandle()
{
				unsigned int Ret;
					switch(Key)
					{
						
						case 0x00:
							break;
						case 0x01: // Record Key
							if (KeyStatus == Record) 
								SACM_DVR_Stop();
							KeyStatus = Record;
							Addr = 0;
							SACM_DVR_Initial(Manual);
						    SP_SIOMassErase();
	            			SACM_DVR_InitQueue();
							SACM_DVR_InitEncoder(RceMonitorOff);
							Key=0;  
							break;
						case 0x02: // Stop Key
							switch(KeyStatus)
							{
								case Record:   
									SACM_DVR_Stop();
									while(SACM_DVR_TestQueue() != Empty )
									{  // flush queue
										Ret = SACM_DVR_FetchQueue();	// Get data from Queue
										SP_SIOSendAWord(Addr,Ret);
										Addr += 2;
									}
									SpeechFileLength=Addr;
									break;
								case Play:
									SACM_DVR_Stop();
									break;
						
								default:			//
								    SACM_DVR_Stop();
									break;
							}				
							KeyStatus = Stop;
							break;
						case 0x04: // play key
							SACM_DVR_Initial(Manual);
							SACM_DVR_Stop();
							SP_RampUpDAC1();
							SP_RampUpDAC2();
							if(KeyStatus == Record)
							{
								while(SACM_DVR_TestQueue() != Empty)
								{
									Ret = SACM_DVR_FetchQueue();	// Put remain dat to Queue
									SP_SIOSendAWord(Addr,Ret);	// save to User Storage 
									Addr += 2;
								}// end of while
				                SpeechFileLength=Addr;
							
							}										
							KeyStatus = Play;
							Addr = 0x00c0;  
					
							SACM_DVR_InitQueue();
							while(SACM_DVR_TestQueue() != Full)
							{	
	                    		Ret=SP_SIOReadAWord(Addr);	     // User Storage SRAM/Flash ..
								SACM_DVR_FillQueue(Ret);		
								Addr += 2;	
								if(Addr>SpeechFileLength)
								{
									break;					
								}						
							}
							SACM_DVR_InitDecoder(DAC1+DAC2);
							Key=0;
							break;
						default:
							break;
					}		
			
					switch(KeyStatus)
					{	
						case Record:
							if(Addr < C_SflashSize)
							{					
								SACM_DVR_Encode();				    // Get data and Encode
								if(SACM_DVR_TestQueue() != Empty)
									{	// Save data if queue not empty
										Ret = SACM_DVR_FetchQueue();	// Get data from Queue
										SP_SIOSendAWord(Addr,Ret);			// save to User Storage 
										Addr += 2;
									}	
							}
							else
							{
					    		SACM_DVR_Stop();
								while(SACM_DVR_TestQueue() != Empty )
								{
									Ret = SACM_DVR_FetchQueue();	  // Get data from Queue
	     							SP_SIOSendAWord(Addr,Ret);
									Addr += 2;
								}
	         					KeyStatus = Stop;
						     }
			    			break;
						case Play:
						    if(SACM_DVR_TestQueue() != Full)
							{
	                        
		                    	Ret = SP_SIOReadAWord(Addr);	// Read User Storage 
								SACM_DVR_FillQueue(Ret);		// Fill Queue
								Addr += 2;
							}				
						
						    if(Addr<SpeechFileLength)
							{
								SACM_DVR_Decode();	
							}
							else
							{
								SACM_DVR_Stop();
								KeyStatus = Stop;	//放完语音,直接退出IsoDvrHandle();
								SP_RampDnDAC1();
								SP_RampDnDAC2();
							}	
				    		
							break;
							case Stop:
						default:
						    SACM_DVR_Stop();
							break;	
					}	// end of switch(Status)
		         
}

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

//=========================================================================
// 函数:    DownLoad
// 语法:    void DownLoad(void)       
// 描述:    每中断一次就调用一次,存储PC机下载的数据。
// 参数:    无
// 返回:    无
//=========================================================================
void DownLoad(void)
{
	unsigned int k=0;
	Block_i=0;
    FileLen_Block= D12_ReadEndpoint(4,64,MainEpBuf);
    k=0;//0229
    k=0;
    k=0;
  	if(DownLoadFileLen_Up<SpeechFileLength)
	{
		FlashAdd_Up++;
		if(FlashAdd_Up==1)
		{
			for(k=0;k<0x0fff;k++)
			{
				SP_ClrWatchDog();
				SP_SIOSendAWord(0x00ff0000,0xffff);
			}
			while(Block_i<FileLen_Block)
			{
				for(k=0;k<0x00ff;k++)
				{
					SP_SIOSendAWord(0x00ff0000,0xffff);
				}
				Byte_Value=256*MainEpBuf[Block_i+1]+MainEpBuf[Block_i];
			    SP_SIOSendAWord(Down_Flash_Addr_Up,Byte_Value);// save to User Storage 
				Block_i+=2;
				Down_Flash_Addr_Up+=2;
				SP_ClrWatchDog();
			}
		
		}
		else
		{
			while(Block_i<FileLen_Block)
			{
				Byte_Value=256*MainEpBuf[Block_i+1]+MainEpBuf[Block_i];
			    SP_SIOSendAWord(Down_Flash_Addr_Up,Byte_Value);// save to User Storage 
				Block_i+=2;
				Down_Flash_Addr_Up+=2;
				SP_ClrWatchDog();
			}
		}
		DownLoadFileLen_Up+=FileLen_Block;

	}
	if(DownLoadFileLen_Up>=SpeechFileLength)//download end handle
	{
				
		m_CtrlRecFileData=0;
	    D12_ReadEndpoint(4,64,MainEpBuf);//
	    Block_i=0;
	    FlashAdd_Up=0;	
	  
	}
}

⌨️ 快捷键说明

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