📄 bertest.c.bak
字号:
/****************************************************************************
* 文件名: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 + -