ad9361自测试校准

#include "config.h"
#include "CONFIG_FPGA_ALL.h"
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"

#include "ad9361_api.h"
#include "ad9361.h"
#include "xil_printf.h"
double param[10];
extern struct ad9361_rf_phy *ad9361_phy;
#define CONFIG_FPGA_ALL_BASEADDR XPAR_CONFIG_FPGA_ALL_0_S00_AXI_BASEADDR
#define cfg_universal_port_addr   0x5c
#define cfg_universal_port_data   0x60


extern void cfg_universal(uint32_t addr,uint32_t data);


void cfg_universal(uint32_t addr,uint32_t data)
{
    CONFIG_FPGA_ALL_mWriteReg((CONFIG_FPGA_ALL_BASEADDR) ,cfg_universal_port_addr,addr);
    CONFIG_FPGA_ALL_mWriteReg((CONFIG_FPGA_ALL_BASEADDR) ,cfg_universal_port_data,data);
    usleep(1);
}
void set_register(double* param, char param_no) // "register?" command
{
    uint16_t reg_addr;
    uint8_t reg_val;
    struct spi_device spi;

    if(param_no >= 1)
    {
        spi.id_no = 0;
        reg_addr =(uint16_t) param[0];
        reg_val =(uint8_t)param[1];
        ad9361_spi_write(&spi, reg_addr,reg_val);
//        xil_printf("write register[0x%x]=0x%x\r\n", reg_addr, reg_val);
    }
}

void get_register(double* param, char param_no) // "register?" command
{
    uint16_t reg_addr;
    uint8_t reg_val;
    struct spi_device spi;

    if(param_no >= 1)
    {
        spi.id_no = 0;
        reg_addr = param[0];
        reg_val = ad9361_spi_read(&spi, reg_addr);
//        if((reg_val != 0x02) && (reg_val != 0x82) && (reg_val != 0x42))
//        {
//            xil_printf("/************************************\r\n");
//            xil_printf("register[0x%x]=0x%x\r\n", reg_addr, reg_val);
//            xil_printf("/************************************\r\n");
//        }
        xil_printf("register[0x%x]=0x%x\r\n", reg_addr, reg_val);
    }
}


/**************************************************************************//***
 * @brief Gets current RX LO frequency [MHz].
 *
 * @return None.
*******************************************************************************/
void get_rx_lo_freq(double* param, char param_no) // "rx_lo_freq?" command
{
    uint64_t lo_freq_hz;

    ad9361_get_rx_lo_freq(ad9361_phy, &lo_freq_hz);
    lo_freq_hz /= 1000000;
    xil_printf("rx_lo_freq=%d\n", (uint32_t)lo_freq_hz);
}

/**************************************************************************//***
 * @brief Sets the RX LO frequency [MHz].
 *
 * @return None.
*******************************************************************************/
void set_rx_lo_freq(double* param, char param_no) // "rx_lo_freq=" command
{
    uint64_t lo_freq_hz;

    if(param_no >= 1)
    {
        lo_freq_hz = param[0];
        lo_freq_hz *= 1000000;
        ad9361_set_rx_lo_freq(ad9361_phy, lo_freq_hz);
        lo_freq_hz /= 1000000;
        xil_printf("rx_lo_freq=%d\n", (uint32_t)lo_freq_hz);
    }
}
/**************************************************************************//***
 * @brief Gets current TX LO frequency [MHz].
 *
 * @return None.
*******************************************************************************/
void get_tx_lo_freq(double* param, char param_no) // "tx_lo_freq?" command
{
    uint64_t lo_freq_hz;

    ad9361_get_tx_lo_freq(ad9361_phy, &lo_freq_hz);
    lo_freq_hz /= 1000000;
    xil_printf("tx_lo_freq=%d\n", (uint32_t)lo_freq_hz);
}

/**************************************************************************//***
 * @brief Sets the TX LO frequency [MHz].
 *
 * @return None.
*******************************************************************************/
void set_tx_lo_freq(double* param, char param_no) // "tx_lo_freq=" command
{
    uint64_t lo_freq_hz;

    if(param_no >= 1)
    {
        lo_freq_hz = param[0];
        lo_freq_hz *= 1000000;
        ad9361_set_tx_lo_freq(ad9361_phy, lo_freq_hz);
        lo_freq_hz /= 1000000;
        xil_printf("tx_lo_freq=%d\n", (uint32_t)lo_freq_hz);
    }
}


