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

📄 bertest.c.bak

📁 c编写的lpc2129控制误码芯片ds2172的代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:



/****************************************************************************
* 文件名:BerTest.C
* 功能:用底层编程实现在读取ds2172的数据并计算误码率,送lcd显示
* 说明:
* 完成日期:2006-02-04
****************************************************************************/
#include  "config.h"
#include  "BerTest.h"
#include  "BerTestWordsLib.h"

/****************************************************************************
*****************************全局变量定义************************************
****************************************************************************/
uint32 BerResult[2]={0,0};	//用于存放误码数和比特数,BerResult[0]:比特数;BerResult[1]:误码数


/****************************************************************************
*****************************函数原型说明************************************
****************************************************************************/
void  Delay(uint32  dly);
void  GUI_SendCom( uint8 COM );
void  GUI_SendDat( uint8 Dat );
void  GUI_LcdInit(void);
void  GUI_WriteWord_1616(uint8 Page,uint8 Col,const uint8 *Word,uint8 Reverse);
void  GUI_WriteWord(uint8 Page,uint8 Col,uint8 Width,uint8 High,const uint8 *Word,uint8 Reverse);
void  GUI_WriteARowWord(uint8 Page,uint8 Col,uint8 Width,uint8 High, const uint8 *Word,uint8 Reverse,uint8 Num);
void  GUI_WriteARowWord_1616(uint8 Page,uint8 Col,const uint8 *Word,uint8 Reverse,uint8 Num);
void  GUI_ClrScreen(void);
void  BER_WriteBer(uint8 Address,uint8 Data);
uint8 BER_ReadBer(uint8 Address);
void  BER_Init(void);
void  BER_PseudorandomCommDdeal(uint8 RandomTempletNum);
void  BER_RepetitiveCommDdeal(uint8 RerepetTempletNum);
void  BER_ResultLoad(void);
uint32 BER_ResultCalculate(uint32 BitSum,uint32 ErrSum);
void  BER_ResultDisplay(uint32 Ber);
void  BER_InsertErr(uint8 ErrRate);
void  BER_IntDeal(void);



/****************************************************************************
* 名称:BER_WriteBer()
* 功能:向ber芯片送数
* 入口参数:uint8 Data,待写入ber芯片的数据,uint8 Address,读数的地址
* 出口参数:无
****************************************************************************/

void  BER_WriteBer(uint8 Address,uint8 Data)
{ 
uint8 TempData,TempAddress;
TempData=~Data;
TempAddress=~Address;

IO1DIR |= BERCS | BERALE;
IO0DIR |= BERDB | BERWR | BERRD;

IO1CLR=BERALE;		//按intel时序写
IO0SET=BERRD|BERWR;
Delay(10);
IO1SET=BERALE;
Delay(10);
IO1CLR=BERCS;

if(Address==0x00)
	{
	IO0CLR = BERDB;
	}
else
	{
	IO0SET = Address << BERNUM;	 	// 从P0.10~P0.17输出      
	IO0CLR = (TempAddress << BERNUM);
	}
Delay(10);
IO1CLR=BERALE;
Delay(10);
IO0CLR=BERWR;
Delay(10);
if(Data==0x00)
	{
	IO0CLR = BERDB;
	}
else
	{
	IO0SET = Data << BERNUM;	 	// 从P0.10~P0.17输出      
	IO0CLR = (TempData << BERNUM);
	}
IO0SET=BERWR;
Delay(10);
IO1SET=BERALE;
IO1SET=BERCS;

}

/****************************************************************************
* 名称:BER_ReadBer()
* 功能:从ber芯片读数
* 入口参数:uint8 Address,ber芯片的读数地址
* 出口参数:uint8 从ber芯片读出的数据
****************************************************************************/
uint8  BER_ReadBer(uint8 Address)
{ 
uint8 TempAddress,TempDb;

TempAddress=~Address;

IO1DIR |= BERCS | BERALE;
IO0DIR |= BERDB | BERWR | BERRD;

IO1CLR=BERALE;		//按intel时序读
IO0SET=BERRD|BERWR;
Delay(10);
IO1SET=BERALE;
Delay(10);
IO1CLR=BERCS;
Delay(10);
if(Address==0x00)
	{
	IO0CLR =BERDB;
	}
else
	{
	IO0SET =(Address << BERNUM);	 	// 从P0.10~P0.17输出     
	IO0CLR =(TempAddress << BERNUM);
	}
Delay(10);
IO1CLR=BERALE;
Delay(10);
IO0DIR &=(~BERDB);
Delay(10);
IO0CLR=BERRD;
Delay(10);
TempDb=(IO0PIN>>10);
IO0SET=BERRD;
Delay(10);
IO1SET=BERALE|BERCS;
return TempDb;
}


