dac8830.c
资源名称:msp430.rar [点击查看]
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:
DSP编程
开发平台:
C/C++
- #include <msp430x14x.h>
- #include <math.h>
- #include "DAC8830.h"
- #define TABLE_SIZE 256
- int sinetable[TABLE_SIZE], costable[TABLE_SIZE];
- int nTX0_Len;
- char nTX0_Flag;
- int nSend_TX0;
- char UART0_TX_BUF[26];
- void InitTables(int period)
- {
- int y;
- double dTemp;
- dTemp = 2 * 3.141593659 * period * y / TABLE_SIZE;
- for (y = 0; y < TABLE_SIZE; y++)
- {
- sinetable[y] = (unsigned int)((sin(dTemp) + 1.0) * 32767);
- costable[y] = (unsigned int)((cos(dTemp) + 1.0) * 32767);
- }
- }
- void Init_Port(void)
- {
- //将P3口所有的管脚在初始化的时候设置为输入方式
- P3DIR = 0;
- //将P3口所有的管脚设置为一般I/O口
- P3SEL = 0;
- //P3.1 P3.2 P3.3被分配为SPI口
- P3SEL = BIT3 + BIT2 + BIT1;
- //P3.0作为输出管脚
- P3DIR |= BIT0;
- //P3.3作为输出管脚
- P3DIR |= BIT3;
- //P3.1作为输出管脚
- P3DIR |= BIT1;
- //P3.0 输出高电平,使DAC8830不被选通
- P3OUT |= BIT0;
- return;
- }
- void Init_CLK(void)
- {
- 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
- }
- void Init_SPI (void)
- {
- //SPI0模块允许
- ME1 |= USPIE0;
- //将寄存器的内容清零
- U0CTL = 0X00;
- //数据为8比特,选择SPI模式,单片机为主机模式
- U0CTL |= CHAR + SYNC + MM;
- //将寄存器的内容清零
- U0TCTL = 0X00;
- // 时钟源为SMCLK,选择3线模式
- U0TCTL = CKPH + SSEL1 + SSEL0 + STC;
- //传输时钟为SMCLK / 4
- UBR0_0 = 0X02;
- UBR1_0 = 0X00;
- //调整寄存器,没有调整
- UMCTL_0 = 0X00;
- //发送中断允许
- IE1 |= UTXIE0;
- }
- void convert (int nValue)
- {
- unsigned char hi_byte;
- unsigned char lo_byte;
- //取出高字节
- hi_byte = (char)(nValue >> 8);
- //取出低字节
- lo_byte = (char)(nValue & 0x0ff);
- //选通DAC8830
- CS_Enable();
- //等待传输完成
- while ((IFG1 & UTXIFG0) == 0) ;
- //发送数据
- U0TXBUF = lo_byte;
- //等待传输完成
- while ((IFG1 & UTXIFG0) == 0) ;
- //发送数据
- U0TXBUF = hi_byte;
- //不选通DAC8830
- CS_Disable();
- return ;
- }
- void CS_Enable(void)
- {
- //P3.0输出低电平
- P3OUT &=~(BIT0);
- return ;
- }
- void CS_Disable(void)
- {
- //P3.0输出高电平
- P3OUT|=BIT0;
- return ;
- }
- void Delay(void)
- {
- int i;
- for(i = 1000; i > 0; i--) ;
- return ;
- }
- void main_normal()
- {
- int i;
- //初始化时钟
- Init_CLK();
- //端口初始化
- Init_Port();
- //SPI初始化
- Init_SPI();
- //初始化表
- InitTables(4);
- for(i = 0; i < 256; i++)
- {
- convert(sinetable[i]);
- }
- return;
- }
- interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)
- {
- if(nTX0_Len != 0)
- {
- // 表示缓冲区里的数据没有发送完
- nTX0_Flag = 0;
- TXBUF0 = UART0_TX_BUF[nSend_TX0];
- nSend_TX0 += 1;
- if(nSend_TX0 >= nTX0_Len)
- {
- nSend_TX0 = 0;
- nTX0_Len = 0;
- nTX0_Flag = 1;
- }
- }
- }
- void main_int(void)
- {
- int i;
- //初始化时钟
- Init_CLK();
- //端口初始化
- Init_Port();
- //SPI初始化
- Init_SPI();
- //初始化表
- InitTables(4);
- //打开中断
- _EINT();
- nTX0_Len = 0;
- nTX0_Flag = 0;
- nSend_TX0 = 0;
- //选通DAC8830
- CS_Enable();
- for(i = 0;i < 6;i++)
- {
- UART0_TX_BUF[2 * i] = (char)(sinetable[i] & 0x00ff);
- UART0_TX_BUF[2 * i + 1] = (char)((sinetable[i] >> 8) & 0x00ff);
- }
- nTX0_Len = 12;
- // 设置中断标志,进入发送中断程序
- IFG1 |= UTXIFG0;
- for(;;)
- {
- if(nTX0_Flag == 1) break;
- }
- //不选通DAC8830
- CS_Disable();
- }