Example_281xSci_FFDLB_int.c
上传用户:qingfan3
上传日期:2014-10-27
资源大小:31439k
文件大小:9k
源码类别:

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xSci_FFDLB_int.c
  4. //
  5. // TITLE:  DSP281x Device SCI Digital Loop Back porgram.
  6. // 
  7. //
  8. // ASSUMPTIONS:
  9. //
  10. //         This program requires the DSP281x V1.00 header files.  
  11. //         As supplied, this project is configured for "boot to H0" operation.
  12. //
  13. //         Other then boot mode pin configuration, no other hardware configuration
  14. //         is required. 
  15. //
  16. // DESCRIPTION:
  17. //
  18. // This program is a SCI example that uses the internal loopback of
  19. // the peripheral.  Both interrupts and the SCI FIFOs are used.
  20. //
  21. // A stream of data is sent and then compared to the recieved stream.
  22. //  
  23. // The SCI-A sent data looks like this:
  24. // 00 01 02 03 04 05 06 07
  25. // 01 02 03 04 05 06 07 08
  26. // 02 03 04 05 06 07 08 09 
  27. // ....
  28. // FE FF 00 01 02 03 04 05
  29. // FF 00 01 02 03 04 05 06
  30. // etc..
  31. //
  32. //
  33. // The SCI-B sent data looks like this:
  34. // FF FE FD FC FB FA F9 F8
  35. // FE FD FC FB FA F9 F8 F7
  36. // FD FC FB FA F9 F8 F7 F6 
  37. // ....
  38. // 01 00 FF FE FD FC FB FA
  39. // 00 FF FE FD FC FB FA F9
  40. // etc..
  41. //
  42. // Both patterns are repeated forever.  
  43. //
  44. // Watch Variables:  
  45. //  
  46. //     SCI-A           SCI-B
  47. //     ----------------------
  48. //     sdataA          sdataB           Data being sent
  49. //     rdataA          rdataB           Data received
  50. //     rdata_pointA    rdata_pointB     Keep track of where we are in the datastream
  51. //                                      This is used to check the incoming data           
  52. //###########################################################################
  53. // Original Source by S.D. 
  54. // 
  55. //  Ver | dd mmm yyyy | Who  | Description of changes
  56. // =====|=============|======|===============================================
  57. //  1.00| 11 Sep 2003 | L.H. | EzDSP Alpha Release
  58. //###########################################################################
  59. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  60. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  61. #define CPU_FREQ  150E6
  62. #define SCI_FREQ  100E3
  63. #define SCI_PRD  CPU_FREQ/(SCI_FREQ*8)
  64. // Prototype statements for functions found within this file.
  65. interrupt void sciaTxFifoIsr(void);
  66. interrupt void sciaRxFifoIsr(void);
  67. interrupt void scibTxFifoIsr(void);
  68. interrupt void scibRxFifoIsr(void);
  69. void scia_fifo_init(void);
  70. void scib_fifo_init(void);
  71. void error(void);
  72. // Global variables
  73. Uint16 sdataA[8];    // Send data for SCI-A
  74. Uint16 sdataB[8];    // Send data for SCI-B
  75. Uint16 rdataA[8];    // Received data for SCI-A
  76. Uint16 rdataB[8];    // Received data for SCI-A
  77. Uint16 rdata_pointA; // Used for checking the received data
  78. Uint16 rdata_pointB;
  79. void main(void)
  80.    Uint16 i;
  81. // Step 1. Initialize System Control:
  82. // PLL, WatchDog, enable Peripheral Clocks
  83. // This example function is found in the DSP281x_SysCtrl.c file.
  84.    InitSysCtrl();
  85. // Step 2. Initalize GPIO: 
  86. // This example function is found in the DSP281x_Gpio.c file and
  87. // illustrates how to set the GPIO to it's default state.
  88. // InitGpio();    
  89. // Setup only the GP I/O only for SCI-A and SCI-B functionality
  90.    EALLOW;
  91.    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
  92.    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;           
  93.    GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1;
  94.    GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1;           
  95.    EDIS;
  96. // Step 3. Clear all interrupts and initialize PIE vector table:
  97. // Disable CPU interrupts 
  98.    DINT;
  99. // Initialize PIE control registers to their default state.
  100. // The default state is all PIE interrupts disabled and flags
  101. // are cleared.  
  102. // This function is found in the DSP281x_PieCtrl.c file.
  103.    InitPieCtrl();
  104. // Disable CPU interrupts and clear all CPU interrupt flags:
  105.    IER = 0x0000;
  106.    IFR = 0x0000;
  107. // Initialize the PIE vector table with pointers to the shell Interrupt 
  108. // Service Routines (ISR).  
  109. // This will populate the entire table, even if the interrupt
  110. // is not used in this example.  This is useful for debug purposes.
  111. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  112. // This function is found in DSP281x_PieVect.c.
  113.    InitPieVectTable();
  114. // Interrupts that are used in this example are re-mapped to
  115. // ISR functions found within this file.  
  116.    EALLOW; // This is needed to write to EALLOW protected registers
  117.    PieVectTable.RXAINT = &sciaRxFifoIsr;
  118.    PieVectTable.TXAINT = &sciaTxFifoIsr;
  119.    PieVectTable.RXBINT = &scibRxFifoIsr;
  120.    PieVectTable.TXBINT = &scibTxFifoIsr;
  121.    EDIS;   // This is needed to disable write to EALLOW protected registers 
  122.  
  123.  
  124. // Step 4. Initialize all the Device Peripherals:
  125. // This function is found in DSP281x_InitPeripherals.c
  126. // InitPeripherals(); // Not required for this example
  127.    scia_fifo_init();  // Init SCI-A
  128.    scib_fifo_init();  // Init SCI-B
  129. // Step 5. User specific code, enable interrupts:
  130.  
  131. // Init send data.  After each transmission this data
  132. // will be updated for the next transmission
  133.    for(i = 0; i<8; i++)
  134.    {
  135.       sdataA[i] = i;
  136.    }
  137.    for(i = 0; i<8; i++)
  138.    {
  139.       sdataB[i] = 0xFF - i;
  140.    }
  141.    rdata_pointA = sdataA[0];
  142.    rdata_pointB = sdataB[0]; 
  143.  
  144. // Enable interrupts required for this example
  145.    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
  146.    PieCtrlRegs.PIEIER9.bit.INTx1=1;     // PIE Group 9, INT1
  147.    PieCtrlRegs.PIEIER9.bit.INTx2=1;     // PIE Group 9, INT2
  148.    PieCtrlRegs.PIEIER9.bit.INTx3=1;     // PIE Group 9, INT3
  149.    PieCtrlRegs.PIEIER9.bit.INTx4=1;     // PIE Group 9, INT4
  150.    IER = 0x100; // Enable CPU INT
  151.    EINT;   
  152. // Step 6. IDLE loop. Just sit and loop forever (optional):
  153. for(;;);
  154. void error(void)
  155. {
  156.     asm("     ESTOP0"); // Test failed!! Stop!
  157.     for (;;);
  158. }
  159. interrupt void sciaTxFifoIsr(void)
  160. {   
  161.     Uint16 i;
  162.     for(i=0; i< 8; i++)
  163.     {
  164.      SciaRegs.SCITXBUF=sdataA[i];     // Send data
  165. }
  166.     for(i=0; i< 8; i++)                 //Increment send data for next cycle
  167.     {
  168.      sdataA[i] = (sdataA[i]+1) & 0x00FF;  
  169. }
  170. SciaRegs.SCIFFTX.bit.TXINTCLR=1; // Clear SCI Interrupt flag
  171. PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
  172. }
  173. interrupt void sciaRxFifoIsr(void)
  174. {   
  175.     Uint16 i;
  176. for(i=0;i<8;i++)
  177. {
  178.    rdataA[i]=SciaRegs.SCIRXBUF.all;  // Read data
  179. }
  180. for(i=0;i<8;i++)                     // Check received data
  181. {
  182.    if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
  183. }
  184. rdata_pointA = (rdata_pointA+1) & 0x00FF;                                 
  185. SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
  186. SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
  187. PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
  188. }
  189. void scia_fifo_init()
  190. {
  191.    SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback 
  192.                                   // No parity,8 char bits,
  193.                                   // async mode, idle-line protocol
  194.    SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK, 
  195.                                   // Disable RX ERR, SLEEP, TXWAKE
  196.    SciaRegs.SCICTL2.bit.TXINTENA =1;
  197.    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
  198.    SciaRegs.SCIHBAUD = 0x0000;
  199.    SciaRegs.SCILBAUD = SCI_PRD;
  200.    SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back  
  201.    SciaRegs.SCIFFTX.all=0xC028;
  202.    SciaRegs.SCIFFRX.all=0x0028;
  203.    SciaRegs.SCIFFCT.all=0x00;
  204.    SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset 
  205.    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
  206.    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;  
  207.      
  208.                
  209. }  
  210. interrupt void scibTxFifoIsr(void)
  211. {       
  212.     Uint16 i;
  213.     for(i=0; i< 8; i++)
  214.     {
  215.      ScibRegs.SCITXBUF=sdataB[i];     // Send data
  216. }
  217.     for(i=0; i< 8; i++)                 //Increment send data for next cycle
  218.     {
  219.      sdataB[i] = (sdataB[i]-1) & 0x00FF;  
  220. }
  221. ScibRegs.SCIFFTX.bit.TXINTCLR=1;    // Clear Interrupt flag
  222. PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
  223. }
  224. interrupt void scibRxFifoIsr(void)
  225. {
  226.     Uint16 i;
  227. for(i=0;i<8;i++)
  228. {
  229.    rdataB[i]=ScibRegs.SCIRXBUF.all;  // Read data
  230. }
  231. for(i=0;i<8;i++)                     // Check received data
  232. {
  233.    if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
  234. }
  235. rdata_pointB = (rdata_pointB-1) & 0x00FF; 
  236.                                 
  237. ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
  238. ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
  239. PieCtrlRegs.PIEACK.all|=0x100;   // Issue PIE ack
  240. }
  241. void scib_fifo_init()
  242. {
  243.    ScibRegs.SCICCR.all =0x0007;    // 1 stop bit,  No loopback 
  244.                                    // No parity,8 char bits,
  245.                                    // async mode, idle-line protocol
  246.    ScibRegs.SCICTL1.all =0x0003;   // enable TX, RX, internal SCICLK, 
  247.                                    // Disable RX ERR, SLEEP, TXWAKE
  248.    ScibRegs.SCICTL2.bit.TXINTENA =1;
  249.    ScibRegs.SCICTL2.bit.RXBKINTENA =1;
  250.    ScibRegs.SCIHBAUD    =0x0000;
  251.    ScibRegs.SCILBAUD    =SCI_PRD;
  252.    ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back  
  253.    ScibRegs.SCIFFTX.all=0xC028;
  254.    ScibRegs.SCIFFRX.all=0x0028;
  255.    ScibRegs.SCIFFCT.all=0x00;
  256.    ScibRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset 
  257.    ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
  258.    ScibRegs.SCIFFRX.bit.RXFIFORESET=1;  
  259.       
  260. }  
  261. //===========================================================================
  262. // No more.
  263. //===========================================================================