微波EDA网,见证研发工程师的成长!
微波EDA网
  • 首页
  • 微波射频
  • 射频和无线通信
  • 天线设计
  • 硬件设计
  • PCB和SI
  • 通信和网络
  • 测试测量
  • 应用设计
  • 研发杂谈
  • 研发问答
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS8364y采样程序

ADS8364y采样程序

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

单片机控制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 int

    uint 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;
    }
    }

上一篇:AFE4400 Ambient Cancellation
下一篇:这个ADC芯片型号是什么

程序 ADS8364y 相关文章:

  • 请教AGC程序算法···
  • PGA400-Q1EVM下载程序报错ERROR - Register 026A, was programmed to: 22, but read back: 00。。全部返回0,求解释,多谢。
  • PGA-400Q1-EVM下载程序返回读0或读0XFF,求解决,多谢。
  • PGA400-Q1EVM程序下载报错,求指导,谢谢。
  • pga112程序控制问题求教
  • PGA400-Q1EVM程序下不进,小白求解释,谢谢。
栏目分类
  • 移动通信
  • 微波和射频技术
  • 无线和射频
  • PCB设计问答
  • 硬件电路设计
  • 嵌入式设计讨论
  • 手机设计讨论
  • 信号完整性分析
  • 测试测量
  • 微电子和IC设计
热门文章
  • tlv320adc3101 固件哪里能下
  • 原创音质很好的PCM2912+opa22
  • 使用Ultra Librarian转换TI芯
  • ADS1258与STM32单片机
  • HDMI 2.0型号转RGB or LVD
  • TI芯片资料中的Pspice Model
  • 关于OPA861作峰值保持电路的问
  • SDI转MIPI

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

网站地图

Top