从前天开始学校把我的MSP430Launchpad 收上去了,但学习还得继续,写了一个SPI控制的DAC8830的程序,主要实现的是通过我们前面学习的ADC10把模拟的信号(比如正弦信号)采集进来,然后通过DAC8830把这个信号实时的送出,应该可以用示波器观察的到,有板子和这块DAC8830的作者可以试试看,程序应该没有太大问题。
#include "msp430g2553.h"
#include
void Init_CLK(void);
void convert (unsigned int nValue);
int x=0;
unsigned char txdat;
unsigned int voltvalue;
unsigned int i=0;
unsigned int j=0,m=0;
unsigned int shuzhi=0,qushu=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
Init_CLK();
P1SEL = BIT1 + BIT2 + BIT4 ;//+BIT5;
P1SEL2 = BIT1 + BIT2 + BIT4 ;//+ BIT5;
UCA0CTL0 |= UCCKPH + UCMST + UCSYNC+ UCMSB; // 3-pin, 8-bit SPI master
UCA0CTL1 |= UCSSEL_2; // SMCLK + UCMSB + UCMSB
UCA0BR0 = 0; //
UCA0BR1 = 0; // 没分频。
UCA0MCTL = 0; // No modulation
// UCA0CTL1 &= ~UCSWRST; //spi先不使能。 // **Initialize USCI state machine**
IE2&= ~UCA0TXIE;
P1DIR |= BIT2; //输出数据
P1DIR |= BIT4;//输出clk
P1DIR |= BIT7; //片选CS
P1OUT |= BIT7;
P1DIR |= BIT5; //测周期。检测用。可以不用管。
P1OUT |= BIT5;
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1; // input A1模拟信号输入选择通道A1即p1.1
ADC10AE0 |= 0x01; // PA.1 ADC option select使p1.1允许AD模拟输入信号
TA1CCTL0 = CCIE; // CCR0 0.524ms中断
TA1CCR0 = 312;
TA1CTL = TASSEL_2 + MC_1; //
_EINT(); //允许中断
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
while(1)
{
if(m==1)
{
voltvalue=qushu/4;
convert (voltvalue);
P1OUT ^= BIT5;
m=0;
}
}
}
/********************************************
*
定时器Timer1_A
*******************************************/
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A (void)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start开始转换
qushu=ADC10MEM;//取出ad转换值
m=1;
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
void Init_CLK(void)
{
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
}
void convert (unsigned int nValue)
{
unsigned char hi_byte;
unsigned char lo_byte;
hi_byte = (char)(nValue >> 8);//取出高字节 高8位,注其本身值并没有变。
lo_byte = (char)(nValue & 0x0ff);//取出低8位
P1OUT &= ~BIT7;//选通dac8830
//while ((IFG2 & UCA0TXIFG)==0);//等待传输完成。这个时序错了。
UCA0CTL1 &= ~UCSWRST; //spi使能。查中断标志位。
UCA0TXBUF =lo_byte;//发送数据
while ((IFG2 & UCA0TXIFG)==0);//等待传输完成。
UCA0TXBUF = hi_byte;
while ((IFG2 & UCA0TXIFG)==0);//等待传输完成。
UCA0CTL1 |= UCSWRST;
P1OUT |= BIT7;
return;
}