/****************************************************************************
* 名称:BER_Init()
* 功能:初始化ber芯片
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  BER_Init(void)
{

IO1DIR |=BERRL|BERLC;
IO1CLR=BERRL;

BER_WriteBer(TR,0X00);
//BER_WriteBer(IMR,0X00);	//disable interrupt
BER_WriteBer(IMR,0X7e);		//enable interrupt
BER_WriteBer(PCR,0X00);
BER_WriteBer(EIR,0x00);

IO1DIR |=BERTL;
IO1CLR=BERTL;
Delay(100);
IO1SET=BERTL;	
Delay(10);
}


/****************************************************************************
* 名称:BER_IntDeal()
* 功能:ber中断处理
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  BER_IntDeal(void)
{
uint8 TempIntStatue,AlarmLoc;

AlarmLoc=0;
TempIntStatue=BER_ReadBer(SR);
while(TempIntStatue)
	{
	TempIntStatue=TempIntStatue<<1;		//由于IMR寄存器的最高位不用,且值为0,所以不作判断。
	AlarmLoc++;
	if(TempIntStatue&0x80)
		{
		switch(AlarmLoc)
			{
			case 1:GUI_WriteARowWord(0,0, 16,16,WordsLib_AlarmInf[0][0],1,5);break;
			case 2:GUI_WriteARowWord(2,0, 16,16,WordsLib_AlarmInf[1][0],1,5);break;			
			case 3:GUI_WriteARowWord(4,0, 16,16,WordsLib_AlarmInf[2][0],1,5);break;			
			case 4:GUI_WriteARowWord(6,0, 16,16,WordsLib_AlarmInf[3][0],1,5);break;
			case 5:GUI_WriteARowWord(0,80, 16,16,WordsLib_AlarmInf[4][0],1,5);break;			
			case 6:GUI_WriteARowWord(2,80, 16,16,WordsLib_AlarmInf[5][0],1,5);break;			
			//case 7:GUI_WriteARowWord(4,80, 16,16,WordsLib_AlarmInf[6][0],1,5);break;
			default:break;									
			}
		}
	}
}




/****************************************************************************
* 名称:BER_PseudorandomCommDdeal()
* 功能:伪随机模板命令处理。使bert发送要求长度的伪随机序列,
*	查表(PPG_TABLE[])决定各相关寄存器的置数。
* 入口参数:RandomTempletNum 伪随机模板号,对应PPG_TABLE[]结构中的第一个成员
* 出口参数:无
****************************************************************************/

void BER_PseudorandomCommDdeal(uint8 RandomTempletNum)
	{
  	uint8 Temp,i;
  	 	  	  	
 	Temp=BER_ReadBer(PCR);
 	Temp|=0x20;			//PCR.5=1,选择伪随机模板
  	BER_WriteBer(PCR,Temp);
  	 	  		
  	BER_WriteBer(PSR3,0xff);		//使用伪随机模板时,PSR3~PSR0均应置成0XFF
  	BER_WriteBer(PSR2,0xff);  	
  	BER_WriteBer(PSR1,0xff);  	
  	BER_WriteBer(PSR0,0xff); 
  	 	
  	    
  	for(i=0;i<PPG_TYPE_No;i++)
  		{  
  		if (PPG_TABLE[i].PP_LENGTH==RandomTempletNum)
  			{
  			BER_WriteBer(PTR,PPG_TABLE[i].PTR_V);
  			BER_WriteBer(PLR,PPG_TABLE[i].PLR_V);	

  			if(PPG_TABLE[i].TINV_V==0x00)
  				{
  				Temp=BER_ReadBer(EIR);		//清零EIR.TINV
 				Temp&=0xdf;
 				BER_WriteBer(EIR,Temp);		 	
  				}
  			else if(PPG_TABLE[i].TINV_V==0x01)
  		  		{ 		  			
   				Temp=BER_ReadBer(EIR);		//置位EIR.TINV
 				Temp|=0x20;
 				BER_WriteBer(EIR,Temp); 		  				 		  		
  				}
  			if(PPG_TABLE[i].RINV_V==0x00)
  				{
   				Temp=BER_ReadBer(EIR);		//清零EIR.RINV 
 				Temp&=0xef;
 				BER_WriteBer(EIR,Temp);  						 	 				
  				}		
  			else if(PPG_TABLE[i].RINV_V==0x01)  		
  				{
    			Temp=BER_ReadBer(EIR);		 //置位EIR.RINV
 				Temp|=0x10;
 				BER_WriteBer(EIR,Temp); 						 		    				
  				}
			IO1DIR |=BERTL;
			IO1CLR=BERTL;
			Delay(1);
			IO1SET=BERTL;				//在TL上造一个上升沿,
										//将模板设置寄存器的内容装入模板产生器		  		 		  		  			
			}
  		else
  	   		;
  		}
	}

