dac8830.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. #include <math.h>
  3. #include "DAC8830.h"
  4. #define TABLE_SIZE       256
  5. int sinetable[TABLE_SIZE], costable[TABLE_SIZE];
  6. int nTX0_Len;
  7. char nTX0_Flag;
  8. int nSend_TX0;
  9. char UART0_TX_BUF[26];
  10. void InitTables(int period)
  11. {         
  12. int y;
  13. double dTemp;
  14. dTemp = 2 * 3.141593659 * period * y / TABLE_SIZE;
  15. for (y = 0; y < TABLE_SIZE; y++)
  16. {
  17.     sinetable[y] = (unsigned int)((sin(dTemp) + 1.0) * 32767);
  18.     costable[y] = (unsigned int)((cos(dTemp) + 1.0) * 32767);
  19. }
  20. }
  21. void Init_Port(void)
  22. {
  23.     //将P3口所有的管脚在初始化的时候设置为输入方式
  24.     P3DIR = 0;
  25.  
  26.     //将P3口所有的管脚设置为一般I/O口
  27.     P3SEL = 0;
  28.     
  29. //P3.1 P3.2 P3.3被分配为SPI口
  30.     P3SEL = BIT3 + BIT2 + BIT1;
  31. //P3.0作为输出管脚
  32. P3DIR |= BIT0;
  33. //P3.3作为输出管脚
  34. P3DIR |= BIT3;
  35. //P3.1作为输出管脚
  36. P3DIR |= BIT1;
  37. //P3.0 输出高电平,使DAC8830不被选通
  38. P3OUT |= BIT0; 
  39.     return;
  40. }
  41. void Init_CLK(void)
  42. {
  43.     unsigned int i;
  44.     BCSCTL1 = 0X00; //将寄存器的内容清零
  45. //XT2震荡器开启
  46. //LFTX1工作在低频模式
  47. //ACLK的分频因子为1
  48.     do 
  49.     {
  50. IFG1 &= ~OFIFG; // 清除OSCFault标志
  51. for (i = 0x20; i > 0; i--);                
  52.     }
  53.     while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1   
  54.     BCSCTL2 = 0X00; //将寄存器的内容清零
  55.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  56.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  57. }
  58. void Init_SPI (void)
  59. {
  60. //SPI0模块允许     
  61. ME1 |= USPIE0; 
  62. //将寄存器的内容清零
  63.     U0CTL = 0X00;
  64.     //数据为8比特,选择SPI模式,单片机为主机模式
  65.     U0CTL |= CHAR + SYNC + MM;
  66.     
  67. //将寄存器的内容清零
  68.     U0TCTL = 0X00;
  69.     // 时钟源为SMCLK,选择3线模式
  70.     U0TCTL = CKPH + SSEL1 + SSEL0 + STC; 
  71.     
  72. //传输时钟为SMCLK / 4
  73.     UBR0_0 = 0X02;  
  74.     UBR1_0 = 0X00;
  75. //调整寄存器,没有调整
  76.     UMCTL_0 = 0X00;     
  77. //发送中断允许
  78. IE1 |= UTXIE0; 
  79. }
  80. void convert (int nValue)
  81. {
  82.     
  83. unsigned char hi_byte;
  84. unsigned char lo_byte;
  85. //取出高字节
  86. hi_byte = (char)(nValue >> 8);
  87. //取出低字节
  88. lo_byte = (char)(nValue & 0x0ff);
  89. //选通DAC8830
  90. CS_Enable();
  91. //等待传输完成
  92.        while ((IFG1 & UTXIFG0) == 0) ;
  93. //发送数据
  94.     U0TXBUF = lo_byte;
  95. //等待传输完成
  96.     while ((IFG1 & UTXIFG0) == 0) ;
  97. //发送数据
  98.     U0TXBUF = hi_byte;
  99. //不选通DAC8830
  100. CS_Disable();                                    
  101.     
  102. return ;
  103. }
  104. void CS_Enable(void)
  105. {
  106. //P3.0输出低电平
  107. P3OUT &=~(BIT0);
  108. return ;
  109. }
  110. void CS_Disable(void)
  111. {
  112. //P3.0输出高电平
  113. P3OUT|=BIT0;
  114. return ;
  115. }
  116. void Delay(void)
  117. {
  118. int i;
  119. for(i = 1000; i > 0; i--) ;
  120. return ;
  121. }
  122.  
  123. void main_normal()
  124. {
  125. int i;
  126. //初始化时钟
  127. Init_CLK();
  128. //端口初始化
  129. Init_Port();
  130. //SPI初始化
  131. Init_SPI();
  132. //初始化表
  133. InitTables(4);
  134. for(i = 0; i < 256; i++)
  135. {
  136. convert(sinetable[i]);
  137. }
  138. return;
  139. }
  140. interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)
  141. {
  142.     if(nTX0_Len != 0)
  143.     {
  144. // 表示缓冲区里的数据没有发送完
  145.      nTX0_Flag = 0;
  146.     
  147.      TXBUF0 = UART0_TX_BUF[nSend_TX0];
  148.      nSend_TX0 += 1;
  149.     
  150.      if(nSend_TX0 >= nTX0_Len)
  151.      {
  152.          nSend_TX0 = 0;
  153.          nTX0_Len = 0;
  154.          nTX0_Flag = 1;
  155.      }
  156.     }
  157. }
  158. void main_int(void)
  159. {
  160. int i;
  161. //初始化时钟
  162. Init_CLK();
  163. //端口初始化
  164. Init_Port();
  165. //SPI初始化
  166. Init_SPI();
  167. //初始化表
  168. InitTables(4);
  169. //打开中断
  170. _EINT();
  171. nTX0_Len = 0;
  172.     nTX0_Flag = 0;
  173.     nSend_TX0 = 0;
  174. //选通DAC8830
  175. CS_Enable();
  176. for(i = 0;i < 6;i++)
  177. {
  178. UART0_TX_BUF[2 * i] = (char)(sinetable[i] & 0x00ff);
  179. UART0_TX_BUF[2 * i + 1] = (char)((sinetable[i] >> 8) & 0x00ff);
  180. }
  181. nTX0_Len = 12;
  182. // 设置中断标志,进入发送中断程序
  183. IFG1 |= UTXIFG0;
  184. for(;;)
  185. {
  186. if(nTX0_Flag == 1) break;
  187. }
  188. //不选通DAC8830
  189. CS_Disable();  
  190. }