ads8329驱动问题
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();
}
}