void init_ad9361_rf(void)
{
    int status=0;
//    status=ad9361_set_no_ch_mode(ad9361_phy,3);
//    xil_printf("ad9361_set_no_ch_mode=%d\r\n",status);
    ad9361_set_rx_rf_port_input(ad9361_phy,A_BALANCED);
    status=ad9361_en_dis_tx(ad9361_phy,3,3);
    xil_printf("set_tx chan status=%d\r\n",status);
    status=ad9361_en_dis_rx(ad9361_phy,3,3);
    xil_printf("set_rx chan status=%d\r\n",status);
    uint32_t freq_rx_rf_bw;
    ad9361_set_rx_rf_bandwidth(ad9361_phy,56000000);
    ad9361_get_rx_rf_bandwidth(ad9361_phy,&freq_rx_rf_bw);
    printf("***********rx_rf_bw=%ld hz\n",freq_rx_rf_bw);
    ad9361_set_tx_rf_bandwidth(ad9361_phy,56000000);
    ad9361_get_tx_rf_bandwidth(ad9361_phy,&freq_rx_rf_bw);
    printf("***********tx_rf_bw=%ld hz\n",freq_rx_rf_bw);
    //122880000  61440000
    status=ad9361_set_trx_clock_chain_freq(ad9361_phy,61.44*1000000);
    xil_printf("ad9361_set_trx_clock_chain_freq status=%d\r\n",status);

    param[0]=1000;  //set tx lo
    set_tx_lo_freq(param, 2);
    get_tx_lo_freq(param,2);

    param[0]=1000;  //set rx lo
    set_rx_lo_freq(param, 2);
    get_rx_lo_freq(param,2);

    param[0]=0x006;
    param[1]=0x05;
    set_register(param, 3);
    get_register(param,2);

    param[0]=0x007;
    param[1]=0x70;
    set_register(param, 3);
    get_register(param,2);



    ad9361_set_rx_gain_control_mode(ad9361_phy,0,RF_GAIN_MGC);
    ad9361_set_rx_gain_control_mode(ad9361_phy,1,RF_GAIN_MGC);
    ad9361_set_rx_rf_gain(ad9361_phy,0,20);
    ad9361_set_rx_rf_gain(ad9361_phy,1,20);
}

