📄 dac8830.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();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -