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.

ads8329驱动问题

Other Parts Discussed in Thread: ADS8329, MSP430F2617, ADS8332, MSP430F149, TLV5639

ads8329的时序和以前的spi协议时序 有所不同  小弟看不懂 求大家指点  

#ifndef _AD9850_H
#define _AD9850_H

#include "msp430f2617.h"

#define CLK_1  P2OUT |= BIT0
#define CLK_0  P2OUT &= ~BIT0

#define SDI_1  P2OUT |= BIT2
#define SDI_0  P2OUT &= ~BIT2

#define CS_1  P2OUT |= BIT3
#define CS_0  P2OUT &= ~BIT3

//#define INT_1  P2OUT |= BIT4
//#define INT_0  P2OUT &= ~BIT4

#define CONVST_1  P2OUT |= BIT5
#define CONVST_0  P2OUT &= ~BIT5

#define SDO  (P2IN & BIT1)

void InitADS8329()
{
     CLK_0;
     CONVST_1;
     CS_1;
}

void WriteADS8329(unsigned int commd)
{
    unsigned char i;
   
    CS_0;
    for(i = 0; i < 16; i++)
    {
        CLK_1;
        if(commd & 0x8000)
        {
           SDI_1;
        }
        else
        {
           SDI_0;
        }
        CLK_0;
        commd = commd << 1;
    }
    CS_1;
}

unsigned int ReadADS8329()
{
    unsigned char i, commd = 13;
    unsigned int ReadData = 0;
   
    CLK_1;
    for(i = 0; i < 50; i++)
    {
        if(i < 24)
        {
           CLK_0;
           CLK_1;
        }
        else if(i < 40)
        {
           CS_0;
           if(i < 28)
           {
              if(commd & 8)
              {
                 SDI_1;
              }
              else
              {
                 SDI_0;
              }
              commd = commd << 1;
           }
           if(SDO)
           {
              ReadData |= 0x0001;
           }
           ReadData = ReadData << 1;
           CLK_0;
           CLK_1;
        }
        else
        {
           CLK_0;
           CLK_1;
           CS_1;
        }
    }
   
    return ReadData;
}

#endif

上边是读写时序   下边是  主函数 

 

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
 
  Init_CLK();
  InitPort();
  InitADS8329();
  WriteADS8329(0Xe0a7);
  while(1)
  {
     Data1 = ReadADS8329(); 
     Data2 = ReadADS8329(); 
     Data3 = ReadADS8329(); 
     Data4 = ReadADS8329(); 
  }
}

  • 跟ADS8332的时序差不多,你说明一下,你用的是auto trigger还是manual trigger,read while converting还是read while sampling,遇到了什么问题以及现象描述。

  • 我用的是auto trigger    read while sampling  

    这个时序图

     
    寄存器  读写  正确   寄存器配制为 0xe8e3
  • 你好   能否给我一个MSP430F149 操作DAC    TLV5639的C程序   参考电压内置的    

  • 你的 这个 我没有 用过 但是我看了一下 pdf的时序   很好控制的  

  • 问题 解决了  谢谢大家  寄存器 配制错了 导致芯片 休眠了    我用的控制方式是 AUTO TRIGGER / READ While Converting    下边 是最新程序  仅供  后来者参考  不喜勿喷

    #ifndef _AD9850_H
    #define _AD9850_H

    #include "msp430f2617.h"

    #define CLK_1  P2OUT |= BIT0
    #define CLK_0  P2OUT &= ~BIT0

    #define SDI_1  P2OUT |= BIT2
    #define SDI_0  P2OUT &= ~BIT2

    #define CS_1  P2OUT |= BIT3
    #define CS_0  P2OUT &= ~BIT3

    //#define INT_1  P2OUT |= BIT4
    //#define INT_0  P2OUT &= ~BIT4

    #define CONVST_1  P2OUT |= BIT5
    #define CONVST_0  P2OUT &= ~BIT5

    #define SDO  (P2IN & BIT1)
    #define INT  (P2IN & BIT4)

    void InitADS8329()
    {
         CLK_0;
         CONVST_1;
         CS_1;
    }

    void WriteADS8329(unsigned int commd)     //配置寄存器
    {
        unsigned char i;
       
        CS_0;
        for(i = 0; i < 16; i++)
        {
            CLK_1;
            if(commd & 0x8000)
            {
               SDI_1;
            }
            else
            {
               SDI_0;
            }
            CLK_0;
            commd = commd << 1;
        }
        CS_1;
    }

    unsigned int ReadADS8329Reg()  //  读寄存器的值
    {
        unsigned char i;
        unsigned int RegData = 0, commd = 0xd000;
       
        CS_0;
        for(i = 0; i < 20; i++)
        {
          
           CLK_1;
           if(i >= 4)
           {
              RegData = RegData << 1;
              if(SDO)
              {
                  RegData |= 0x0001;
              }
              else
              {
                 RegData &= ~0x0001;
              }
           }
           if(i < 16)
           {
              if(commd & 0x8000)
              {
                  SDI_1;
              }
              else
              {
                  SDI_0;
              }
              commd = commd << 1;
           }
           CLK_0;
        }
        CS_1;
       
        return RegData;
    }


    unsigned int ReadADS8329()      //读AD的数据
    {
        unsigned char i;
        unsigned int ReadData = 0, commd = 0xd8e3;
       
        CLK_1;
        for(i = 0; i < 48; i++)
        {
            if(i < 24)
            {
               CLK_0;
               CLK_1;
            }
            else if(i < 40)
            {
               ReadData = ReadData << 1;
               CS_0;
               if(i < 40)
               {
                  if(commd & 0x8000)
                  {
                     SDI_1;
                  }
                  else
                  {
                     SDI_0;
                  }
                  commd = commd << 1;
               }
               if(SDO)
               {
                  ReadData |= 0x0001;
               }
               else
               {
                  ReadData &= ~0x0001;
               }
               CLK_0;
               CLK_1;
            }
            else
            {
               CLK_0;
               CLK_1;
               CS_1;
            }
        }
       
        return ReadData;
    }

    #include "msp430f2617.h"
    #include "ads8329.h"

    unsigned int Data1, Data2, Data3, Data4;

    void  Init_CLK(void)
    {
      // ------------------  MSP430x1xx使用 ------------------------ //
        unsigned int i;
       
    //    BCSCTL1 = 0X00;  //将寄存器的内容清零//XT2震荡器开启
    //       //LFTX1工作在低频模式//ACLK的分频因子为1
    //    do
    //    {
    // IFG1 &= ~OFIFG; // 清除OSCFault标志
    // for (i = 0x20; i > 0; i--);               
    //    }
    //    while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1  
    // 
    // 
    //     
    //    BCSCTL2 = 0X00;   //将寄存器的内容清零
    //    BCSCTL2 += SELM1;  //MCLK的时钟源为TX2CLK,分频因子为1
    //    BCSCTL2 += SELS;  //SMCLK的时钟源为TX2CLK,分频因子为1

    // ------------------  MSP430x2xx使用 ------------------------ //
        BCSCTL1 &= ~XT2OFF;                       // Activate XT2 high freq xtal
        BCSCTL3 |= XT2S_2;                        // 3 ?16MHz crystal or resonator
        //BCSCTL3 |= LFXT1S_2;                      // set LFXT1 to VLOCLK 无外部低频晶体时必须开启此行
        do
        {
          IFG1 &= ~OFIFG;                         // Clear OSCFault flag
          for (i = 0xFF; i > 0; i--);             // Time for flag to set
        }
        while (IFG1 & OFIFG);                     // OSCFault flag still set?
     
        BCSCTL2 |= SELM_2;                        // MCLK = XT2 HF XTAL (safe)
    }

    void InitPort()
    {
        P2DIR |= BIT0 + BIT2 + BIT3 + BIT5;
        P2DIR &= ~BIT1;
    }

    int main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
     
      Init_CLK();
      InitPort();
      InitADS8329();
      WriteADS8329(0Xe8ed);      // 复位
      WriteADS8329(0Xe8ef);      //寄存器配制
      WriteADS8329(0Xd8ef);      //读配置
      //Data1 = ReadADS8329Reg();  //读取寄存器  用于测试寄存器配置是否正确
      while(1)
      {
         Data1 = ReadADS8329();  //连续读四次   其中第一次的数据 应舍去
         Data2 = ReadADS8329(); 
         Data3 = ReadADS8329(); 
         Data4 = ReadADS8329(); 
      }
    }