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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE: Example_281xMCBSP_FFDLB.c
  4. //
  5. // TITLE: DSP281x Device McBSP 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. //          Digital loopback tests for the McBSP peripheral.
  18. //
  19. //          Three different serial word sizes can be tested.  
  20. // 
  21. //          Before compiling this project:
  22. //          * Select the serial word size (8/16/32) by using
  23. //            the #define statements at the beginning of the code.
  24. //
  25. //          * Select the FIFO level by using the #define statement 
  26. //            at the beginning of the code. 
  27. //
  28. //          This example does not use interrupts.  Instead a polling method
  29. //          is used to check the level of the receive FIFO.  The incoming
  30. //          data is checked for accuracy.  If an error is found the error()
  31. //          function is called and execution stops. 
  32. //
  33. //          This program will execute until terminated by the user. 
  34. //
  35. //###########################################################################
  36. //
  37. // Original Author: S.S.
  38. // 
  39. //  Ver | dd mmm yyyy | Who  | Description of changes
  40. // =====|=============|======|===============================================
  41. //  1.00| 11 Sep 2003 | L.H. | Major cleanup of the example
  42. //###########################################################################
  43. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  44. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  45. // Define the level of the FIFO 1-16
  46. #define FIFO_LEVEL 1
  47. // Choose a word size.  Uncomment one of the following lines
  48. #define WORD_SIZE    8    // Run a loopback test in 8-bit mode 
  49. //#define WORD_SIZE 16      // Run a loopback test in 16-bit mode 
  50. //#define WORD_SIZE 32        // Run a loopback test in 32-bit mode 
  51. // Prototype statements for functions found within this file.
  52. void delay_loop(void);
  53. void init_mcbsp_dlb(void);
  54. void init_mcbsp_8bit(void);
  55. void init_mcbsp_16bit(void);
  56. void init_mcbsp_32bit(void);
  57. void mcbsp_xmit(int a, int b);
  58. void mcbsp_fifo_init(void);
  59. void error(void);
  60. // Global data for this example
  61. Uint16 sdata1 = 0x000;    // Sent Data
  62. Uint16 rdata1 = 0x000;    // Recieved Data
  63. Uint16 sdata2 = 0x000;    // Sent Data
  64. Uint16 rdata2 = 0x000;    // Recieved Data
  65. Uint16 rdata1_point;
  66. Uint16 rdata2_point;
  67. void main(void)
  68. {
  69.    Uint16 i;
  70. // Step 1. Initialize System Control:
  71. // PLL, WatchDog, enable Peripheral Clocks
  72. // This example function is found in the DSP281x_SysCtrl.c file.
  73.    InitSysCtrl();                            
  74.    
  75. // Step 2. Initalize GPIO: 
  76. // This example function is found in the DSP281x_Gpio.c file and
  77. // illustrates how to set the GPIO to it's default state.
  78. // InitGpio();  // Skipped for this example  
  79. // For this example, only enable the GPIO for McBSP 
  80.    EALLOW;
  81.    GpioMuxRegs.GPFMUX.all=0x7E00;    // Select GPIOs to be McBSP pins     
  82.                                      // Port F MUX - x111 1110 0000 0000
  83.    EDIS;
  84. // Step 3. Clear all interrupts and initialize PIE vector table:
  85. // Disable CPU interrupts 
  86.    DINT;
  87. // Initialize PIE control registers to their default state.
  88. // The default state is all PIE interrupts disabled and flags
  89. // are cleared.  
  90. // This function is found in the DSP281x_PieCtrl.c file.
  91.    InitPieCtrl();
  92.    
  93. // Disable CPU interrupts and clear all CPU interrupt flags:
  94.    IER = 0x0000;
  95.    IFR = 0x0000;
  96. // Initialize the PIE vector table with pointers to the shell Interrupt 
  97. // Service Routines (ISR).  
  98. // This will populate the entire table, even if the interrupt
  99. // is not used in this example.  This is useful for debug purposes.
  100. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  101. // This function is found in DSP281x_PieVect.c.
  102.    InitPieVectTable();
  103. // Step 4. Initialize all the Device Peripherals:
  104. // This function is found in DSP281x_InitPeripherals.c
  105. // InitPeripherals();     // Not required for this example
  106.    mcbsp_fifo_init();     // Initialize the Mcbsp FIFO
  107.    init_mcbsp_dlb();      // Initalize the Mcbsp in loopback test mode
  108.     
  109. // Step 5. User specific code, enable interrupts:
  110.       if(WORD_SIZE == 8)             // Run a loopback test in 8-bit mode     
  111.       {
  112.           init_mcbsp_8bit();
  113.           sdata2 = 0x0000;           // value is a don't care for 8-bit mode
  114.           sdata1 = 0x0000;           // 8-bit value to send
  115.           rdata1_point = sdata1;      
  116.           while(1) 
  117.           {
  118.              for(i = 1; i <= FIFO_LEVEL; i++)
  119.              {
  120.                  mcbsp_xmit(sdata1,sdata2);
  121.                  sdata1++;
  122.                  sdata1 = sdata1 & 0x00FF;                     // Keep it to 8-bits
  123.              } 
  124.              while(McbspaRegs.MFFRX.bit.RXFFST != FIFO_LEVEL ) { }  // Check for receive
  125.              for(i = 1; i <= FIFO_LEVEL; i++)
  126.              {
  127.                  rdata1 = McbspaRegs.DRR1.all;                  // read DRR1 
  128.                  if(rdata1 != rdata1_point) error();
  129.                  rdata1_point++;
  130.                  rdata1_point = rdata1_point & 0x00FF;         // Keep it to 8-bits
  131.              }
  132.              asm("    nop");                                    // Good place for a breakpoint
  133.           }
  134.        }      
  135.           
  136.       if(WORD_SIZE == 16)            // Run a loopback test in 16-bit mode     
  137.       {
  138.           init_mcbsp_16bit();
  139.           sdata2 = 0x0000;           // value is a don't care for 16-bit mode
  140.           sdata1 = 0x0000;           // 16-bit value to send
  141.           rdata1_point = sdata1;      
  142.           while(1) 
  143.           {
  144.              for(i = 1; i <= FIFO_LEVEL; i++)
  145.              {
  146.                  mcbsp_xmit(sdata1,sdata2);
  147.                  sdata1++;
  148.              } 
  149.              while(McbspaRegs.MFFRX.bit.RXFFST != FIFO_LEVEL ) { }  // Check for receive
  150.              for(i = 1; i <= FIFO_LEVEL; i++)
  151.              {
  152.                  rdata1 = McbspaRegs.DRR1.all;                  // read DRR1 
  153.                  if(rdata1 != rdata1_point) error();
  154.                  rdata1_point++;
  155.              }
  156.              asm("    nop");                                    // Good place for a breakpoint
  157.           }
  158.        }      
  159.       if(WORD_SIZE == 32)            // Run a loopback test in 16-bit mode     
  160.       {
  161.           init_mcbsp_32bit();
  162.           sdata1 = 0x0000;
  163.           sdata2 = 0xFFFF;
  164.           rdata1_point = sdata1;
  165.           rdata2_point = sdata2;
  166.           while(1)
  167.           {
  168.              for(i = 1; i <= FIFO_LEVEL; i++)
  169.              {
  170.                  mcbsp_xmit(sdata1,sdata2);
  171.                  sdata1++;
  172.                  sdata2--;
  173.              }           
  174.              while(McbspaRegs.MFFRX.bit.RXFFST != FIFO_LEVEL ) { }  // Check for receive
  175.              for(i = 1; i <= FIFO_LEVEL; i++)
  176.              {
  177.                  rdata2 = McbspaRegs.DRR2.all;
  178.                  rdata1 = McbspaRegs.DRR1.all;                  
  179.                  if(rdata1 != rdata1_point) error();
  180.                  if(rdata2 != rdata2_point) error();
  181.                  rdata1_point++;
  182.                  rdata2_point--;
  183.              }
  184.              asm("    nop");                                    // Good place for a breakpoint
  185.           
  186.            }         
  187.        }
  188. }     
  189. // Some Useful local functions
  190. void delay_loop()
  191. {
  192.     long      i;
  193.     for (i = 0; i < 1000000; i++) {}
  194. }
  195. void error(void)
  196. {
  197.     asm("     ESTOP0");  // test failed!! Stop!
  198.     for (;;);
  199. }
  200. void init_mcbsp_dlb()
  201. {
  202.     // McBSP register settings for Digital loop back 
  203.     McbspaRegs.SPCR2.all=0x0000;
  204.     McbspaRegs.SPCR1.all=0x8000;
  205.     McbspaRegs.RCR2.all=0x0;
  206.     McbspaRegs.RCR1.all=0x0;
  207.     McbspaRegs.XCR2.all=0x0;
  208.     McbspaRegs.XCR1.all=0x0;
  209.     McbspaRegs.SRGR2.all=0x200f;                      
  210.     McbspaRegs.SRGR1.all=0x0001;
  211.     McbspaRegs.MCR2.all=0x0;
  212.     McbspaRegs.MCR1.all=0x0;
  213.     McbspaRegs.PCR.all=0x00a00;
  214. }
  215. void init_mcbsp_8bit()
  216. {    
  217.     McbspaRegs.SPCR1.bit.RJUST=0;      // Right justify word 
  218.     McbspaRegs.RCR2.bit.RCOMPAND=0;    // R/XCOMPAND with ulaw
  219.     McbspaRegs.XCR2.bit.XCOMPAND=0;    // R/XCOMPAND with ulaw
  220.     McbspaRegs.RCR1.bit.RWDLEN1=0;     // 8-bit word
  221.     McbspaRegs.XCR1.bit.XWDLEN1=0;     // 8-bit word    
  222.     McbspaRegs.SPCR2.bit.XRST=1;       // enable XRST/RRST
  223.     McbspaRegs.SPCR1.bit.RRST=1;
  224.     delay_loop();   
  225.     McbspaRegs.SPCR2.all |=0x00C0;     // Only enable FRST,GRST 
  226. }
  227. void init_mcbsp_16bit()
  228. {
  229.     McbspaRegs.SPCR1.bit.RJUST=0;       // word Rjustifed 
  230.     McbspaRegs.RCR2.bit.RCOMPAND=00;    // No R/XCOMPAND 
  231.     McbspaRegs.XCR2.bit.XCOMPAND=00; 
  232.     McbspaRegs.RCR1.bit.RWDLEN1=2;      // 16-bit word
  233.     McbspaRegs.XCR1.bit.XWDLEN1=2;      // 16-bit word
  234.     McbspaRegs.SPCR2.bit.XRST=1;        // enable XRST/RRST
  235.     McbspaRegs.SPCR1.bit.RRST=1;
  236.     delay_loop();   
  237.     McbspaRegs.SPCR2.all |=0x00C0;      // Only enable FRST,GRST 
  238. }
  239. void init_mcbsp_32bit()
  240. {
  241.     McbspaRegs.SPCR1.bit.RJUST =0;     // Right justifed 
  242.     McbspaRegs.RCR2.bit.RCOMPAND =00;  // No R/XCOMPAND 
  243.     McbspaRegs.XCR2.bit.XCOMPAND =00; 
  244.     McbspaRegs.RCR1.bit.RWDLEN1=5;     // 32-bit word
  245.     McbspaRegs.XCR1.bit.XWDLEN1=5;     // 32-bit word
  246.     
  247.  //  McBSP Reset to enable 
  248.     McbspaRegs.SPCR2.bit.XRST =1;      // enable XRST/RRST
  249.     McbspaRegs.SPCR1.bit.RRST=1;
  250.     delay_loop();   
  251.     McbspaRegs.SPCR2.all |=0x00C0;     // Only enable FRST,GRST used after 
  252. }
  253. void mcbsp_xmit(int a, int b)
  254. {
  255.     McbspaRegs.DXR2.all=b;
  256.     McbspaRegs.DXR1.all=a;
  257. }
  258. void mcbsp_fifo_init()                                        
  259. {
  260.     McbspaRegs.MFFTX.all=0x0000;
  261.     McbspaRegs.MFFRX.all=0x001F;
  262.     McbspaRegs.MFFCT.all=0x0;
  263.     McbspaRegs.MFFINT.all=0x0;
  264.     McbspaRegs.MFFST.all=0x0;  
  265.     McbspaRegs.MFFTX.bit.MFFENA=1;         // Enable FIFO
  266.     McbspaRegs.MFFTX.bit.TXFIFO_RESET=1;  // Enable Transmit channel
  267.     McbspaRegs.MFFRX.bit.RXFIFO_RESET=1;  // Enable Receive channel
  268.       
  269.     
  270. }  
  271. //===========================================================================
  272. // No more.
  273. //===========================================================================