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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xSpi_FFDLB_int.c
  4. //
  5. // TITLE:  DSP281x Device Spi 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 SPI example that uses the internal loopback of
  18. // the peripheral.  Both interrupts and the SPI 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. // 0000 0001 0002 0003 0004 0005 0006 0007
  24. // 0001 0002 0003 0004 0005 0006 0007 0008
  25. // 0002 0003 0004 0005 0006 0007 0008 0009 
  26. // ....
  27. // FFFE FFFF 0000 0001 0002 0003 0004 0005
  28. // FFFF 0000 0001 0002 0003 0004 0005 0006
  29. // etc..
  30. //
  31. // This pattern is repeated forever.  
  32. //
  33. //
  34. // Watch Variables:
  35. //     sdata[8]    - Data to send
  36. //     rdata[8]    - Received data
  37. //     rdata_point - Used to keep track of the last position in 
  38. //                   the receive stream for error checking 
  39. //###########################################################################
  40. //  
  41. // Original Source by S.D.
  42. //
  43. //  Ver | dd mmm yyyy | Who  | Description of changes
  44. // =====|=============|======|===============================================
  45. //  1.00| 11 Sep 2003 | L.H. | Initial Release
  46. //###########################################################################
  47. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  48. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  49. // Prototype statements for functions found within this file.
  50. // interrupt void ISRTimer2(void);
  51. interrupt void spiTxFifoIsr(void);
  52. interrupt void spiRxFifoIsr(void);
  53. void delay_loop(void);
  54. void spi_fifo_init(void);
  55. void error();
  56. Uint16 sdata[8];     // Send data buffer
  57. Uint16 rdata[8];     // Receive data buffer
  58. Uint16 rdata_point;  // Keep track of where we are 
  59.                      // in the data stream to check received data
  60.                      
  61. void main(void)
  62. {
  63.    Uint16 i;   
  64.       
  65. // Step 1. Initialize System Control:
  66. // PLL, WatchDog, enable Peripheral Clocks
  67. // This example function is found in the DSP281x_SysCtrl.c file.
  68.    InitSysCtrl();
  69. // Step 2. Initalize GPIO: 
  70. // This example function is found in the DSP281x_Gpio.c file and
  71. // illustrates how to set the GPIO to it's default state.
  72. // InitGpio();  // Skipped for this example  
  73. // Setup only the GP I/O only for SPI functionality
  74.    EALLOW;
  75.    GpioMuxRegs.GPFMUX.all=0x000F; // Select GPIOs to be SPI pins  
  76.                                     // Port F MUX - x000 0000 0000 1111
  77.    EDIS;
  78. // Step 3. Initialize PIE vector table:
  79. // Disable and clear all CPU interrupts
  80.    DINT;
  81.    IER = 0x0000;
  82.    IFR = 0x0000;
  83. // Initialize PIE control registers to their default state:
  84. // This function is found in the DSP281x_PieCtrl.c file.
  85.    InitPieCtrl();
  86. // Initialize the PIE vector table with pointers to the shell Interrupt 
  87. // Service Routines (ISR).  
  88. // This will populate the entire table, even if the interrupt
  89. // is not used in this example.  This is useful for debug purposes.
  90. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  91. // This function is found in DSP281x_PieVect.c.
  92.    InitPieVectTable();
  93. // Interrupts that are used in this example are re-mapped to
  94. // ISR functions found within this file.  
  95.    EALLOW; // This is needed to write to EALLOW protected registers
  96.    PieVectTable.SPIRXINTA = &spiRxFifoIsr;
  97.    PieVectTable.SPITXINTA = &spiTxFifoIsr;
  98.    EDIS;   // This is needed to disable write to EALLOW protected registers
  99. // Step 4. Initialize all the Device Peripherals:
  100. // This function is found in DSP281x_InitPeripherals.c
  101. // InitPeripherals(); // Not required for this example
  102.    spi_fifo_init();   // Initialize the SPI only
  103. // Step 5. User specific code, enable interrupts:
  104. // Initalize the send data buffer
  105.    for(i=0; i<8; i++)
  106.    {
  107.       sdata[i] = i;
  108.    }      
  109.    rdata_point = 0;
  110. // Enable interrupts required for this example
  111.    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
  112.    PieCtrlRegs.PIEIER6.bit.INTx1=1;     // Enable PIE Group 6, INT 1
  113.    PieCtrlRegs.PIEIER6.bit.INTx2=1;     // Enable PIE Group 6, INT 2
  114.    IER=0x20;                            // Enable CPU INT6
  115.    EINT;                                // Enable Global Interrupts
  116. // Step 6. IDLE loop. Just sit and loop forever (optional):
  117. for(;;);
  118. // Some Useful local functions
  119. void delay_loop()
  120. {
  121.     long      i;
  122.     for (i = 0; i < 1000000; i++) {}
  123. }
  124. void error(void)
  125. {
  126.     asm("     ESTOP0");  //Test failed!! Stop!
  127.     for (;;);
  128. }
  129. void spi_fifo_init()
  130. {
  131. // Initialize SPI FIFO registers
  132.    SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SCI
  133.    SpiaRegs.SPICCR.all=0x001F;       //16-bit character, Loopback mode 
  134.    SpiaRegs.SPICTL.all=0x0017;       //Interrupt enabled, Master/Slave XMIT enabled
  135.    SpiaRegs.SPISTS.all=0x0000;
  136.    SpiaRegs.SPIBRR=0x0063;           // Baud rate
  137.    SpiaRegs.SPIFFTX.all=0xC028;      // Enable FIFO's, set TX FIFO level to 8
  138.    SpiaRegs.SPIFFRX.all=0x0028;      // Set RX FIFO level to 31
  139.    SpiaRegs.SPIFFCT.all=0x00;
  140.    SpiaRegs.SPIPRI.all=0x0010;
  141.     
  142.    SpiaRegs.SPICCR.bit.SPISWRESET=1;  // Enable SCI
  143.    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
  144.    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
  145. }
  146. interrupt void spiTxFifoIsr(void)
  147. {
  148.   Uint16 i;
  149.     for(i=0;i<8;i++)
  150.     {
  151.      SpiaRegs.SPITXBUF=sdata[i];      // Send data
  152.     }
  153.     for(i=0;i<8;i++)                    // Increment data for next cycle
  154.     {
  155.      sdata[i]++;       
  156.     }
  157.     
  158.     SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
  159. PieCtrlRegs.PIEACK.all|=0x20;   // Issue PIE ACK
  160. }
  161. interrupt void spiRxFifoIsr(void)
  162. {      
  163.     Uint16 i;
  164.     for(i=0;i<8;i++)
  165.     {
  166.     rdata[i]=SpiaRegs.SPIRXBUF; // Read data
  167. }
  168. for(i=0;i<8;i++)                    // Check received data
  169. {
  170.     if(rdata[i] != rdata_point+i) error();
  171. }
  172. rdata_point++;
  173. SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
  174. SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
  175. PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
  176. }
  177.   
  178. //===========================================================================
  179. // No more.
  180. //===========================================================================