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

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. #include "hpi.h"
  3. #define HPI_CONTROL_REG 0x00
  4. #define HPI_DATA_WITHADDR_INC 0x04
  5. #define HPI_ADDR_REG 0x08
  6. #define HPI_DATA_REG 0x0C
  7. #define SET_BOB 0x101
  8. #define CLR_HINT 0x909
  9. #define INT_DSP 0x505
  10. int pBuf[128];
  11. char nFlag;
  12. void Init_Port(void)
  13. {
  14. //将P1 P2口所有的管脚在初始化的时候设置为输入方式
  15.     P1DIR = 0;
  16. P2DIR = 0;
  17.  
  18.     //将P1 P2 口所有的管脚设置为一般I/O口
  19.     P1SEL = 0;
  20. P2SEL = 0;
  21.     
  22. //P2.0作为输出管脚
  23. P2DIR |= BIT0;
  24. //P2.1作为输出管脚
  25. P2DIR |= BIT1;
  26. //P2.2作为输出管脚
  27. P2DIR |= BIT2;
  28. //P2.3作为输出管脚
  29. P2DIR |= BIT3;
  30. //P2.4作为输出管脚
  31. P2DIR |= BIT4;
  32. //HDS1输出高电平
  33. P2OUT = 0x10;
  34. // 管脚P2.7使能中断
  35. P2IE |= BIT7;
  36. // 对应的管脚由高到低电平跳变使相应的标志置位
  37.     P2IES |= BIT7;
  38. //打开中断
  39. _EINT();
  40. nFlag = 0;
  41.     return;
  42. }
  43. void Init_CLK(void)
  44. {
  45.     unsigned int i;
  46.     BCSCTL1 = 0X00; //将寄存器的内容清零
  47. //XT2震荡器开启
  48. //LFTX1工作在低频模式
  49. //ACLK的分频因子为1
  50.     do 
  51.     {
  52. IFG1 &= ~OFIFG; // 清除OSCFault标志
  53. for (i = 0x20; i > 0; i--);                
  54.     }
  55.     while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1   
  56.     BCSCTL2 = 0X00; //将寄存器的内容清零
  57.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  58.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  59. }
  60. void HPI_Write(int nValue,char nRegCode)
  61. {
  62. char hi;
  63. char lo;
  64. char temp;
  65. hi = (char)((nValue >> 8) & 0x0ff);
  66. lo = (char)(nValue & 0x0ff);
  67. //P1口为输出方向
  68. P1DIR = 0xFF;
  69.     
  70. //传输第一个字节
  71. P1OUT = lo;
  72. //设置HDS1为高
  73.     temp = (char)(nRegCode | 0x10);
  74. //往P2口输出控制信号
  75. P2OUT = temp;
  76. //设置HDS1为低,开始HPI
  77. P2OUT &= ~(BIT4);
  78. //设置HDS1为高,结束HPI
  79. P2OUT |= BIT4;
  80. //传输第一个字节
  81. P1OUT = hi;
  82. //设置HDS1为高、HBIL为高
  83.     temp = (char)(nRegCode | 0x12);
  84. //往P2口输出控制信号
  85. P2OUT = temp;
  86. //设置HDS1为低,开始HPI
  87. P2OUT &= ~(BIT4);
  88. //设置HDS1为高,结束HPI
  89. P2OUT |= BIT4;
  90. return;
  91. }
  92. int HPI_Read(char nRegCode)
  93. {
  94. char hi;
  95. char lo;
  96. char temp;
  97. int res;
  98. //P1口为输入方向
  99. P1DIR = 0x00;
  100.     
  101. //设置HDS1为高,HR/W为高
  102.     temp = (char)(nRegCode | 0x11);
  103. //往P2口输出控制信号
  104. P2OUT = temp;
  105. //设置HDS1为低,开始HPI
  106. P2OUT &= ~(BIT4);
  107. lo = P1IN;
  108. //设置HDS1为高,结束HPI
  109. P2OUT |= BIT4;
  110. //读第2个字节
  111. //设置HDS1为高、HBIL为高
  112.     temp = (char)(nRegCode | 0x13);
  113. //往P2口输出控制信号
  114. P2OUT = temp;
  115. //设置HDS1为低,开始HPI
  116. P2OUT &= ~(BIT4);
  117. hi = P1IN;
  118. //设置HDS1为高,结束HPI
  119. P2OUT |= BIT4;
  120. res = (int)(hi);
  121. res <<= 8;
  122. res = res + lo;
  123. return res;
  124. }
  125. interrupt [PORT2_VECTOR] void R_B_ISR(void)
  126. {
  127. if(P2IFG & BIT7)
  128.     {
  129.      // 清除中断标志位
  130.      P2IFG &= ~(BIT7);
  131. //清除DSP中断
  132. HPI_Write(CLR_HINT,HPI_CONTROL_REG);
  133. //从地址为62开始读数
  134. //先确定起始地址
  135.         HPI_Write(0x62,HPI_ADDR_REG);
  136. //读数
  137. pBuf[0] = HPI_Read(HPI_DATA_REG);
  138. //设置标志
  139. nFlag = 1;
  140.     }
  141. }
  142. void main(void)
  143. {
  144. // 关闭看门狗
  145. WDTCTL = WDTPW + WDTHOLD; 
  146. // 关闭中断
  147.     _DINT();
  148. Init_CLK();
  149. Init_Port();
  150. //初始化HPI
  151. HPI_Write(SET_BOB,HPI_CONTROL_REG);
  152. //初始地址
  153. HPI_Write(0x60,HPI_ADDR_REG);
  154. //往DSP写入一个数据
  155. HPI_Write(12,HPI_DATA_REG);
  156. //往DSP写入一个数据,地址增加
  157. HPI_Write(12,HPI_DATA_WITHADDR_INC);
  158. //中断DSP
  159. HPI_Write(INT_DSP,HPI_CONTROL_REG);
  160. for(;;)
  161. {
  162. //等待DSP返回
  163. if(nFlag == 1) break;
  164. }
  165. }