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的时序和以前的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 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();
}
}