void cal_delay_ad9361_data(float freq)
{

    init_ad9361_rf();
    int status;
    //122880000  61440000
    status=ad9361_set_trx_clock_chain_freq(ad9361_phy,freq*1000000);
    xil_printf("ad9361_set_trx_clock_chain_freq status=%ds\r\n",status);
    xil_printf("cal freq = %llu\n", freq*1000000);

    #define sig_num 50

    int i=0,j=0,k=0;
    int cnt_num=20;
    int first_data_num_temp=100;
    int flag=0;
    uint32_t send_data[sig_num];
    uint32_t recv_data[sig_num];
    uint32_t recv_data_t[sig_num];
    for(i=0;i<sig_num;i=i+1)
    {
        send_data[i]=((rand()) & 0xFFFFFF);
    }
    uint8_t delay_tab[31]={0x60,0x70,0x50,0x80,0x40,0x90,0x30,0xA0,0x20,0xB0,0x10,0xC0,0x0D,0xE0,0x00,0xD0,0xF0,
                           0x06,0x07,0x05,0x08,0x04,0x09,0x03,0x0A,0x02,0x0B,0x01,0x0C,0x0E,0x0F};
    cfg_universal(18,3);
    cfg_universal(17,sig_num);
    cfg_universal(18,1);
    for (i=0;i<sig_num;i++)
    {
        cfg_universal(15,i);
        cfg_universal(16,send_data[i]);
        usleep(1);
//        xil_printf("%d = %x \r\n",i,send_data[i]);
    }
    cfg_universal(18,2);

    param[0]=0x3f4;
//    param[1]=0x0B;
    param[1]=0x00;
    set_register(param, 3);
    get_register(param,2);

    param[0]=0x3f5;
//    param[1]=0x00;
    param[1]=0xC1;
    set_register(param, 3);
    get_register(param,2);

    param[0]=0x3f6;
    param[1]=0x00;
    set_register(param, 3);
    get_register(param,2);
//while(1);
    cfg_universal(19,1);
//while(1);
#define ADC_DELAY_REG_SWEEP
#ifdef ADC_DELAY_REG_SWEEP
    printf("\r\nhex:");
    uint8_t exti;
    for(exti = 0; exti < 31; exti++)
    {
        printf("%2x ", delay_tab[exti]);
    }
    printf("\r\n");
#endif

    for ( j = 0; j < 31; j++)
    {
    #ifdef ADC_DELAY_REG_SWEEP
    printf("%2x: ", delay_tab[j]);
    #endif
        for (i = 0; i < 31; i++)
        {
//            for(k =0 ;k<=4;k++)
//            {

                first_data_num_temp=100;

                param[0]=0x006;
                param[1]=delay_tab[i];
                set_register(param, 3);
//                get_register(param,2);

                param[0]=0x007;
                param[1]=delay_tab[j];
                set_register(param, 3);
//                get_register(param,2);

//                param[0]=0x011;
//                param[1]=k;
//                set_register(param, 3);
//                get_register(param,2);

                cfg_universal(21,1);
                cnt_num=20;
                while(cnt_num--)
                {
                    status=CONFIG_FPGA_ALL_mReadReg(CONFIG_FPGA_ALL_BASEADDR,0x0A*4);
    //                xil_printf("\r\nmdlt state = %d\r\n",status);
                        if(status==4)
                        {
                            break;
                        }
                }
                for(cnt_num=0;cnt_num<sig_num;cnt_num++)
                {
                    cfg_universal(20,cnt_num);
                    recv_data[cnt_num]=CONFIG_FPGA_ALL_mReadReg(CONFIG_FPGA_ALL_BASEADDR,9*4);
    //                xil_printf("\r\nmdlt state = %x\r\n",recv_data[cnt_num]);
                    if(recv_data[cnt_num] == send_data[0] )
                    {
                        first_data_num_temp=cnt_num;
    //                    xil_printf("&&&&&&&&%d\r\n",first_data_num_temp);
                    }
                }
                int temp=0;
                for(cnt_num=0;cnt_num<sig_num;cnt_num++)
                {
                    if(first_data_num_temp==100)
                    {
    //                    cnt_num=sig_num;
                        flag = -1;
                        break;

                    }
                    else
                    {
                        recv_data_t[cnt_num]=recv_data[first_data_num_temp+temp];
                        temp=temp+1;
                        if((first_data_num_temp+temp)>=sig_num)
                        {
                            first_data_num_temp=0;
                            temp=0;
                        }
                        flag = 0;
                    }
                }
                for(cnt_num=0;cnt_num<sig_num;cnt_num++)
                {
                    if(flag<0)
                    {
    //                    cnt_num=sig_num;
                        flag = -1;
                        break;

                    }
                    else
                    {
                        if(recv_data_t[cnt_num] == send_data[cnt_num])
                        {
                            flag = 1;
                        }
                        else
                        {
                            flag = -1;
                            break;
                        }
                    }
                }
//                if(flag == 1)
//                {
//                    xil_printf("Calibration delay data  successful \r\n");
//                    goto my_goto;
//                    break;
//                }
                 if(flag == 1)
                 {
                     printf(" O ");
                 }
                 else
                 {
                     printf(" # ");
                 }

                cfg_universal(21,3);
//            }
        }
        printf("\n");
    }
    if((i==31) && (j==31))
    {
        cfg_universal(19,0);
        xil_printf("Calibration delay data failed \r\n");
    }
    my_goto:
    cfg_universal(19,0);
    param[0]=0x3f5;
    param[1]=0x00;
    set_register(param, 3);
//    get_register(param,2);
}

 

posted @ 2018-10-26 10:23  木心的木偶  阅读(1771)  评论(0编辑  收藏  举报