/****************************************************************************
* 名称:BER_RepetitiveCommDdeal()
* 功能:重复模板命令处理。使btrt发送要求的重复序列,
*	查表(RPG_TABLE[])决定各相关寄存器的置数。
* 入口参数:RerepetTempletNum 重复模板号,对应RPG_TABLE[]结构中的第一个成员
* 出口参数:无
****************************************************************************/

void BER_RepetitiveCommDdeal(uint8 RerepetTempletNum)
	{  
  	uint8 Temp,i;
  	
 	Temp=BER_ReadBer(PCR);
 	Temp&=0xdf;			//PCR.5=0,选择重复模板
  	BER_WriteBer(PCR,Temp);  	
  	        
   	for(i=0;i<RPG_TYPE_No;i++)
  		{  
  		if (RPG_TABLE[i].RP_TYPE==RerepetTempletNum)
  			{
  			BER_WriteBer(PTR,RPG_TABLE[i].PTR_V);
  			BER_WriteBer(PLR,RPG_TABLE[i].PLR_V);  			
  			BER_WriteBer(PSR3,RPG_TABLE[i].PSR3_V);   				
  			BER_WriteBer(PSR2,RPG_TABLE[i].PSR2_V);
  			BER_WriteBer(PSR1,RPG_TABLE[i].PSR1_V);   				
  			BER_WriteBer(PSR0,RPG_TABLE[i].PSR0_V);  	//使用重复模板时,TINV,RINV的值均为0;  
   			
   			Temp=BER_ReadBer(EIR);			//清零EIR.TINV
 			Temp&=0xdf;
 			BER_WriteBer(EIR,Temp);
 			
    		Temp=BER_ReadBer(EIR);			//清零EIR.RINV
 			Temp&=0xef;
 			BER_WriteBer(EIR,Temp);
 			
			IO1DIR |=BERTL;
			IO1CLR=BERTL;
			Delay(1);
			IO1SET=BERTL;				//在TL上造一个上升沿,
										//将模板设置寄存器的内容装入模板产生器				  				  		 		  		
  			}
  		else
  	   		;
  		}
	} 
	
/****************************************************************************
* 名称:BER_nsertErr()
* 入口参数:uint8 ErrRate;  插入的误码率
* 出口参数:无
****************************************************************************/

void BER_InsertErr(uint8 ErrRate)
{ 	
uint8 Temp;	
if((ErrRate>=2)&&(ErrRate<=7))	//测试发现大于-2的误码率插不进去。
	{
	Temp=BER_ReadBer(EIR);			
	Temp |=(0x07&ErrRate);		//根据要求置数EIR.2~EIR.0,从而在发码中加入错码
	BER_WriteBer(EIR,Temp);
	}
else 
	GUI_WriteARowWord(0,50, 16,16,WordsLib_ParameterErr[0],1,5);	   	  	
}
   	
/****************************************************************************
* 名称:BER_ResultLoad()
* 功能:装载控制,用于将BCR和BECR寄存器的值读出
* 入口参数:RerepetTempletNum 重复模板号,对应RPG_TABLE[]结构中的第一个成员
* 出口参数:无 
****************************************************************************/
void BER_ResultLoad(void)
{
uint8 BerResultTemp[4]={0,0,0,0},BenResultTemp[4]={0,0,0,0};	

IO1DIR |=BERLC;		//将DS2172内部计数器的当前值放入BCR和BECR
IO1CLR=BERLC;
Delay(10);
IO1SET=BERLC;
Delay(100);
IO1CLR=BERLC;

BerResultTemp[0]=BER_ReadBer(BCR0);		//统计总比特数
BerResultTemp[1]=BER_ReadBer(BCR1);
BerResultTemp[2]=BER_ReadBer(BCR2);
BerResultTemp[3]=BER_ReadBer(BCR3);
Delay(100);
BenResultTemp[0]=BER_ReadBer(BECR0); 	//统计错比特数
BenResultTemp[1]=BER_ReadBer(BECR1);
BenResultTemp[2]=BER_ReadBer(BECR2); 
BenResultTemp[3]=BER_ReadBer(BECR3);

BerResult[BitNum] =	((uint32)BerResultTemp[0] 			|	((uint32)(BerResultTemp[1])<<8) | 
					((uint32)(BerResultTemp[2])<<16) 	| 	((uint32)(BerResultTemp[3])<<24));
BerResult[ErrNum] =	((uint32)BenResultTemp[0] 			|	((uint32)(BenResultTemp[1])<<8) | 
					((uint32)(BenResultTemp[2])<<16) 	| 	((uint32)(BenResultTemp[3])<<24));

}

⌨️ 快捷键说明

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