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

📄 ad6650.c

📁 这是单板上DPRAM的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -