微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ads8329驱动问题

ads8329驱动问题

时间:10-02 整理:3721RD 点击:

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(); 
  }
}

 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top