ADS8364y采样程序
单片机控制ADS8364,程序怎么写,才能读取转换结果
请大神给出一个430单片机控制8364采样和结果读取的程序。
6通道的更好。
搞了好几天没有处结果,急求!
通信方面可以参考数据手册第6页的时序图,如果无法通信,请用示波器观察你的时序并与数据手册中的进行对比分析。
程序就可遇难求了!
如果可以的话,可以将你的原理图以及你的时序发上来,我们一起分析看看!
-
P1.3脚和p1.4脚通过割线,交换
用手碰触单片机、AD8364 以及中间的8根数据线,EOC数据转换正常。松开,数据转换结束。
程序:
#include <msp430x26x.h>
#include "math.h"#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long intuint data1=0;
uint data2=0;
uint count=0;
long float total=0;
ulint output= 0;uchar chuan1[]={0XCC,0X33,0XC3,0X3C};
uchar chuan2[]={0XAA,0XC0,0X00,0X00,0X63,0X05,0X00,0X0A,0X00,0X0A,0XF8,0X00,0X00,0X1F};
uchar chuan3[]={0XCC,0X33,0XC3,0X3C,0XAA,0XC1,0X08,0X00,0X00,0X01,0XCC,0X33,0XC3,0X3C};//串口0发送函数
void UART0_send_data(uchar data0)
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = data0;
}//时钟初始化
void sys_clock_init (void)
{
int i;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= SELM_2 + SELS + divS_3;
BCSCTL3 |= XT2S_2;
while((IFG1&OFIFG))
{
IFG1 &= ~OFIFG;
for(i=0;i<0xff;i++);
}
P5DIR = 0X70;
P5SEL = 0X70;
P1SEL = 0X10; //p1.4(smclk),提供给AD8364的时钟,1MHZ,设置为外围模式,smclk
P1DIR = 0X10;
}//串口初始化
void sys_UART0_init(void)
{
UCA0CTL1 |= UCSSEL_2;
UCA0BR0=8;
UCA0BR1=0;
UCA0MCTL |= UCBRS2 + UCBRS1;
UCA0CTL1 &= ~UCSWRST;
UCA0MCTL &= ~UCOS16;
P3DIR |= 0X10;
P3SEL |= 0X10;
// __bis_SR_register(GIE);
_BIS_SR(GIE);
}//采样IO口初始化
void sys_IO_init()
{
P1IE |= 0X08; //p1.3中断允许开启 EOC信号输入口
P1IES |= 0X08; //p1.3下降沿触发中断
P1IFG &= ~0X08; //清除中断标志P1OUT &= ~0X20;
P1OUT |= 0X20; //ADC_RST,先8364复位,再置位
P1DIR |= 0X75; //p1的0、2 456位方向设置为输出
// P1OUT &= ~0X01; //清零,cs片选信号
// P1OUT |= 0X04; //置1,8364读取rd信号停止
P1OUT |= 0X45; //HOLDA B C=1
P2DIR |= 0X87; //p2的012和7位设置为输出
P2OUT &= ~0X07; //P2.0 1 2,8364的A0A1A2输入端口,设置读取模式为0,CHA0输出
__bis_SR_register(GIE); //开所有中断
}//定时器A初始化
void sys_TimerA_init(void)
{
/*
P1SEL |= 0X40;
TACCR0 = 3999;
TACCR1 = 3998;
TACCR2 = 3990;
TACCTL1 |= OUTMOD_7;
TACCTL2 |= CCIE;
TACTL |= TASSEL_2 + MC_1; //ta2,即p1.4产生5k方波
*/
TACCR0 = 399; //对SMCLK(1MHZ)进行400分频,让定时器A产生2.5KHZ的定时器中断
TACCR2 = 380;
TACCTL2 |= CCIE;
TACTL |= TASSEL_2 + MC_1;
}
//主函数
void main (void)
{
uint i,j,c,d;
WDTCTL = WDTPW + WDTHOLD;
sys_clock_init();
sys_UART0_init();
sys_IO_init();
sys_TimerA_init();
// for(i=0;i<21;i++) //液晶界面切换程序。
// {
UART0_send_data(0XAA);
UART0_send_data(0X70);
UART0_send_data(13);
for(j=0;j<4;j++)
UART0_send_data(chuan1[j]);
// for(j=0;j<0xFFFF;j++)
// for(k=0;k<20;k++);
// }
while(1)
if(count==1000)
{
P2OUT ^= 0X80; //指示灯闪烁
output=20000*sqrt(total/1000)/65535;
d = output%255;
c = output/255;
for(i=0;i<14;i++)
UART0_send_data(chuan2[i]);
UART0_send_data(0X00);
UART0_send_data(0X00);
UART0_send_data(c);
UART0_send_data(d);
for(i=0;i<14;i++)
UART0_send_data(chuan3[i]);
count=0;
total=0;
}
}
//P1.3口(EOC)中断,产生RD信号,读取、计算采样数据
#pragma vector = PORT1_VECTOR
__interrupt void PORT1 (void) //PORT_1与PORT1用法相通
{
_EINT();
P1IFG &= ~0X08; //中断标志清零(如果放在中断尾部,程序不正常。?)
uchar i;
count++;
P1OUT ^= 0X80; //p1.7端,输出1/2频率的中断,用于测量
//读取高8位
P1OUT &= ~0X01; //cs清零
_NOP();
P1OUT &= ~0X04; //P1.2清零,RD
for(i=0;i<2;i++); //延时,等待读取数据
data1 = P4IN; //读取低8位
P1OUT |= 0x04; //p1.2置1
_NOP();
P1OUT |= 0X01; //cs置1
//读取低8位
for(i=0;i<2;i++); //延时
P1OUT &= ~0X01; //cs清零
_NOP();
P1OUT &= ~0x04; //p1.2清零
for(i=0;i<2;i++); //延时
data2 = P4IN; //读取高8位
P1OUT |= 0X04; //p1.2置1,停止读取数据
_NOP();
P1OUT |= 0X01; //cs置1
total += pow(data2*256+data1,2);
}
/*
if(count==5000)
{
P2OUT ^= 0X80;
output = sqrt(total/5000);
output1 = 20000*output/65535;
d = output1 % 255;
c = output1 /255;
for(i=0;i<14;i++)
UART0_send_data(chuan2[i]);
UART0_send_data(0X00);
UART0_send_data(0X00);
UART0_send_data(c);
UART0_send_data(d);
for(i=0;i<14;i++)
UART0_send_data(chuan3[i]);
count=0;
total=0;
}
*///定时器A1中断,产生HOLDX和CS脉冲
#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
int i;
switch(TAIV)
{
case 2: break;
case 4:
P1OUT &= ~0X01; //产生CS片选信号
_NOP();
P1OUT &= ~0X40; //产生HOLD信号
for(i=0;i<6;i++); //延时
P1OUT |= 0X40; //产生HOLD信号
_NOP();
P1OUT |= 0X01;
break;
case 10: break;
}
}