📄 tlv5620.c
字号:
/*******************************************************
TLV5620正弦波产生实验
网址:http://www.wejay.com.cn
在TLV5620的DACA端输出正弦波
*******************************************************/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define CS_HIGH P5OUT|=BIT0;
#define CS_LOW P5OUT&=~BIT0;
#define CLK_HIGH P5OUT|=BIT3;
#define CLK_LOW P5OUT&=~BIT3;
#define DATA_HIGH P5OUT|=BIT1;
#define DATA_LOW P5OUT&=~BIT1;
uint DataNum=0;
//正弦波数据
const char SinData[360]={
128,130,132,134,136,139,141,143,145,148,
150,152,154,156,158,161,163,165,167,169,
171,173,175,178,180,182,184,186,188,190,
192,193,195,197,199,201,203,205,206,208,
210,211,213,215,216,218,220,221,223,224,
226,227,228,230,231,232,234,235,236,237,
238,239,241,242,243,244,244,245,246,247,
248,249,249,250,251,251,252,252,253,253,
254,254,254,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,254,254,
254,253,253,252,252,251,251,250,249,249,
248,247,246,245,244,244,243,242,241,239,
238,237,236,235,234,232,231,230,228,227,
226,224,223,221,220,218,216,215,213,211,
210,208,206,205,203,201,199,197,195,193,
191,190,188,186,184,182,180,178,175,173,
171,169,167,165,163,161,158,156,154,152,
150,148,145,143,141,139,136,134,132,130,
127,125,123,121,119,116,114,112,110,107,
105,103,101,99,97,94,92,90,88,86,
84,82,80,77,75,73,71,69,67,65,
63,62,60,58,56,54,52,50,49,47,
45,44,42,40,39,37,35,34,32,31,
29,28,27,25,24,23,21,20,19,18,
17,16,14,13,12,11,11,10,9,8,
7,6,6,5,4,4,3,3,2,2,
1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,
1,2,2,3,3,4,4,5,6,6,
7,8,9,10,11,11,12,13,14,16,
17,18,19,20,21,23,24,25,27,28,
29,31,32,34,35,37,39,40,42,44,
45,47,49,50,52,54,56,58,60,62,
64,65,67,69,71,73,75,77,80,82,
84,86,88,90,92,94,97,99,101,103,
105,107,110,112,114,116,119,121,123,125};
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do{
IFG1&=~OFIFG;//清除振荡器失效标志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判断XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
}
//端口初始化函数
void InitPort(void){
P5SEL=0x00;//设置为一般的IO口
P5DIR=BIT3+BIT1+BIT0;//P5.0 P5.1 P5.3设置为输出方向
CS_HIGH;//使TLV5620不被选通
}
//延时子函数
void Delay(void){
for(uint i=800;i>0;i--);
}
//DA转换程序
void DAConvert(uchar Data,uchar Command){
Command<<=5;
for(uchar i=0;i<3;i++){
if(Command&0x80){
DATA_HIGH;
}else{
DATA_LOW;
}
CLK_HIGH;
Command<<=1;
CLK_LOW;
}
for(uchar i=0;i<8;i++){
if(Data&0x80){
DATA_HIGH;
}else{
DATA_LOW;
}
CLK_HIGH;
Data<<=1;
CLK_LOW;
}
CS_LOW;
Delay();
CS_HIGH;
}
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR
CCTL0=CCIE;//CCR0中断允许 比较模式
CCR0=10;//时间间隔10us
}
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
DAConvert(SinData[DataNum],0x00);
DataNum++;
if(DataNum==360) DataNum=0;
}
void main(){
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
InitClock();
InitPort();
InitTimerA();
_EINT();//打开中断
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -