device.cpp
上传用户:kepeng103
上传日期:2022-07-27
资源大小:2653k
文件大小:5k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include "..commonhal.h"
  2. #include "device.h"
  3. #include "buf.h"
  4. int active = 0;
  5. int mcasp_wdt = 0;
  6. extern "C" __interrupt void timer0_isr(void) 
  7. {
  8. if(++ mcasp_wdt > 10) {
  9. mcasp_wdt = 0;
  10. mcasp_reset();
  11. }
  12. }
  13. extern "C" __interrupt void mcasp1_xmt_isr(void)
  14. {
  15. static int lr = 0;
  16. static int16 data;
  17. if(lr == 0)
  18. data = data_out();
  19. REG32(MCASP1_XBUF0) = data;
  20. lr ^= 0x1;
  21. mcasp_wdt = 0;
  22. }
  23. extern "C" __interrupt void mcbsp0_recv_isr(void)
  24. {
  25. if(REG32(MCBSP0_SPCR) & 0x00000002) {
  26. data_in(REG32(MCBSP0_DRR));
  27. }
  28. }
  29. void gpio_init()
  30. {
  31. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  32. //REG32(GPIO_GPEN) = 0x00002e02;
  33. REG32(GPIO_GPEN) = 0x00002ee3;
  34. REG32(GPIO_GPDIR) = 0x00002e02;
  35. REG32(GPIO_GPVAL) = 0x00000002;
  36. }
  37. void dac_reset(void)
  38. {
  39. DAC_MS_HI();
  40. REG32(GPIO_GPVAL) &= (~MASK_DAC_PD);
  41. delay_ms(100);
  42. REG32(GPIO_GPVAL) |= MASK_DAC_PD;
  43. delay_ms(10);
  44. }
  45. int mcasp_init(void)
  46. {
  47. //Reset mcasp1
  48. REG32(MCASP1_GBLCTL) = 0x00000000;
  49. REG32(MCASP1_XMASK) = 0xFFFFFFFF;
  50. //MSB,16bit,CFG
  51. REG32(MCASP1_XFMT) = 0x0000807C;
  52. //2 slot TDM, internal sync, sync starts with rising edge.
  53. REG32(MCASP1_AFSXCTL) = 0x00000112; 
  54. //Internal bit clock. CLKXDIV = 3
  55. REG32(MCASP1_ACLKXCTL) = 0x000000E3;
  56. //Internal High speed clock. 16kHz: HCLKDIV = 7, 8kHz: HCLKDIV = F
  57. REG32(MCASP1_AHCLKXCTL) = 0x0000C00F;
  58. //TDM slot 0 and 1 is used.
  59. REG32(MCASP1_XTDM) = 0xFFFFFFFF;
  60. //Disable all interrupts
  61. REG32(MCASP1_XINTCTL) = 0x00000020;
  62. //Not used.
  63. REG32(MCASP1_XCLKCHK) = 0x00000000;
  64. //Transmitter
  65. REG32(MCASP1_SRCTL0) = 0x00000001;
  66. //AXR1[0] mcasp
  67. REG32(MCASP1_PFUNC) &= (~0xFE000001);
  68. REG32(MCASP1_PFUNC) |= 0x0000003E;
  69. //AXR1[0] output
  70. REG32(MCASP1_PDIR) |= 0xFC00003F;
  71. //TMD
  72. REG32(MCASP1_DITCTL) = 0;
  73. REG32(MCASP1_DLBCTL) = 0;
  74. REG32(MCASP1_AMUTE) = 0;
  75. REG32(MCASP1_GBLCTL) |= 0x00000202;
  76. while((REG32(MCASP1_GBLCTL) & 0x00000202) != 0x00000202);
  77. REG32(MCASP1_GBLCTL) |= 0x00000101;
  78. while((REG32(MCASP1_GBLCTL) & 0x00000101) != 0x00000101);
  79. REG32(MCASP1_GBLCTL) |= 0x00000404;
  80. while((REG32(MCASP1_GBLCTL) & 0x00000404) != 0x00000404);
  81. REG32(INT_MUXH) &= (~0x0000001F);
  82. REG32(INT_MUXH) |= 0x0000001E;
  83. IER |= 0x00000400;
  84. REG32(MCASP1_XBUF0) = 0x0000;
  85. while(REG32(MCASP1_XSTAT) & 0x20);
  86. // REG32(MCASP1_GBLCTL) |= 0x00000808; !!!!!!!!!!!!!!!!!!!!
  87. while((REG32(MCASP1_GBLCTL) & 0x00000808) != 0x00000808)
  88. REG32(MCASP1_GBLCTL) |= 0x00000808;
  89. REG32(MCASP1_GBLCTL) |= 0x00001000;
  90. while((REG32(MCASP1_GBLCTL) & 0x00001000) != 0x00001000);
  91. if(REG32(MCASP1_GBLCTL) != 0x00001F0F) {
  92. return -1;
  93. }
  94. return 0;
  95. }
  96. void mcasp_reset(void)
  97. {
  98. REG32(MCASP1_GBLCTL) &= (~0x00001808);
  99. while((REG32(MCASP1_GBLCTL) & 0x00000808) != 0x00000808)
  100. REG32(MCASP1_GBLCTL) |= 0x00000808;
  101. REG32(MCASP1_GBLCTL) |= 0x00001000;
  102. while((REG32(MCASP1_GBLCTL) & 0x00001000) != 0x00001000);
  103. }
  104. void set_led(uint8 mask, uint8 code)
  105. {
  106. REG32(MCASP1_PDOUT) &= (~(mask<<1));
  107. REG32(MCASP1_PDOUT) |= (((code & mask) << 1) & 0x3e);
  108. }
  109. void mcbsp0_init_serial(void)
  110. {
  111. REG32(MCBSP0_SPCR) = 0x00000000;
  112. //Free-running mode, 
  113. REG32(MCBSP0_SPCR) |= 0x02000000;
  114. delay_ms(10);
  115. //FSGM=0
  116. REG32(MCBSP0_SRGR) = 0x00000000;
  117. //XRST=1;
  118. REG32(MCBSP0_PCR) = 0x00000000;
  119. REG32(MCBSP0_XCR) = 0x00450040;
  120. REG32(MCBSP0_RCR) = 0x00450040;
  121. REG32(MCBSP0_SPCR) |= 0x00010000;
  122. delay_ms(10);
  123. if(REG32(MCBSP0_SPCR) & 0x00080000)
  124. REG32(MCBSP0_SPCR) &= (~0x00010000);
  125. REG32(MCBSP0_SPCR) |= 0x00010001;
  126. //McBSP0 receive uses INT13
  127. REG32(INT_MUXH) &= (~0x001F0000);
  128. REG32(INT_MUXH) |= 0x000D0000;
  129. IER |= 0x00002000;
  130. REG32(MCBSP0_DXR) = 0x00000000;
  131. }
  132. void adc_reg_write(uint16 code)
  133. {
  134. code |= 0x8000;
  135. while(! (REG32(MCBSP0_SPCR) & 0x00020000));
  136. REG32(MCBSP0_DXR) = code;
  137. }
  138. void adc_init(void)
  139. {
  140. //Reset
  141. ADC_SE_LO();
  142. REG32(GPIO_GPVAL) &= (~MASK_ADC_RESET);
  143. delay_ms(100);
  144. REG32(GPIO_GPVAL) |= MASK_ADC_RESET;
  145. delay_ms(10);
  146. ADC_SE_HI();
  147. delay_ms(10);
  148. //A, set device count
  149. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x0, 0x00));
  150. //B 8kHz:0x00,16kHz:0x05
  151. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x1, 0x00));
  152. //C
  153. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x2, 0x60));
  154. //D, Input gain select  0db:0x08, 6db:0x09, 12db:0x0a,18db:0x0b 
  155. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x3, 0x0b));//b
  156. //E
  157. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x4, 0x00));
  158. //F
  159. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x5, 0x00));
  160. //G
  161. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x6, 0xBF));
  162. //H
  163. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x7, 0x00));
  164. //A
  165. adc_reg_write(MAKE_ADC_CTL_WORD(0x0, 0x0, 0x01));
  166. delay_ms(10);
  167. ADC_SE_LO();
  168. }
  169. void timer0_init(void)
  170. {
  171. REG32(TIMER0_CTL) = 0x00000000;
  172. REG32(TIMER0_PRD) = 0x00050000;
  173. REG32(TIMER0_CTL) |= 0x00000307;
  174. REG32(TIMER0_CNT) = 0x00000000;
  175. REG32(TIMER0_CTL) |= 0x000000c0; 
  176. IER |= 0x00004000;
  177. }
  178. void timer1_init(void)
  179. {
  180. REG32(TIMER1_CTL) = 0x00000000;
  181. REG32(TIMER1_PRD) = 0xFFFFFFFF;
  182. REG32(TIMER1_CTL) |= 0x00000200;
  183. REG32(TIMER1_CNT) = 0x00000000;
  184. REG32(TIMER1_CTL) |= 0x000000C0;
  185. }
  186. void delay_ms(uint16 msec)
  187. {
  188. uint32 limit = msec * TIMER_CLOCK;
  189. uint32 start = REG32(TIMER1_CNT);
  190. uint32 current;
  191. do {
  192. current = REG32(TIMER1_CNT);
  193. } while((current - start) < limit);
  194. }