This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

基于MSP430F2619驱动AD7711A的问题

第一次使用430单片机,使用SPI方式进行驱动的AD7711A芯片

初始化配置AD7711A以后,读取AD7711A的控制寄存器,写进去的配置参数与读取回来的数据一致,说明初始化的操作是成功的,但是430读取AD7711A的ADC数据时,数据总是0

  • AD7711A的引脚的信号均满足时序要求,就是不出来数据,郁闷,两个星期了,卡在这里停止不前,求求走过路过的大侠,指点迷津,谢谢

  • 走过路过的大侠,请指点迷津,现在搞不清楚是AD7711A的问题还是430程序有BUG,,查看AD7711A的信号,时序符合要求就是不出来数据,是不是读操作有问题,困在这里两个星期了

  • 这种情况建议用逻辑分析仪或者示波器观察一下时序。

    如果时序没问题就是程序问题了。

    方便的话建议上传一下相关代码

    • 您的ADC的前端模拟电路是怎么连接的?ADC输入的模拟信号是什么?

  • AD7711A的参考电压为2.5V,模拟通道AIN1(7脚+,8脚-)直接用电源输入0~2.5V,430读取ADC数据一致不变,为0

  • 用示波器看的时序,没问题。对AD7711A初始化配置控制寄存器,以后再读取初始化的参数,也正确。读取ADC7711A的数据确一直是0。

    第一次论坛上求教,昨晚在家也是抱着试试看的心态看看能不能在网上求助一下,困扰了两个星期了,感谢走过路过的大侠们指点迷津,今天去单位把代码上传上来,

  • 现在已经将相关代码和时序图上传,请走过路过的各位大侠,指点迷津

    /********************主函数**********************/

    void main(void)

    {

      WDTCTL = WDTPW + WDTHOLD;                 // 关狗 

      CLK_INIT();

      UART_INIT();

      //TimerA_INIT();

      SPI_INIT();

      Delays(50);

      AD7711_WR();   

      Delays(100); 

       //AD_temp=26342; 

      while(1)

      {

        //AD7711_RD_INIT();

        AD7711_RD_AD();

        _NOP();

        _NOP();

      }

    }

    /********************************************

    函数名称:SPI_INIT

    功    能:SPI初始化

    参    数:无

    返回值  :无

    ********************************************/

    void SPI_INIT()

    {

      P3OUT &= ~(BIT0+BIT4+BIT5);

      P3SEL |= 0x31;                            //P3.0,4,5 = USCI_A0 SCLK SIMO/SOMI

      UCA0CTL1 = UCSWRST;                       //UCSWRST SET 1

      UCA0CTL0 |= UCMST+UCSYNC+UCMSB;   

      //UCA0CTL0 |= UCCKPH+UCMSB;                 //UCCKPL

      UCA0CTL1 |= UCSSEL_1;                     //CLK = ACLK

      UCA0BR0 = 0x14;                           //10MHz/20  Fsclk<=clk/5

      UCA0BR1 = 0x00;                           //

      UCA0MCTL = 0;                             // No modulation

      UCA0CTL1 &= ~UCSWRST;                     //Initialize USCI state machine**

    }

     

     

     

     

     

    /*******************************************

    函数名称:AD7711_WR

    功    能:AD7711初始化

    参    数:无

    返回值  :无

    ********************************************/

    void AD7711_WR()

    {

        P1DIR |= BIT5;

        P1OUT |= BIT5;                 //RFS,置1

        P1DIR |= BIT6;                

        P1OUT |= BIT6;                 //TFS,置1

        P1DIR |= BIT3;               

        P1OUT |= BIT3;                 //A0,置1

        P1DIR |= BIT0;                 //

        P1OUT |= BIT0;                 //P1.0 1为发送数据,

        P1OUT &= ~(BIT3);              //A0,置0

        P1OUT &= ~(BIT6);              //TFS,置0

        uint i;

        for (i=0;i<3;i++)

        {              

          while (!(IFG2 & UCA0TXIFG))

          {}

          UCA0TXBUF = AD7711A_INIT[i]; //P3.4 TX DATA

          while (UCA0STAT & UCBUSY)

          {}

        }

        Delays(1);

        P1OUT |= BIT6;                 //TFS,置1

        P1OUT |= BIT3;                 //A0,置1 

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

    /*******************************************

    函数名称:AD7711_RD_INIT

    功    能:回读AD7711A初始化数据

    参    数:无

    返回值  :无

    ********************************************/

    void AD7711_RD_INIT()

    {

        P1DIR |= BIT5;                

        P1OUT |= BIT5;                 //RFS,置1

        P1DIR |= BIT6;                

        P1OUT |= BIT6;                 //TFS,置1

        P1DIR |= BIT3;

        P1OUT |= BIT3;                 //A0,置1

        P1DIR |= BIT0;                

        P1OUT &= ~(BIT0);              //P1.0,0为接收                                       

        //while (P1IN & BIT7);           //读取DRDY,判断信号是否为0          

        P1OUT &= ~(BIT3);              //A0,置0

        P1OUT &= ~(BIT5);              //RFS,置0 

        uint i;

        for (i=0;i<3;i++)

        {

          while (!(IFG2 & UCA0TXIFG))

          {}

          UCA0TXBUF =0x00;            //P3.4TX DATA

          while (UCA0STAT & UCBUSY)

          {}

          AD7711A_REC[i]= UCA0RXBUF;  //P3.5 RX DATA

        }

         Delays(1);

        P1OUT |= BIT5;                //RFS,置1

        P1OUT |= BIT3;                //A0,置1

    }

     

     

     

     

     

     

     

     

     

     

     

    /*******************************************

    函数名称:AD7711_RD_AD

    功    能:读取AD7711A的ADC数据

    参    数:无

    返回值  :无

    ********************************************/

    void AD7711_RD_AD()

    {

        P1DIR |= BIT5;                //RFS,置1

        P1OUT |= BIT5;                

        P1DIR |= BIT6;                //TFS,置1

        P1OUT |= BIT6;                

        P1DIR |= BIT0;                 //读AD7711 P1.0 0为接收

        P1OUT &= ~(BIT0);             

        P1DIR |= BIT3;                  //A0,置1

        P1OUT |= BIT3;                

        while (P1IN & BIT7)            //读取DRDY,判断信号是=”0"?

        {}

        P1OUT |= BIT3;                 //A0,置1

        P1OUT &= ~(BIT5);              //RFS,置0 

        uint i;

        for (i=0;i<2;i++)

        {               

          while (!(IFG2 & UCA0TXIFG))

          {}

          UCA0TXBUF =0x00;            //P3.4TX DATA

          while (UCA0STAT & UCBUSY)

          {}

          AD7711A_DATA[i] = UCA0RXBUF; //P3.5 RX DATA

        }

        Delays(1);

        P1OUT |= BIT5;                //RFS,置1

    P1OUT |= BIT3;                //A0,置1

    }

     

     

     

     

     

     

     

     

     

     

    图1,AD7711A的DRDY信号与RFS信号

    图2,AD7711A的RFS信号与SCLK信号

     

     

    图3,AD7711A的SCLK信号与SDATA信号

     

     

    备注:AD7711A的数据线为双向的,只有一个引脚,MSP430F2619的数据线有MOSI何MISO,通过P1.0作为读写数据切换。

  • 走过路过的大侠,能不能帮忙看看程序,指点迷津,谢谢