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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:   Example_281xSpi_FFDLB.c
  4. //
  5. // TITLE:  DSP281x Device Spi Digital Loop Back program. 
  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.  Interrupts are not 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 .... FFFE FFFF
  24. //
  25. // This pattern is repeated forever.  
  26. //
  27. //          Watch Variables:         
  28. //                sdata - sent data
  29. //                rdata - received data
  30. //
  31. ////###########################################################################
  32. //
  33. // Original Author: S.S.
  34. //
  35. //  Ver | dd mmm yyyy | Who  | Description of changes
  36. // =====|=============|======|===============================================
  37. //  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha) 
  38. //      |             |      | Cleaned up the example.
  39. //###########################################################################
  40. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  41. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  42. // Prototype statements for functions found within this file.
  43. // interrupt void ISRTimer2(void);
  44. void delay_loop(void);
  45. void spi_xmit(Uint16 a);
  46. void spi_fifo_init(void);
  47. void spi_init(void);
  48. void error(void);
  49. void main(void)
  50. {
  51.    Uint16 sdata;  // send data
  52.    Uint16 rdata;  // received data
  53.    
  54. // Step 1. Initialize System Control:
  55. // PLL, WatchDog, enable Peripheral Clocks
  56. // This example function is found in the DSP281x_SysCtrl.c file.
  57.    InitSysCtrl();
  58. // Step 2. Initalize GPIO: 
  59. // This example function is found in the DSP281x_Gpio.c file and
  60. // illustrates how to set the GPIO to it's default state.
  61. // InitGpio();  // Skipped for this example  
  62. // Setup only the GP I/O only for SPI functionality
  63.    EALLOW;
  64.    GpioMuxRegs.GPFMUX.all=0x000F; // Select GPIOs to be SPI pins  
  65.   // Port F MUX - x000 0000 0000 1111
  66.    EDIS;
  67. // Step 3. Clear all interrupts and initialize PIE vector table:
  68. // Disable CPU interrupts 
  69.    DINT;
  70. // Initialize PIE control registers to their default state.
  71. // The default state is all PIE interrupts disabled and flags
  72. // are cleared.  
  73. // This function is found in the DSP281x_PieCtrl.c file.
  74.    InitPieCtrl();
  75. // Disable CPU interrupts and clear all CPU interrupt flags:
  76.    IER = 0x0000;
  77.    IFR = 0x0000;
  78.    
  79. // Initialize the PIE vector table with pointers to the shell Interrupt 
  80. // Service Routines (ISR).  
  81. // This will populate the entire table, even if the interrupt
  82. // is not used in this example.  This is useful for debug purposes.
  83. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  84. // This function is found in DSP281x_PieVect.c.
  85.    InitPieVectTable();
  86. // Step 4. Initialize all the Device Peripherals:
  87. // This function is found in DSP281x_InitPeripherals.c
  88. // InitPeripherals(); // Not required for this example
  89.    spi_fifo_init();   // Initialize the Spi FIFO
  90.    spi_init();   // init SPI
  91. // Step 5. User specific code:
  92. // Interrupts are not used in this example. 
  93.    sdata = 0x0000;
  94.    for(;;)
  95.    {    
  96.      // Transmit data
  97.      spi_xmit(sdata);
  98.      // Wait until data is received
  99.      while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } 
  100.      // Check against sent data
  101.      rdata = SpiaRegs.SPIRXBUF;
  102.      if(rdata != sdata) error();
  103.      sdata++;
  104.    }
  105. // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
  106. void delay_loop()
  107. {
  108.     long      i;
  109.     for (i = 0; i < 1000000; i++) {}
  110. }
  111. void error(void)
  112. {
  113.     asm("     ESTOP0"); // Test failed!! Stop!
  114.     for (;;);
  115. }
  116. void spi_init()
  117. {    
  118. SpiaRegs.SPICCR.all =0x000F;              // Reset on, rising edge, 16-bit char bits  
  119. SpiaRegs.SPICTL.all =0x0006;          // Enable master mode, normal phase,
  120.                                                  // enable talk, and SPI int disabled.
  121. SpiaRegs.SPIBRR =0x007F;
  122.     SpiaRegs.SPICCR.all =0x009F;          // Relinquish SPI from Reset   
  123.     SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
  124. }
  125. void spi_xmit(Uint16 a)
  126. {
  127.     SpiaRegs.SPITXBUF=a;
  128. }    
  129. void spi_fifo_init()
  130. {
  131. // Initialize SPI FIFO registers
  132.     SpiaRegs.SPIFFTX.all=0xE040;
  133.     SpiaRegs.SPIFFRX.all=0x204f;
  134.     SpiaRegs.SPIFFCT.all=0x0;
  135. }  
  136. //===========================================================================
  137. // No more.
  138. //===========================================================================