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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xMCBSP_FFDLB_int.c
  4. //
  5. // TITLE:  DSP281x Device McBSP Digital Loop Back porgram
  6. //
  7. // ASSUMPTIONS:
  8. //
  9. //         This program requires the DSP281x V1.00 header files.  
  10. //         As supplied, this project is configured for "boot to H0" operation.
  11. //
  12. //         Other then boot mode pin configuration, no other hardware configuration
  13. //         is required.
  14. //
  15. // DESCRIPTION:
  16. //
  17. // This program is a McBSP example that uses the internal loopback of
  18. // the peripheral.  Both interrupts and the McBSP FIFOs are used.
  19. //
  20. // A stream of data is sent and then compared to the recieved stream.
  21. //  
  22. // The sent data looks like this:
  23. // 00 01 02 03 04 05 06 07
  24. // 01 02 03 04 05 06 07 08
  25. // 02 03 04 05 06 07 08 09 
  26. // ....
  27. // FE FF 00 01 02 03 04 05
  28. // FF 00 01 02 03 04 05 06
  29. // etc..
  30. //
  31. // This pattern is repeated forever.  
  32. //
  33. //###########################################################################
  34. //
  35. // Original Source by S.D. 
  36. //
  37. //  Ver | dd mmm yyyy | Who  | Description of changes
  38. // =====|=============|======|===============================================
  39. //  1.00| 11 Sep 2003 | L.H. | McBSP Interrupt Example 
  40. //###########################################################################
  41. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  42. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  43. // Prototype statements for functions found within this file.
  44. void delay_loop(void);
  45. interrupt void mcbspTxFifoIsr(void);
  46. interrupt void mcbspRxFifoIsr(void);
  47. void mcbsp_init(void);
  48. void error(void);
  49. // Global data variables used for this example
  50. Uint16 sdata[8];    // Sent Data
  51. Uint16 rdata[8];    // Recieved Data
  52. Uint16 rdata_point; // Keep track of where we 
  53.                     // are in the data stream
  54. void main(void)
  55. {     
  56.    Uint16 i;
  57. // Step 1. Initialize System Control:
  58. // PLL, WatchDog, enable Peripheral Clocks
  59. // This example function is found in the DSP281x_SysCtrl.c file.
  60.    InitSysCtrl();
  61. // Step 2. Initalize GPIO: 
  62. // This example function is found in the DSP281x_Gpio.c file and
  63. // illustrates how to set the GPIO to it's default state.
  64. // InitGpio();  // Skipped for this example  
  65. // Setup only the GP I/O only for McBSP functionality
  66.    EALLOW;                      // Allow access to EALLOW protected registers
  67.    GpioMuxRegs.GPFMUX.all=0x3F00;    // Select GPIOs to be McBSP pins     
  68.                                      // Port F MUX - x111 1110 0000 0000
  69.    EDIS;                        // Disable access to EALLOW protected registers
  70. // Step 3. Clear all interrupts and initialize PIE vector table:
  71. // Disable CPU interrupts 
  72.    DINT;
  73. // Initialize PIE control registers to their default state.
  74. // The default state is all PIE interrupts disabled and flags
  75. // are cleared.  
  76. // This function is found in the DSP281x_PieCtrl.c file.
  77.    InitPieCtrl();
  78. // Disable CPU interrupts and clear all CPU interrupt flags:
  79.    IER = 0x0000;
  80.    IFR = 0x0000;
  81. // Initialize the PIE vector table with pointers to the shell Interrupt 
  82. // Service Routines (ISR).  
  83. // This will populate the entire table, even if the interrupt
  84. // is not used in this example.  This is useful for debug purposes.
  85. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  86. // This function is found in DSP281x_PieVect.c.
  87.    InitPieVectTable();
  88. // Interrupts that are used in this example are re-mapped to
  89. // ISR functions found within this file.  
  90.    EALLOW; // Allow access to EALLOW protected registers
  91.    PieVectTable.MRINTA= &mcbspRxFifoIsr; 
  92.    PieVectTable.MXINTA=&mcbspTxFifoIsr;
  93.    EDIS;   // Disable access to EALLOW protected registers
  94. // Step 4. Initialize all the Device Peripherals:
  95. // This function is found in DSP281x_InitPeripherals.c
  96. // InitPeripherals(); // Not required for this example
  97.    mcbsp_init();      // For this example, only initialize the Mcbsp
  98. // Step 5. User specific code, enable interrupts:
  99. // Initalize the send data buffer
  100.    for(i=0; i<8; i++)
  101.    {
  102.        sdata[i]=i;
  103.    }
  104.     
  105.    rdata_point = 0;
  106. // Enable interrupts required for this example
  107.    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
  108.    PieCtrlRegs.PIEIER6.bit.INTx5=1;     // Enable PIE Group 6, INT 5
  109.    PieCtrlRegs.PIEIER6.bit.INTx6=1;     // Enable PIE Group 6, INT 6
  110.    IER=0x20;                            // Enable CPU INT6
  111.    EINT;                                // Enable Global Interrupts
  112. // Step 6. IDLE loop. Just sit and loop forever (optional):
  113.    for(;;);
  114.     
  115. }     
  116. // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:    
  117. // Just a long delay loop
  118. void delay_loop()
  119. {
  120.     long      i;
  121.     for (i = 0; i < 1000000; i++) {}
  122. }
  123. void error(void)
  124. {
  125.     asm("     ESTOP0"); // Test failed!! Stop!
  126.     for (;;);
  127. void mcbsp_init()
  128. {
  129. //*************** RESET MCBSP
  130.    McbspaRegs.SPCR2.bit.FRST=0; // Frame Sync generator reset
  131.    McbspaRegs.SPCR2.bit.GRST=0; // Sample Rate generator Reset
  132.    McbspaRegs.SPCR2.bit.XRST=0; // Transmitter reset
  133.    McbspaRegs.SPCR1.bit.RRST=0; // Receiver reset
  134. //*************** Initialise McBSP Registers
  135.    // McBSP register settings for Digital loop back 
  136.    McbspaRegs.SPCR2.all=0x0000; // XRST =0
  137.    McbspaRegs.SPCR1.all=0x8000; // RRST =0, DLB enabled
  138.    McbspaRegs.RCR2.all=0x1321;
  139.    McbspaRegs.RCR1.all=0x0;
  140.    McbspaRegs.XCR2.all=0x1321;
  141.    McbspaRegs.XCR1.all=0x0;
  142.     
  143.    McbspaRegs.SRGR2.all=0x3140;                      
  144.    McbspaRegs.SRGR1.all=0x010f;
  145.    McbspaRegs.MCR2.all=0x0;
  146.    McbspaRegs.MCR1.all=0x0;
  147.    McbspaRegs.PCR.all=0x00a00;
  148.  
  149.    McbspaRegs.MFFTX.all=0x4028;
  150.    McbspaRegs.MFFRX.all=0x0028;
  151.    McbspaRegs.MFFCT.all=0x0000;
  152.    McbspaRegs.MFFINT.all=0x0000;
  153.    McbspaRegs.MFFST.all=0x000;
  154. //************** Enable FIFO
  155.    McbspaRegs.MFFTX.bit.TXFIFO_RESET=1;
  156.    McbspaRegs.MFFRX.bit.RXFIFO_RESET=1;
  157.    
  158. //************* Enable Sample rate generator
  159.    McbspaRegs.SPCR2.bit.GRST=1;
  160.    delay_loop();   
  161. //************ Enable TX/RX unit
  162.    McbspaRegs.SPCR2.bit.XRST=1;
  163.    McbspaRegs.SPCR1.bit.RRST=1;
  164.    
  165. //************ Frame Sync generator reset
  166.    McbspaRegs.SPCR2.bit.FRST=1;    
  167. }  
  168. interrupt void mcbspTxFifoIsr(void)
  169. {
  170.    Uint16 i;
  171.    for(i=0; i<8; i++) 
  172.    {
  173.        McbspaRegs.DXR1.all=sdata[i];
  174.    }
  175. // Increment the send data for the next transmit cycle
  176.    for(i=0; i<8; i++) 
  177.    {
  178.        sdata[i] = sdata[i]+1;
  179.        sdata[i] = sdata[i] & 0x00FF;
  180.    }   
  181.    McbspaRegs.MFFTX.bit.TXFFINT_CLEAR=1;
  182.    PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK
  183. }
  184. interrupt void mcbspRxFifoIsr(void)
  185. {
  186.    Uint16 i;
  187.   
  188.    for(i=0; i<8; i++)
  189.    {
  190.        rdata[i]=McbspaRegs.DRR1.all;
  191.    }
  192.    
  193.    for(i=0; i<8; i++)
  194.    {
  195.       if (rdata[i] != ( (rdata_point+i) & 0x00FF) ) error();
  196.    }                                  
  197.    rdata_point = (rdata_point+1) & 0x00FF;
  198.  
  199.    McbspaRegs.MFFRX.bit.RXFFOVF_CLEAR=1;   // Clear Overflow flag
  200.    McbspaRegs.MFFRX.bit.RXFFINT_CLEAR=1;   // Clear Interrupt flag
  201.    PieCtrlRegs.PIEACK.all|=0x20;     // Issue PIE ack
  202. }
  203. //===========================================================================
  204. // No more.
  205. //===========================================================================