📄 ad6650.c
字号:
d[0] = (unsigned char)((pCfg->Coefficient[i]&0x000000FF));
*(unsigned char *)(AD6650_BASE+AD6650_DATA0) = d[0];
}
*(unsigned char *)(AD6650_BASE+AD6650_ACR) = (unsigned char)0x0;
/*clock divider control*/
AD6650WriteReg(AD6650_CDC,(ULONG)(pCfg->RegValue.ClkDiv));
/* PLL Register0 */
AD6650WriteReg(AD6650_PLLR0,(ULONG)(pCfg->RegValue.PLLReg0));
/* PLL Register1 */
AD6650WriteReg(AD6650_PLLR1,(ULONG)(pCfg->RegValue.PLLReg1));
/* PLL Register2 */
AD6650WriteReg(AD6650_PLLR2,(ULONG)(pCfg->RegValue.PLLReg2));
/* PLL Register3 */
AD6650WriteReg(AD6650_PLLR3,(ULONG)(pCfg->RegValue.PLLReg3));
/* CIC2 Input Scale Factor */
AD6650WriteReg(AD6650_Clamp_CTRL,(ULONG)(pCfg->RegValue.ClampCtl));
/* CIC2 Decimation Value */
AD6650WriteReg(AD6650_AUX_DACA,(ULONG)(pCfg->RegValue.Aux_DACA));
/* CIC5 Scale Factor */
AD6650WriteReg(AD6650_AUX_DACB,(ULONG)(pCfg->RegValue.Aux_DACB));
/* CIC5 Decimation Value */
AD6650WriteReg(AD6650_AUX_CTRL,(ULONG)(pCfg->RegValue.Aux_DACCtl));
/* RCF Control Register:Output Scale Factor */
AD6650WriteReg(AD6650_ADC_DITHER_CTRL,(ULONG)(pCfg->RegValue.ADC_DitherCtl));
/* RCF Decimation Value */
AD6650WriteReg(AD6650_DC_CORRECT_BW,(ULONG)(pCfg->RegValue.DC_CorrectionBW));
/* RCF Address Offset Register */
AD6650WriteReg(AD6650_DC_CORRECT_CTRL,(ULONG)(pCfg->RegValue.DC_CorrectionCtl));
/* Clear the Last Register to Zero */
AD6650WriteReg(AD6650_AGC_CTRL0,(ULONG)(pCfg->RegValue.AGC_Ctl0));
/* Number of Taps Minus One */
AD6650WriteReg(AD6650_AGC_CTRL1,(ULONG)(pCfg->RegValue.AGC_Ctl1));
AD6650WriteReg(AD6650_AGC_CTRL2,(ULONG)(pCfg->RegValue.AGC_Ctl2));
AD6650WriteReg(AD6650_AGC_CTRL3,(ULONG)(pCfg->RegValue.AGC_Ctl3));
AD6650WriteReg(AD6650_AGC_CTRL4,(ULONG)(pCfg->RegValue.AGC_Ctl4));
AD6650WriteReg(AD6650_AGC_CTRL5,(ULONG)(pCfg->RegValue.AGC_Ctl5));
AD6650WriteReg(AD6650_AGC_CTRL6,(ULONG)(pCfg->RegValue.AGC_Ctl6));
AD6650WriteReg(AD6650_AGC_CTRL7,(ULONG)(pCfg->RegValue.AGC_Ctl7));
AD6650WriteReg(AD6650_START_CNT,(ULONG)(pCfg->RegValue.Start_HoldOff_Cnt));
AD6650WriteReg(AD6650_CIC4_DEC,(ULONG)(pCfg->RegValue.CIC4_Decimation));
AD6650WriteReg(AD6650_CIC4_SCALE,(ULONG)(pCfg->RegValue.CIC4_Scale));
AD6650WriteReg(AD6650_REV1,(ULONG)(ULONG)(pCfg->RegValue.Reserved0));
AD6650WriteReg(AD6650_RCF_DEC,(ULONG)(pCfg->RegValue.RCF_Decimation));
AD6650WriteReg(AD6650_RCF_DEC_PH,(ULONG)(pCfg->RegValue.RCF_Decimation_Ph));
AD6650WriteReg(AD6650_RCF_CO_OFFSET,(ULONG)(pCfg->RegValue.RCF_Coeff_Offset));
AD6650WriteReg(AD6650_RCF_TAPS,(ULONG)(pCfg->RegValue.RCF_Taps));
AD6650WriteReg(AD6650_RCF_SCALE,(ULONG)(pCfg->RegValue.RCF_Scale));
AD6650WriteReg(AD6650_SER_CTL,(ULONG)(pCfg->RegValue.Serial_ctl));
AD6650WriteReg(AD6650_ACCR,(ULONG)(pCfg->RegValue.ACCR));
/*check the AD6650 configuration parametre */
INI_STATUS_6650 = TRUE;
/* check Coefficient RAM ,Address Increment Auto */
*(unsigned char *)(AD6650_BASE+AD6650_CAR) = (unsigned char)(AD6650_CO_MEM);
*(unsigned char *)(AD6650_BASE+AD6650_ACR) = (unsigned char)0x80;
/*for(i=0x40;i<0x6f;i++)*/
for(i=0x0;i<48;i++)
{
/* *(unsigned char *)(AD6650_BASE+AD6650_CAR) = (unsigned char)i;*/
d[0] = *(unsigned char *)(AD6650_BASE+AD6650_DATA0);
d[1] = *(unsigned char *)(AD6650_BASE+AD6650_DATA1);
d[2] = *(unsigned char *)(AD6650_BASE+AD6650_DATA2);
if((ULONG)(pCfg->Coefficient[i])!= (ULONG)(d[0]|(d[1]<<8)|(d[2]<<16))) i=257;
}
if(i!=48) INI_STATUS_6650 = FALSE;
*(unsigned char *)(AD6650_BASE+AD6650_ACR) = (unsigned char)0x0;
/*clock divider control*/
if(CheckRegVal(AD6650_CDC,(ULONG)(pCfg->RegValue.ClkDiv))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* PLL Register0 */
if(CheckRegVal(AD6650_PLLR0,(ULONG)(pCfg->RegValue.PLLReg0))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* PLL Register1 */
if(CheckRegVal(AD6650_PLLR1,(ULONG)(pCfg->RegValue.PLLReg1))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* PLL Register2 */
if(CheckRegVal(AD6650_PLLR2,(ULONG)(pCfg->RegValue.PLLReg2))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* PLL Register3 */
if(CheckRegVal(AD6650_PLLR3,(ULONG)(pCfg->RegValue.PLLReg3))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* CIC2 Input Scale Factor */
if(CheckRegVal(AD6650_Clamp_CTRL,(ULONG)(pCfg->RegValue.ClampCtl))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* CIC2 Decimation Value */
if(CheckRegVal(AD6650_AUX_DACA,(ULONG)(pCfg->RegValue.Aux_DACA))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* CIC5 Scale Factor */
if(CheckRegVal(AD6650_AUX_DACB,(ULONG)(pCfg->RegValue.Aux_DACB))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* CIC5 Decimation Value */
if(CheckRegVal(AD6650_AUX_CTRL,(ULONG)(pCfg->RegValue.Aux_DACCtl))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* RCF Control Register:Output Scale Factor */
if(CheckRegVal(AD6650_ADC_DITHER_CTRL,(ULONG)(pCfg->RegValue.ADC_DitherCtl))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* RCF Decimation Value */
/* if(CheckRegVal(AD6650_DC_CORRECT_BW,(ULONG)(pCfg->RegValue.DC_CorrectionBW))==REGDATAERR) INI_STATUS_6650 = FALSE; */
/* RCF Address Offset Register */
if(CheckRegVal(AD6650_DC_CORRECT_CTRL,(ULONG)(pCfg->RegValue.DC_CorrectionCtl))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* Clear the Last Register to Zero */
if(CheckRegVal(AD6650_AGC_CTRL0,(ULONG)(pCfg->RegValue.AGC_Ctl0))==REGDATAERR) INI_STATUS_6650 = FALSE;
/* Number of Taps Minus One */
if(CheckRegVal(AD6650_AGC_CTRL1,(ULONG)(pCfg->RegValue.AGC_Ctl1))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL2,(ULONG)(pCfg->RegValue.AGC_Ctl2))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL3,(ULONG)(pCfg->RegValue.AGC_Ctl3))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL4,(ULONG)(pCfg->RegValue.AGC_Ctl4))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL5,(ULONG)(pCfg->RegValue.AGC_Ctl5))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL6,(ULONG)(pCfg->RegValue.AGC_Ctl6))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_AGC_CTRL7,(ULONG)(pCfg->RegValue.AGC_Ctl7))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_START_CNT,(ULONG)(pCfg->RegValue.Start_HoldOff_Cnt))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_CIC4_DEC,(ULONG)(pCfg->RegValue.CIC4_Decimation))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_CIC4_SCALE,(ULONG)(pCfg->RegValue.CIC4_Scale))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_REV1,(ULONG)(ULONG)(pCfg->RegValue.Reserved0))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_RCF_DEC,(ULONG)(pCfg->RegValue.RCF_Decimation))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_RCF_DEC_PH,(ULONG)(pCfg->RegValue.RCF_Decimation_Ph))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_RCF_CO_OFFSET,(ULONG)(pCfg->RegValue.RCF_Coeff_Offset))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_RCF_TAPS,(ULONG)(pCfg->RegValue.RCF_Taps))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_RCF_SCALE,(ULONG)(pCfg->RegValue.RCF_Scale))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_SER_CTL,(ULONG)(pCfg->RegValue.Serial_ctl))==REGDATAERR) INI_STATUS_6650 = FALSE;
if(CheckRegVal(AD6650_ACCR,(ULONG)(pCfg->RegValue.ACCR))==REGDATAERR) INI_STATUS_6650 = FALSE;
*(unsigned char *)(AD6650_BASE+AD6650_SF0) = 0x5;
*(unsigned char *)(AD6650_BASE+AD6650_SF1) = 0x20;
//*(unsigned char *)(AD6650_BASE+AD6650_SF1) = 0x0;*/
*(unsigned char *)(AD6650_BASE+AD6650_SF2) = 0x01;
*(unsigned char *)(AD6650_BASE+AD6650_SF2) = 0x0;
}
int AD6650Cntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
ULONG temp_value;
AD6650CfgStruct *pCfg = (AD6650CfgStruct *)(pDataBuf);
switch(cmd)
{
case SDC6650_INIT_STATUS:
if(INI_STATUS_6650 == TRUE) return SDE_OK;
else return SDE_GENERAL_FAIL;
break;
case SDC_REINIT_6650:
if(maxlen!=0) return SDE_INVALID_ARG;
AD6650Init(pDataBuf,pCfg);
break;
case SDC_GET_REG_6650:
if(maxlen!=sizeof(AD6650RegValue)) return SDE_INVALID_ARG;
*(AD6650RegValue*)(pParam) = (pCfg->RegValue);
break;
case SDC_SET_PLL:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
temp_value=*(ULONG*)pParam&0x3FFFFF;
AD6650WriteReg(AD6650_PLLR0,temp_value);
pCfg->RegValue.PLLReg0 = temp_value;
temp_value=*((ULONG*)pParam+1)&0x3FFFFF;
AD6650WriteReg(AD6650_PLLR1,temp_value);
pCfg->RegValue.PLLReg1 = temp_value;
temp_value=*((ULONG*)pParam+2)&0x3FFFFF;
AD6650WriteReg(AD6650_PLLR2,temp_value);
pCfg->RegValue.PLLReg2 = temp_value;
temp_value=*((ULONG*)pParam+3)&0x3FFFFF;
AD6650WriteReg(AD6650_PLLR3,temp_value);
pCfg->RegValue.PLLReg0 = temp_value;
break;
case SDC_SET_CIC4_SCA:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_CIC4_SCALE,(*(ULONG*)pParam)&0x0F);
pCfg->RegValue.CIC4_Scale = *(unsigned char*)pParam;
break;
case SDC_SET_CLAMP:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_Clamp_CTRL,(*(ULONG*)pParam)&0x03F);
pCfg->RegValue.ClampCtl = *(unsigned char*)pParam;
break;
case SDC_SET_DC_CORRECTION_BW:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_DC_CORRECT_BW,(*(ULONG*)pParam)&0x0F);
pCfg->RegValue.DC_CorrectionBW = *(unsigned char*)pParam;
break;
case SDC_SET_RCF_SCA:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_RCF_SCALE,(*(ULONG*)pParam)&0x03);
pCfg->RegValue.RCF_Scale = *(unsigned char*)pParam;
break;
case SDC_SET_RCF_PHASE:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_RCF_DEC_PH,(*(ULONG*)pParam)&0x07);
pCfg->RegValue.RCF_Decimation_Ph =*(unsigned char*)pParam;
break;
case SDC_SET_SERIAL:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
AD6650WriteReg(AD6650_SER_CTL,(*(ULONG*)pParam)&0x01FF);
pCfg->RegValue.Serial_ctl =*(unsigned char*)pParam;
break;
case SDC_SET_AGC:
if(maxlen!=sizeof(ULONG)) return SDE_INVALID_ARG;
temp_value= (*(ULONG*)pParam)&0x0F;
AD6650WriteReg(AD6650_AGC_CTRL0,temp_value);
pCfg->RegValue.AGC_Ctl0 = temp_value;
temp_value= *((ULONG*)pParam+1)&0x01FF;
AD6650WriteReg(AD6650_AGC_CTRL1,temp_value);
pCfg->RegValue.AGC_Ctl1 = temp_value;
temp_value= *((ULONG*)pParam+2)&0x0FFFF;
AD6650WriteReg(AD6650_AGC_CTRL2,temp_value);
pCfg->RegValue.AGC_Ctl2 = temp_value;
temp_value= *((ULONG*)pParam+3)&0x03FF;
AD6650WriteReg(AD6650_AGC_CTRL3,temp_value);
pCfg->RegValue.AGC_Ctl3 = temp_value;
temp_value= *((ULONG*)pParam+4)&0x01FFF;
AD6650WriteReg(AD6650_AGC_CTRL4,temp_value);
pCfg->RegValue.AGC_Ctl4 = temp_value;
temp_value= *((ULONG*)pParam+5)&0x0FFFF;
AD6650WriteReg(AD6650_AGC_CTRL5,temp_value);
pCfg->RegValue.AGC_Ctl5 = temp_value;
temp_value= *((ULONG*)pParam+6)&0x07F;
AD6650WriteReg(AD6650_AGC_CTRL6,temp_value);
pCfg->RegValue.AGC_Ctl6 = temp_value;
temp_value= (*(ULONG*)pParam)&0x01FF;
AD6650WriteReg(AD6650_AGC_CTRL7,temp_value);
pCfg->RegValue.AGC_Ctl7 = temp_value;
break;
default:
return SDE_UNKNOW_CMD;
}/* end of switch(cmd) */
return SDE_OK;
}
char *AD6650BspInit(int DEV, char *FreeMemPtr, AD6650CfgStruct *cfg)
{
InstallSD(DEV,AD6650Read,NULL,AD6650Cntrl,FreeMemPtr);
AD6650Init(FreeMemPtr, cfg);
FreeMemPtr += sizeof(AD6650CfgStruct);
memcpy(FreeMemPtr,"*AD6650*",8);
FreeMemPtr += 8;
return FreeMemPtr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -