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

📄 main.c

📁 随着数字语音、图像处理技术的飞速发展
💻 C
字号:


//==========================================================================
// 程序名称:    main.c
// 日期:        2002/8/16
// 功能:      利用SPCE061A的IO口扩展一块HM628128A,完成录、放音功能
// 库函数:    sacmv26e.lib库
//===========================================================================

#include "dvr.h"

#define	SRAM_Size		0x1ffff-4    //HM628128A容量

#define	Stop			0
#define	Record			1
#define Play			2	

#define	Full			1			
#define	Empty			2

#define	DAC1			1		// DAC output
#define DAC2			2

#define	RceMonitorOff	0
#define	RceMonitorOn	1

#define Manual			0
#define	Auto			1

unsigned int aWriteData[130];
unsigned int ReadData=0;
unsigned int G_TestValue=0;
unsigned int Write256BytesFlag=0;
//unsigned int Addr_Counter=0;
unsigned int Addr_Counter_Tmp=0;
unsigned int Key, Mode, Status;
unsigned long int  Addr, Addr_Save;
unsigned long int  Addr_Long;
unsigned long int  yxh=0;

unsigned int a_Data_Protection_Dis_addr[6]={0x5555,0x2aaa,0x5555,0x5555,0x2aaa,0x5555};
unsigned int a_Data_Protection_Dis_data[6]={0xaa00,0x5500,0x8000,0xaa00,0x5500,0x2000};
unsigned int a_chip_erase_data[6]={0xaa00,0x5500,0x8000,0xaa00,0x5500,0x1000};

unsigned int  Write_W29C040_Status_Check(unsigned long int,unsigned int);
void SP_InitW29C040Flash(void);
extern void Delay11ms(void);
extern void SPCE061A_IO_Initial(void);
int main()
{
	unsigned int abin=0;
	unsigned int i=0,j=0;
	Mode = Manual;       //手工方式				
    System_Initial();
    
  	SACM_DVR_Initial(Mode);   //DVR初始化
	Status = Stop;  
	
//for test  0604
	SP_SPBA_Initial();
//	SP_InitW29C040Flash();
//	SP_InitWriteW29C040Flash();//仅初始化A口高8bits为输出
//	SP_SPBA_Write_Initial();//0603	
	
	Addr=0x0000;
	/*
    while(1)
	{
		SP_InitWriteW29C040Flash();
		SP_SPBA_Write_Initial();//0603
		SP_SPBA_WriteWord(Addr,0x5a5a);
		SP_InitReadW29C040Flash();
		Addr = SP_SPBA_Read_Initial(0);
		ReadData = SP_SPBA_ReadWord(Addr);
		
		Addr+=2;
	}
	*/
	
    while(1)
	{
		//Key=();
		Key=GetKeyScanValue();
		if(Key>0)
		{	
			switch(Key)
			{
				case 0x00:
					break;
				case 0x01:         // 录音键
				     Status = Record;
					 Addr = 0;	
					 Addr_Counter_Tmp=0;
					 // SP_InitWriteSRAM();     //写初始化
	                 SP_InitW29C040Flash();
	                 
	                 SP_InitWriteW29C040Flash();//仅初始化A口高8bits为输出
	                 SP_SPBA_Write_Initial();//0603
	                 SACM_DVR_InitQueue();
	                 SACM_DVR_InitEncoder(RceMonitorOn);	
				 	 break;
					  
			//	case 0x02:         //停止键
				case 0x04:         //停止键
				/*
					switch(Status)
					{
						case Record:
							SACM_DVR_Stop();
							while(SACM_DVR_TestQueue() != Empty)
							{
								Ret = SACM_DVR_FetchQueue();
								//SP_WriteSRAM(Addr,Ret);	//将队列中的数据写入HM628128A
								//SP_InitWriteW29C040Flash(); 
								SP_Write_W29C040_One_Word(Addr,Ret);
								Addr += 2;
							}
							//SP_WriteSRAM(Addr,0xFFFF);	//写结束标志----连续三字节FF
							//SP_InitWriteW29C040Flash(); 
							SP_Write_W29C040_One_Word(Addr,0xFFFF);
							Addr += 2;					//
							//SP_WriteSRAM(Addr,0x00FF);	//
							//SP_InitWriteW29C040Flash(); 
							SP_Write_W29C040_One_Word(Addr,0x00FF);
							break;
						case Play:
							SACM_DVR_Stop();
							break;
					}		
					Status = Stop;
					*/
					break;
				
				//case 0x04:              //播放键
				case 0x02:              //播放键
					SACM_DVR_Stop();
					if(Status == Record)//如果处于录音状态,执行关闭录音处理
					{
						
						while(SACM_DVR_TestQueue() != Empty)
						{
							
							aWriteData[Addr_Counter_Tmp] = SACM_DVR_FetchQueue();	
							Addr_Counter_Tmp++;
							//SP_WriteSRAM(Addr,Ret);
							//SP_InitWriteW29C040Flash(); 
							if(Addr_Counter_Tmp==128)
							{
								if(Write256BytesFlag==1)
								{
									while(Write_W29C040_Status_Check(Addr,G_TestValue)==0);
								}
								for(i=0;i<128;i++)
								{
									//SP_Write_W29C040_One_Word(Addr,aWriteData[i]);
									SP_SPBA_WriteWord(Addr,aWriteData[i]);//0603
									Addr += 2;
									
								}
								G_TestValue=aWriteData[127];
							    Addr_Counter_Tmp=0;
							}
						
						}		
						if(Addr_Counter_Tmp<0x0080)
						{
								if(Write256BytesFlag==1)
								{
									while(Write_W29C040_Status_Check(Addr,G_TestValue)==0);
								}
								for(i=0;i<Addr_Counter_Tmp;i++)
								{
									//SP_Write_W29C040_One_Word(Addr,aWriteData[i]);
									SP_SPBA_WriteWord(Addr,aWriteData[i]);//0603
									Addr += 2;
									
								}
								Addr_Counter_Tmp-=1;
								G_TestValue=aWriteData[Addr_Counter_Tmp];
								for(i=0;i<0x0500;i++);
								while(Write_W29C040_Status_Check(Addr,G_TestValue)==0);
								Addr_Counter_Tmp=0;
								Write256BytesFlag=0;
						}						
												
						/*
						//SP_WriteSRAM(Addr,0xFFFF);
						SP_Write_W29C040_One_Word(Addr,0xFFFF);			
						Addr += 2;							
						//SP_WriteSRAM(Addr,0x00FF);
						SP_Write_W29C040_One_Word(Addr,0x00FF);		
						for(j=0;j<0x500;j++);//看情况删掉????????????
						*/
					}
					
					
					for(i=0;i<0x0100;i++);
					Status = Play;        //置为播放模式
					Addr = 0;
					//SP_InitReadSRAM();   //读初始化
					//SP_InitReadW29C040Flash();///???????????
					Addr = SP_SPBA_Read_Initial(0);
					SACM_DVR_InitQueue();
			
					while(SACM_DVR_TestQueue() != Full)   
					{	
						//Ret = SP_ReadSRAM(Addr);			//
						
						
					//	ReadData=SP_Read_W29C040_One_Word(Addr);
						ReadData = SP_SPBA_ReadWord(Addr);
						SACM_DVR_FillQueue(ReadData);			//
						Addr += 2;							// 
					}
					SACM_DVR_InitDecoder(DAC1+DAC2);										
					break;
					
				default:
					break;
			} // end of switch(Key)
		}// end if(key>0)
					
		switch(Status)
		{	
			case Record:
				if(Addr < SRAM_Size)//????????????????????????????????????
				{						
					SACM_DVR_Encode();				   //
					if(SACM_DVR_TestQueue() != Empty)  //
					{	
						
						//SP_WriteSRAM(Addr,Ret);			//
						
						 //SP_InitWriteW29C040Flash(); 
						aWriteData[Addr_Counter_Tmp] = SACM_DVR_FetchQueue();
						Addr_Counter_Tmp++;	
						if(Addr_Counter_Tmp==128)
						{
							if(Write256BytesFlag==1)
							{
								Write256BytesFlag=1;
								Write256BytesFlag=1;
								Write256BytesFlag=1;
								while(Write_W29C040_Status_Check(Addr,G_TestValue)==0);
								Write256BytesFlag=1;
								Write256BytesFlag=1;
								Write256BytesFlag=1;							
							}
						
							for(i=0;i<128;i++)
							{
								//SP_Write_W29C040_One_Word(Addr,aWriteData[i]);
								SP_SPBA_WriteWord(Addr,aWriteData[i]);
								Addr += 2;
									
							}
							G_TestValue=aWriteData[127];
							Write256BytesFlag=0x0001;
						    Addr_Counter_Tmp=0;
						}
						
						/*
						if(((Addr_Counter&0x0080)==0x0080)||((Addr_Counter&0x00ff)==0))
						{
							for(i=0;i<128;i++)
							{
								SP_Write_W29C040_One_Word(Addr,Ret[i]);
								Addr += 2;			
							}
							Addr_Counter_Tmp=0;
							//for(j=0;j<0x500;j++);//看情况删掉???????????????
							
						}
						*/
					}
				}
				break;
			case Play:
				if(SACM_DVR_Status() & 0x01)
				{
					if(SACM_DVR_TestQueue() != Full)
					{
						//Ret = SP_ReadSRAM(Addr);		// 
					
						//ReadData=SP_Read_W29C040_One_Word(Addr);
						ReadData = SP_SPBA_ReadWord(Addr);
						SACM_DVR_FillQueue(ReadData);		//
						Addr += 2;
					}
				}
				else
				{
					if(SACM_DVR_TestQueue() == Empty)
					{ 
						SACM_DVR_Stop();
						Status = Stop;	
					}	
				}	
				SACM_DVR_Decode();	
				break;
			case Stop:
				break;	
					
		}// end of switch(Status)	
	}// end of while(1)
  return 0;
}

unsigned int  Write_W29C040_Status_Check(unsigned long int Addr_Test,unsigned int TestValue)
{
	unsigned int ReadCheckWord=0;
	Addr_Test-=2;
	SP_InitReadW29C040Flash();
	//ReadCheckWord=SP_Read_W29C040_One_Word(Addr_Test);
	ReadCheckWord = SP_SPBA_ReadWord(Addr_Test);
	if(ReadCheckWord!=TestValue)
	{
		Addr_Test+=2;
		SP_InitWriteW29C040Flash();
		return 0;
	}
	else
	{
		Addr_Test+=2;
		SP_InitWriteW29C040Flash();
		return 1;
	}
}

void SP_InitW29C040Flash(void)
{
	unsigned int i=0;
	for(i=0;i<6;i++)
	{
		SP_SPBA_WriteWord(a_Data_Protection_Dis_addr[i],0x0000,a_Data_Protection_Dis_data[i]);
		
	}
	Delay11ms();
	for(i=0;i<6;i++)
	{
		SP_SPBA_WriteWord(a_Data_Protection_Dis_addr[i],0x0000,a_chip_erase_data[i]);
	}
	
}

⌨️ 快捷键说明

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