📄 drv_nim_qpsk.c
字号:
*
*****************************************************************/
static int CalcValue28(int BaudRate, int SampleRate)
{
int Lambda,Mu,i;
double TauA,TauB,dN;
double Lcar;
double Wn;
if(BaudRate >= 5000){
Wn = 0.005 * BaudRate;
}else{
if (( BaudRate < 5000 ) && ( BaudRate > 3000)){
Wn = 25;
}else{
Wn = BaudRate *0.006283; /* 2*acos( -1 )/1000 */
}
}
Lcar = SampleRate* 1000.0 / BaudRate ;
TauA = Wn * Wn / (0.24375 * Lcar * BaudRate * BaudRate ) ; /* Kdcar= 0.24375 Carrier detector gain */
TauB = (0.85 * Wn*2) / ( 0.24375 * Lcar * BaudRate ) ; /* DampingFactor = 0.85 */
dN = TauA;
for ( i = 1; i < 26; i++ ){
dN = dN * 2 ; /* Make dN * 2^i */
if ( dN > 1.0 ){
if ( dN >= 1.5 ){
Mu = 25 -i+1;
}else{
Mu = 25 -i ;
}
break;
}
Mu = 0 ;
}
dN = TauB;
for ( i = 1; i < 17; i++ ) {
dN = dN * 2 ;
if ( dN > 1.0 ){
if ( dN >= 1.5 ){
Lambda = 16 -i+1;
}else{
Lambda = 16 -i ;
}
break;
}
Lambda = 0 ;
}
return ( ((Lambda<<4) & 0xf0 ) + ( Mu & 0xf) ) ;
}
/*****************************************************************
*
* Function Name
* CalcValue42
*
* Prototype
* static int CalcValue42(int BaudRate, int SampleRate,double Ratio)
*
* Inputs
* BaudRate : Baud Rate @KHz
* SampleRate : Sampling Rate @MHz
* Ratio : Ratio
*
* Outputs
* None
*
* Return Codes
* calculation result
*
* Description
* Calculate of register number 42.
*
*****************************************************************/
static int CalcValue42(int BaudRate, int SampleRate,double Ratio)
{
double TauA,TauB,dN;
double Kdtim=0.0388; /* Timing detector gain */
double DampingFactor = 0.85 ;
int Lambda,Mu,i;
double Ltim;
double Wn42;
if(BaudRate < 4000 ){
Wn42 = ( 5.0e-4 ) * BaudRate ;
} else {
Wn42 = ( 1.5e-3 ) * BaudRate ;
}
Ltim = SampleRate * 1000 * Ratio / BaudRate ;
TauA = Wn42 * Wn42/ (Kdtim * Ltim * BaudRate * BaudRate ) ;
TauB = (DampingFactor * Wn42 *2) / (Kdtim * Ltim * BaudRate ) ;
dN = TauA;
for ( i = 1; i < 29; i++ ){
dN = dN * 2 ; /* Make dN * 2^i */
if ( dN > 1.0 ){
if ( dN >= 1.5 ){
Mu = 28 -i+1 ;
}else{
Mu = 28 -i ;
}
break;
}
Mu = 0;
}
dN = TauB;
for ( i = 1; i < 17; i++ ) {
dN = dN * 2 ;
if ( dN > 1.0 ){
if ( dN >= 1.5 ){
Lambda = 16 -i+1 ;
}else{
Lambda = 16 -i ;
}
break;
}
Lambda = 0 ;
}
return (((Lambda<<4) & 0xf0 ) + ( Mu & 0xf ));
}
/*****************************************************************
*
* Function Name
* QpskClkSweepSwitch
*
* Prototype
* static BOOL QpskClkSweepSwitch(UI8 Switch)
*
* Inputs
* Switch : QPSK_SW_OFF(Sweep Off) / QPSK_SW_ON(Sweep On)
*
* Outputs
* None
*
* Return Codes
* TRUE OK
* FALSE ERROR
*
* Description
*
*
*****************************************************************/
static BOOL QpskClkSweepSwitch(UI8 Switch)
{
UI8 GetValue;
if(FALSE==GetRegister(4,53,&GetValue,1)){ /* Group4 APR53 Clock Loop Configuration */
return(FALSE);
}
GetValue &= 0xfe;
if( Switch == QPSK_SW_ON ){
GetValue |= 0x01;
}
DRV_NIM_QPSK_SetRegister(53,GetValue); /* Group4 APR53 */
return(DRV_NIM_OK);
}
/*****************************************************************
*
* Function Name
* QpskCarSweepSwitch
*
* Prototype
* static BOOL QpskCarSweepSwitch(UI8 Switch)
*
* Inputs
* Switch : QPSK_SW_OFF(Sweep Off) / QPSK_SW_ON(Sweep On)
*
* Outputs
* None
*
* Return Codes
* TRUE OK
* FALSE ERROR
*
* Description
*
*
*****************************************************************/
static BOOL QpskCarSweepSwitch(UI8 Switch)
{
UI8 GetValue;
if(FALSE==GetRegister(4,41,&GetValue,1)){ /* Group4 APR41 Carrier Loop Configuration */
return(FALSE);
}
GetValue &= 0xfe;
if( Switch == QPSK_SW_ON ){
GetValue |= 0x01;
}
DRV_NIM_QPSK_SetRegister(41,GetValue); /* Group4 APR41 */
return(DRV_NIM_OK);
}
/*****************************************************************
*
* Function Name
* QpskSetSPIMode
*
* Prototype
* static BOOL QpskSetSPIMode(UI8 Switch)
*
* Inputs
* Switch : SPI Mode Off / SPI Mode On
*
* Outputs
* None
*
* Return Codes
* TRUE OK
* FALSE ERROR
*
* Description
*
*
*****************************************************************/
#if 0 /* Use prohibition */
static BOOL QpskSetSPIMode(UI8 Switch)
{
UI8 GetValue;
UI8 SpiNumber;
UI8 SpiDen;
UI8 VcrNo;
UI8 TempData;
double SpiBias;
I32 i;
/* Get Viterbi Code Rate(Group 3 - APR 14) */
if(FALSE==GetRegister(3,14,&GetValue,1)){
return(FALSE);
}
VcrNo = GetValue & 0x07;
SpiNumber = StVCR[ VcrNo ].SpiNum;
SpiDen = StVCR[ VcrNo ].SpiDen;
/* Set SPI_M(Group 4 - APR 62) */
Regs724[62] &= 0xe1; /* SPI_M Clear */
TempData = SpiDen << 1;
Regs724[62] |= TempData;
/* Set SPI_M(Group 4 - APR 63) */
Regs724[63] &= 0xf0; /* SPI_N clear */
Regs724[63] |= SpiNumber; /* SPI_N Set */
/* Set SPI_Bais(Group 4 - APR 66,67,68) */
/* 2^24 * Spi_numerator * Fsymbol / Fsample * Spi_Denominator */
SpiBias = 16777.216 * SpiNumber * QpskSymbolRate / (QpskFsamp * SpiDen);
Regs724[66] = (UI8)(( (I32)SpiBias + 16777216 ) & 0xff ) ;
Regs724[67] = (UI8)((((I32)SpiBias + 16777216 ) & 0xff00 ) >> 8 ) ;
Regs724[68] = (UI8)((((I32)SpiBias + 16777216 ) & 0x7f0000 ) >> 16 ) ;
/* Write L64724 Regster */
for ( i = 62; i <= 68; i++ ){
if(FALSE==DRV_NIM_QPSK_SetRegister(i, Regs724[i])) /* Group 4 APR62 - APR68 setting */
return(FALSE);
}
if( Switch == QPSK_SW_ON ){
DRV_NIM_QPSK_SetRegister( 31, 0xA0 ); /* Group 4 APR31 setting */
}
if( Switch == QPSK_SW_OFF){
DRV_NIM_QPSK_SetRegister( 31, 0x80 ); /* Group 4 APR31 setting */
}
return(TRUE);
}
#endif
/*****************************************************************
*
* Function Name
* DEBUG PROGRAM : DRV_NIM_GetGroup4
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_GetGroup4(void)
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_RESULT
*
* Description
*
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_GetGroup4(void)
{
#if 0
UI8 i,ii;
UI8 GetBuff[80];
for(i=0;i < 80;i++){
GetBuff[i]=0;
}
if(FALSE==GetRegister(4,0,GetBuff,70)){
return( DRV_NIM_FAIL );
}
for(ii=0,i=0;i<70;ii++,i++){
if(ii==8){
ii=0;
APP_CONSOLE_Printf("\n");
}
APP_CONSOLE_Printf(" [%02d]=%02X",i,GetBuff[i]);
}
APP_CONSOLE_Printf("\n");
APP_CONSOLE_Printf("SYMBOLRATE=%08X\n",QpskSymbolRate);
APP_CONSOLE_Printf("DF Number =%08X\n",QpskDFNumber);
APP_CONSOLE_Printf("DR Ratio =%08X\n",QpskDFRatio);
APP_CONSOLE_Printf("DF Gain =%08X\n",QpskDFGain);
APP_CONSOLE_Printf("CAR SWEEP LIMIT=%08X\n",QpskCarSweepLim);
APP_CONSOLE_Printf("Fsamp =%08X\n",QpskFsamp);
APP_CONSOLE_Printf("IF =%08X\n",DRV_NIM_TUNER_InterFrequency);
#endif
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DEBUG PROGRAM : DRV_NIM_GetGroup3
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_GetGroup3(void)
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_RESULT
*
* Description
*
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_GetGroup3(void)
{
#if 0
UI8 GetBuff[80];
UI8 i,ii;
for(i=0;i < 30;i++){
GetBuff[i]=0;
}
if(FALSE==GetRegister(3,0,GetBuff,24)){
return( DRV_NIM_FAIL );
}
for(ii=0,i=0;i<24;ii++,i++){
if(ii==8){
ii=0;
APP_CONSOLE_Printf("\n");
}
APP_CONSOLE_Printf(" [%02d]=%02X",i,GetBuff[i]);
}
APP_CONSOLE_Printf("\n");
#endif
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DEBUG PROGRAM : DRV_NIM_ClearGroup4
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_ClearGroup4(void)
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_RESULT
*
* Description
*
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_ClearGroup4(void)
{
#if 0
UI8 i;
UI8 SetData[80];
for(i=0;i < 80;i++){
SetData[i]=0;
}
/* send to nim device */
for ( i = 0; i < 70; i++ ){
if(FALSE==DRV_NIM_QPSK_SetRegister(i, SetData[i]))
return( DRV_NIM_FAIL );
}
#endif
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DEBUG PROGRAM : DRV_NIM_Reset
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_Reset(void)
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_RESULT
*
* Description
*
*
*****************************************************************/
DRV_NIM_RESULT DRV_NIM_Reset(void)
{
MMAC_IIC_WRITE_IOPB WriteIOPB;
UI8 Sdata,i;
Sdata=0x06;
WriteIOPB.deviceNumber=MMAC_IIC_1;
WriteIOPB.slaveAddr = 0x00; /* QPSK ADDRESS */
WriteIOPB.subAddr = 0x00; /* Apr Group */
WriteIOPB.data = &Sdata; /* Number */
WriteIOPB.length = 0x01;
WriteIOPB.timeout = 1000;
WriteIOPB.numSubAddressBytes = MMAC_IIC_ZERO_BYTE_ADDRESSING;
if((MMAC_IIC_Write(&WriteIOPB))!=MMAC_IIC_OK){
return( DRV_NIM_FAIL );
}
/* APR0 = 0 */
Sdata=0;
WriteIOPB.deviceNumber=MMAC_IIC_1;
WriteIOPB.slaveAddr = QPSK_CHIP_ADDR; /* QPSK ADDRESS */
WriteIOPB.subAddr = 0x00; /* Apr Group */
WriteIOPB.data = &Sdata; /* Number */
WriteIOPB.length = 0x01;
WriteIOPB.timeout = 1000;
WriteIOPB.numSubAddressBytes = MMAC_IIC_ONE_BYTE_ADDRESSING;
if((MMAC_IIC_Write(&WriteIOPB))!=MMAC_IIC_OK){
return( DRV_NIM_FAIL );
}
/* APR1 = 0 */
Sdata=0;
WriteIOPB.deviceNumber=MMAC_IIC_1;
WriteIOPB.slaveAddr = QPSK_CHIP_ADDR; /* QPSK ADDRESS */
WriteIOPB.subAddr = 0x01; /* Apr Group */
WriteIOPB.data = &Sdata; /* Number */
WriteIOPB.length = 0x01;
WriteIOPB.timeout = 1000;
WriteIOPB.numSubAddressBytes = MMAC_IIC_ONE_BYTE_ADDRESSING;
if((MMAC_IIC_Write(&WriteIOPB))!=MMAC_IIC_OK){
return( DRV_NIM_FAIL );
}
for ( i = 0; i < 70; i++ ){
if(FALSE==DRV_NIM_QPSK_SetRegister(i, Regs724[i])){
continue;
}
}
return( DRV_NIM_OK );
}
/*****************************************************************
*
* Function Name
* DEBUG PROGRAM : DRV_NIM_Reset
*
* Prototype
* DRV_NIM_RESULT DRV_NIM_Reset(void)
*
* Inputs
* None
*
* Outputs
* None
*
* Return Codes
* DRV_NIM_RESULT
*
* Description
*
*
*****************************************************************/
static BOOL QPSK_FEC_Reset(void)
{
UI8 SetData;
SetData = Regs724[55] & 0xFC;
SetData |= 0x03; /* APR55 : DEMOD or FEC Reset */
if(FALSE==DRV_NIM_QPSK_SetRegister(55,SetData)){
return( FALSE );
}
return( TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -