msp430f149+外设tlv61612位DA转换模块

来源:互联网 发布:韩服lol账号购买淘宝 编辑:程序博客网 时间:2024/04/30 05:18

这几天调这个DA调得很恼火啊,之前打算用DAC8571来做,是一个16位的DA转换芯片。但是调了3天都没有输出!!IIC总线写不进去数据啊,急死我了啊骂人  明明芯片IIC输入数据后总线上检测到有应答的,但是就是输出一直为0

想想就觉得这个世界充满了恶意。

 

下面是换了5616这个12位的dc芯片做的,调了2个小时就通了啊有木有,简直不能忍。

 

上代码

〈还是先解释一下啊喂:p2.0口——DIN  P2.1口——SCLK  P2.2口——CS/  P2.3口——FS〉

时钟还是自己写比较靠谱

 用了按键外部中断来改变写入5616的数字量,按键+-50

 

#include<msp430x14x.h>#define uchar unsigned char#define uint unsigned int#define DA5616_clk_H     P2OUT|=BIT1//P2.1#define DA5616_clk_L     P2OUT&=~BIT1//P2.1#define DA5616_cs_H    P2OUT|=BIT2//P2.2#define DA5616_cs_L    P2OUT&=~BIT2//P2.2#define DA5616_fs_H      P2OUT|=BIT3//P2.3#define DA5616_fs_L      P2OUT&=~BIT3//P2.3uint data;void int_clock(){  uchar i;  BCSCTL1&=~XT2OFF;   //外部高速时钟晶振  BCSCTL2|=SELM1 + SELS;  //MCLK,SMLCK均用外部高速时钟  do  {    IFG1&=~OFIFG;    for(i=0;i<100;i++)      _NOP();      }while((IFG1&OFIFG));  IFG1 &=~OFIFG;}void io_init(){  P2DIR=BIT3+BIT1+BIT2+BIT0;//P2.0 P2.1 P2.2 P2.3设置输出}/****  DA转换   ****/void DA5616(uint da){  uchar i;  DA5616_cs_L;  DA5616_fs_L;  DA5616_clk_L;  for(i=0;i<16;i++)  {    P2OUT |=(da&0x8000)>>15;    DA5616_clk_H;    da<<=1;     //da二进制数据左移一位  *2    DA5616_clk_L;  }  P2OUT&=0xfe;  DA5616_fs_H;  DA5616_cs_H;}void DA5616_out(float data1){    uint temp;  temp = data1*2048/2.5;  DA5616(temp);  }void main(){  // Stop watchdog timer to prevent time out reset  //关闭所有的IO口   P1DIR = 0XFF;P1OUT = 0XFF;    P2DIR = 0XFF;P2OUT = 0XFF;    P3DIR = 0XFF;P3OUT = 0XFF;    P4DIR = 0XFF;P4OUT = 0XFF;    P5DIR = 0XFF;P5OUT = 0XFF;    P6DIR = 0XFF;P6OUT = 0XFF;    P1IES = 0x30;               // P1.0~P1.3选择下降沿中断    P1IE = 0x30;                // 打开中断使能    P1DIR = BIT1;               //设置P1.0~P.3为输入状态,P.7为输出    P1OUT = 0;  WDTCTL = WDTPW + WDTHOLD;    //关狗  data = 1400;  int_clock();  io_init();  DA5616(data);   _EINT();  while(1)  {      }}/*******************************************函数名称:Port1_ISR功    能:端口P1的中断服务函数参    数:无返回值  :无********************************************/#pragma vector=PORT1_VECTOR__interrupt void Port1_ISR(void){        _DINT();        if(P1IFG & BIT4)    {        P1IFG = 0x00;           //清中断标志         data -= 20;          //DAC的输出减少100个偏置量        int_clock();        io_init();        DA5616(data);    }    else if(P1IFG & BIT5)    {        P1IFG = 0x00;           //清中断标志        data += 20;          //DAC的输出增加100个偏置量        int_clock();        io_init();        DA5616(data);    }    else        _NOP();        P1IFG = 0x00;           //清中断标志    _EINT();}

ok  ~

 

 

0 0