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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:  Example_281xGpio.c
  4. //
  5. // TITLE: DSP281x GPIO Loopback Test
  6. //
  7. //
  8. //        This program requires the DSP281x V1.00 header files.  
  9. //        As supplied, this project is configured for "boot to H0" operation. 
  10. //
  11. //        To work properly this test requires hardware configuration described
  12. //        below.
  13. //
  14. //        In this test, 8 bits of a GPIO Port are configured as outputs
  15. //        and 8 bits of the same port are configured as inputs. The pins 
  16. //        configured as outputs need to be externally looped back to the
  17. //        pins configured as inputs. The output data is read back on the 
  18. //        input pins. These tests are repeated for various qualifier 
  19. //        values and for GPIO ports A, B and F.
  20. //
  21. //        Similar tests could be written for GPIO ports D, E and G.
  22. //        Tests for ports A, D and F are called by separate functions
  23. //        An external loopback has to be established before a testcase for 
  24. //        a given port is executed.
  25. //        Refer to the .ebss space for global variables for test status 
  26. //        If PASS_flag = 0xDOBE then all tests have passed.
  27. //        If PASS_flag = 0xDEAD then some tests have failed.
  28. //        Tests are self validating. If a test passes, Test_status array 
  29. //        will have Test code 0x00xx. If this array has 0xDEAD, the test 
  30. //        has failed.
  31. // Test #1: 
  32. // Configure Upper 8 bits of Port A as outputs and lower 8 bits as inputs
  33. // Loop back bits [15:8] to bits [7:0]
  34. // Input Qualifier = 0 (Don't set any input qualifier)
  35. // Needs a delay between CLEAR/SET/TOGGLE instruction.
  36. // This test is run 4 times.
  37. // Test #2: 
  38. // Configure Upper 8 bits of Port A as inputs and lower 8 bits as outputs
  39. // Loop back bits [7:0] to bits [15:8]
  40. // Input Qualifier = 0 (Don't set any input qualifier)
  41. // Needs a delay between CLEAR/SET/TOGGLE instruction.
  42. // This test is run 4 times.
  43. // Test #3: 
  44. // Configure Upper 8 bits of Port A as outputs and lower 8 bits as inputs
  45. // Loop back bits [15:8] to bits [7:0]
  46. // Input Qualifier, QUALVAL = 1 
  47. // Needs a delay between CLEAR/SET/TOGGLE instruction.
  48. // For a pass, the delay must be >= ( 6 * 2 * QUALVAL ) CPUCLK cycles
  49. // i.e the delay must be >= 12 CPUCLK cycles
  50. // This test is run 4 times.
  51. // Test #4: 
  52. // Configure Upper 8 bits of Port B as outputs and lower 8 bits as inputs
  53. // Loop back bits [15:8] to bits [7:0]
  54. // Input Qualifier,  QUALVAL = 2
  55. // Needs a delay between CLEAR/SET/TOGGLE instruction.
  56. // For a pass, the delay must be >= 24 CPUCLK cycles
  57. // This test is run 4 times.
  58. // Test #5: 
  59. // Configure Upper 7 bits of Port F as outputs and lower 8 bits as inputs
  60. // Loop back bits [14:8] to bits [6:0], also loopback bit 8 to bit 7
  61. // Needs a delay between CLEAR/SET/TOGGLE instruction.
  62. // This test is run 4 times.
  63. //###########################################################################
  64. //
  65. // Original Author: T.N.P
  66. //
  67. //  Ver | dd mmm yyyy | Who  | Description of changes
  68. // =====|=============|======|===============================================
  69. //  1.00| 11 Sep 2003 | L.H. | No change since previous version (v.58 Alpha)
  70. //###########################################################################
  71. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  72. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  73. // Prototype statements for functions found within this file.
  74. void delay_loop(void);
  75. void Gpio_select(void);
  76. void error(int);
  77. void program_stop();
  78. void Gpio_PortA(void);
  79. void Gpio_PortB(void);
  80. void Gpio_PortF(void);
  81. void Gpio_PortDEG(void);
  82. Uint16 var1 = 0;
  83. Uint16 var2 = 0;
  84. Uint16 var3 = 0;
  85. Uint16 test_count = 0;
  86. Uint16 Test_flag = 0;
  87. Uint16 Test_var  = 0;
  88. Uint16 Test_status[32];
  89. Uint16 PASS_flag = 0;
  90. void main(void)
  91. {
  92. // Step 1. Initialize System Control registers, PLL, WatchDog, 
  93. // peripheral Clocks to default state:
  94. // This function is found in the DSP281x_SysCtrl.c file.
  95.    InitSysCtrl();
  96. // Step 2. Initalize GPIO: 
  97. // This example function is found in the DSP281x_Gpio.c file and
  98. // illustrates how to set the GPIO to it's default state.
  99. // InitGpio();  // Skipped for this example  
  100. // Step 3. Clear all interrupts and initialize PIE vector table:
  101. // Disable CPU interrupts 
  102.    DINT;
  103. // Initialize PIE control registers to their default state.
  104. // The default state is all PIE interrupts disabled and flags
  105. // are cleared.  
  106. // This function is found in the DSP281x_PieCtrl.c file.
  107.    InitPieCtrl();
  108. // Disable CPU interrupts and clear all CPU interrupt flags:
  109.    IER = 0x0000;
  110.    IFR = 0x0000;
  111. // Initialize the PIE vector table with pointers to the shell Interrupt 
  112. // Service Routines (ISR).  
  113. // This will populate the entire table, even if the interrupt
  114. // is not used in this example.  This is useful for debug purposes.
  115. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  116. // This function is found in DSP281x_PieVect.c.
  117.    InitPieVectTable();
  118.    
  119. // Step 4. Initialize all the Device Peripherals:
  120. // This function is found in DSP281x_InitPeripherals.c
  121. // InitPeripherals(); // Not required for this example
  122. // Step 5. User specific code 
  123.    // Tests #1, #2, #3
  124.    Gpio_PortA();
  125.     
  126.    // Test #4
  127.    Gpio_PortB();
  128.     
  129.    // Test #5
  130.    Gpio_PortF();
  131.    program_stop();
  132.     
  133. // Step 6. IDLE loop. Just sit and loop forever (optional):    
  134. //    for(;;);
  135.      
  136. }
  137. // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions:
  138. void Gpio_PortA(void)
  139. {    
  140.     
  141. // GPIO Test #1: 
  142. // Configure Upper 8 bits of Port A as outputs and lower 8 bits as inputs    
  143. // Loop back bits [15:8] to bits [7:0]
  144. // Don't set any input qualifier
  145.  
  146.     var1= 0x0000;        // sets GPIO Muxs as I/Os
  147.     var2= 0xFF00;        // sets GPIO 15-8 DIR as outputs, 7-0 DIR as inputs
  148.     var3= 0x0000;        // Don't set any input qualifier
  149.     
  150.     Gpio_select();    
  151.     
  152.     test_count = 0;
  153.     Test_status[Test_var] = 0x0001;
  154.     Test_var++;
  155.     
  156.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  157.                                          // to "PASSED"
  158.         
  159.     while (test_count < 4)               // repeat the tests 4 times
  160.     {
  161.        GpioDataRegs.GPACLEAR.all = 0xFF00;  // Test Clear
  162.        asm(" RPT #5 ||NOP");                         
  163.        Test_flag = GpioDataRegs.GPADAT.all;
  164.     
  165.        if ( Test_flag != 0x0000 ) error(1);
  166.     
  167.        GpioDataRegs.GPASET.all = 0x5500;    // Test Set
  168.        asm(" RPT #5 ||NOP");                         
  169.        Test_flag = GpioDataRegs.GPADAT.all;
  170.     
  171.        if ( Test_flag != 0x5555 ) error(1);
  172.     
  173.        GpioDataRegs.GPATOGGLE.all = 0xFF00; // Test Toggle 
  174.        asm(" RPT #5 ||NOP");
  175.        Test_flag = GpioDataRegs.GPADAT.all;
  176.     
  177.        if ( Test_flag != 0xAAAA ) error(1);
  178.     
  179.        test_count++;
  180.     
  181.     }
  182.     Test_var++;
  183.     
  184. // End of Test #1
  185. // GPIO Test #2: 
  186. // Configure Upper 8 bits of Port as inputs and lower 8 bits as outputs    
  187. // Loop back bits [7:0] to bits [15:8]
  188. // Don't set any input qualifier
  189.  
  190.     var1= 0x0000;       // sets GPIO Muxs as I/Os
  191.     var2= 0x00FF;       // sets GPIO 15-8 DIR as inputs, 7-0 DIR as outputs
  192.     var3= 0x0000;       // Don't set any input qualifier
  193.     
  194.     Gpio_select();    
  195.     
  196.     test_count = 0;
  197.     Test_status[Test_var] = 0x0002;
  198.     Test_var++;
  199.     
  200.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  201.                                          // to "PASSED"
  202.         
  203.     while (test_count < 4)               // repeat the tests 4 times
  204.     {
  205.        GpioDataRegs.GPACLEAR.all = 0x00FF;  // Test Clear
  206.        asm(" RPT #5 ||NOP");                         
  207.        Test_flag = GpioDataRegs.GPADAT.all;
  208.     
  209.        if ( Test_flag != 0x0000 ) error(1);
  210.     
  211.        GpioDataRegs.GPASET.all = 0x00AA;    // Test Set
  212.        asm(" RPT #5 ||NOP");                         
  213.        Test_flag = GpioDataRegs.GPADAT.all;
  214.     
  215.        if ( Test_flag != 0xAAAA ) error(1);
  216.     
  217.        GpioDataRegs.GPATOGGLE.all = 0x0055; // Test Toggle 
  218.        asm(" RPT #5 ||NOP");
  219.        Test_flag = GpioDataRegs.GPADAT.all;
  220.     
  221.        if ( Test_flag != 0xFFFF ) error(1);
  222.     
  223.        test_count++;
  224.     
  225.     }
  226.     
  227.     Test_var++;
  228.     
  229. // End of Test #2
  230. // GPIO Test #3: 
  231. // Configure Upper 8 bits of Port as outputs and lower 8 bits as inputs    
  232. // Loop back bits [15:8] to bits [7:0]
  233. // Set input qualifier to 0x0001
  234.  
  235.     var1= 0x0000;        // sets GPIO Muxs as I/Os
  236.     var2= 0xFF00;        // sets GPIO 15-8 DIR as outputs, 7-0 as inputs.
  237.     var3= 0x0001;        // Set input qualifier to 1
  238.         
  239.     Gpio_select();
  240.     
  241. // Test #3A: Set delay so that the input gets rejected.
  242. // delay must be < ( 6 * 2 * QUALVAL ) CPUCLK cycles
  243.     
  244.     Test_status[Test_var] = 0x0003;
  245.     Test_var++;
  246.     
  247.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  248.                                          // to "PASSED"
  249.     test_count = 0;
  250.                                         
  251.     while (test_count < 4)               // repeat the tests 4 times
  252.     {
  253.        GpioDataRegs.GPBSET.all = 0xFF00;
  254.        delay_loop();
  255.        GpioDataRegs.GPACLEAR.all = 0xFF00;  // Test Clear
  256.        asm (" RPT #14 || NOP");             // Delay < ( 6 * 2 ) CPUCLK cycles
  257.        Test_flag = GpioDataRegs.GPADAT.all;
  258.        if ( Test_flag == 0x0000 ) error(1);
  259.                             
  260.        GpioDataRegs.GPASET.all = 0x5500;    // Test Set
  261.        asm(" RPT #14 ||NOP");                         
  262.        Test_flag = GpioDataRegs.GPADAT.all;
  263.        if ( Test_flag == 0x5555 ) error(1);
  264.     
  265.        GpioDataRegs.GPATOGGLE.all = 0xFF00; // Test Toggle 
  266.        asm(" RPT #14 ||NOP");
  267.        Test_flag = GpioDataRegs.GPADAT.all;
  268.        if ( Test_flag == 0xAAAA ) error(1);
  269.     
  270.        test_count++; 
  271.     
  272.     }
  273.     
  274.     Test_var++;
  275.     
  276. // Test #3B: Set delay so that the input is qualified successfully 
  277. // delay must be >= ( 6 * 2 * QUALVAL ) CPUCLK cycles
  278.     Test_status[Test_var] = 0x0004;
  279.     Test_var++;
  280.     
  281.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  282.                                          // to "PASSED"
  283.     test_count = 0;
  284.                                         
  285.     while (test_count < 4)               // repeat the tests 4 times
  286.     {
  287.        GpioDataRegs.GPASET.all = 0xFF00;
  288.        delay_loop();
  289.        GpioDataRegs.GPACLEAR.all = 0xFF00;  // Test Clear    
  290.        asm (" RPT #16 || NOP");             // Delay = (6 * 2 * 1) CPUCLK cycles
  291.        Test_flag = GpioDataRegs.GPADAT.all;
  292.        if ( Test_flag != 0x0000 ) error(1);
  293.                             
  294.        GpioDataRegs.GPASET.all = 0x5500;    // Test Set
  295.        asm(" RPT #16 ||NOP");                         
  296.        Test_flag = GpioDataRegs.GPADAT.all;
  297.        if ( Test_flag != 0x5555 ) error(1);
  298.     
  299.        GpioDataRegs.GPATOGGLE.all = 0xFF00; // Test Toggle 
  300.        asm(" RPT #16 ||NOP");
  301.        Test_flag = GpioDataRegs.GPADAT.all;
  302.        if ( Test_flag != 0xAAAA ) error(1);
  303.     
  304.        test_count++; 
  305.     
  306.     }
  307.     
  308.     Test_var++;    
  309. } // End of Test #3
  310. void Gpio_PortB(void)
  311. {
  312. // GPIO Test #4: 
  313. // Configure Upper 8 bits of Port B as outputs and lower 8 bits as inputs    
  314. // Loop back bits [15:8] to bits [7:0]
  315. // Set input qualifier to 0x0002
  316.  
  317.     var1= 0x0000;        // sets GPIO Muxs as I/Os
  318.     var2= 0xFF00;        // sets GPIO 15-8 DIR as outputs, 7-0 as inputs.
  319.     var3= 0x0002;        // Set input qualifier to 2
  320.         
  321.     Gpio_select();
  322.     
  323. // Test #4A: Set delay so that the input gets rejected.    
  324. // Delay must be < ( 6 * 2 * QUALVAL ) CPUCLK cycles
  325.     Test_status[Test_var] = 0x0005;
  326.     Test_var++;
  327.     
  328.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  329.                                          // to "PASSED"
  330.     test_count = 0;
  331.                                         
  332.     while (test_count < 4)               // repeat the tests 4 times
  333.     {
  334.        GpioDataRegs.GPBSET.all = 0xFF00;
  335.        delay_loop();
  336.        GpioDataRegs.GPBCLEAR.all = 0xFF00;  // Test Clear    
  337.        asm (" RPT #24 || NOP");             // Delay < (6 * 2 * 2) CPUCLK cycles
  338.        Test_flag = GpioDataRegs.GPBDAT.all;
  339.        if ( Test_flag == 0x0000 ) error(1);
  340.                             
  341.        GpioDataRegs.GPBSET.all = 0x5500;    // Test Set
  342.        asm(" RPT #24 ||NOP");                         
  343.        Test_flag = GpioDataRegs.GPBDAT.all;
  344.        if ( Test_flag == 0x5555 ) error(1);
  345.     
  346.        GpioDataRegs.GPBTOGGLE.all = 0xFF00; // Test Toggle 
  347.        asm(" RPT #24 ||NOP");
  348.        Test_flag = GpioDataRegs.GPBDAT.all;
  349.        if ( Test_flag == 0xAAAA ) error(1);
  350.     
  351.        test_count++; 
  352.     
  353.     }
  354.     
  355.     Test_var++;
  356.     
  357. // Test #4B: Set delay so that the input is qualified successfully 
  358. // Delay must be >= ( 6 * 2 * QUALVAL ) CPUCLK cycles
  359.     Test_status[Test_var] = 0x0006;
  360.     Test_var++;
  361.     
  362.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  363.                                          // to "PASSED"
  364.     test_count = 0;
  365.                                         
  366.     while (test_count < 4)               // repeat the tests 4 times
  367.     {
  368.        GpioDataRegs.GPBSET.all = 0xFF00;
  369.        delay_loop();
  370.        GpioDataRegs.GPBCLEAR.all = 0xFF00;  // Test Clear    
  371.        asm (" RPT #29 || NOP");             // Delay = (6 * 2 * 2) CPUCLK cycles
  372.        Test_flag = GpioDataRegs.GPBDAT.all;
  373.        if ( Test_flag != 0x0000 ) error(1);
  374.                             
  375.        GpioDataRegs.GPBSET.all = 0x5500;    // Test Set
  376.        asm(" RPT #29 ||NOP");                         
  377.        Test_flag = GpioDataRegs.GPBDAT.all;
  378.        if ( Test_flag != 0x5555 ) error(1);
  379.     
  380.        GpioDataRegs.GPBTOGGLE.all = 0xFF00; // Test Toggle 
  381.        asm(" RPT #29 ||NOP");
  382.        Test_flag = GpioDataRegs.GPBDAT.all;
  383.        if ( Test_flag != 0xAAAA ) error(1);
  384.     
  385.        test_count++; 
  386.     
  387.     } 
  388.     Test_var++;    
  389. } // End of Test #4
  390. void Gpio_PortF(void)
  391. {
  392. // GPIO Test #5: 
  393. // Configure Upper bits [14:8] of Port F as outputs and bits [7:0] as inputs    
  394. // Loop back bits [14:8] to bits [6:0], also loopback bit #8, to bit #7
  395.  
  396.     var1= 0x0000;        // sets GPIO Muxs as I/Os
  397.     var2= 0xFF00;        // sets GPIO 14-8 DIR as outputs, 7-0 as inputs.
  398.         
  399.     Gpio_select();
  400.     
  401.     Test_status[Test_var] = 0x0007;
  402.     Test_var++;
  403.     
  404.     Test_status[Test_var] = 0xD0BE;      // Set the default value of status 
  405.                                          // to "PASSED"
  406.     test_count = 0;
  407.                                         
  408.     while (test_count < 4)                  // repeat the tests 4 times
  409.     {
  410.        GpioDataRegs.GPFSET.all = 0xFF00;
  411.        delay_loop();
  412.        GpioDataRegs.GPFCLEAR.all = 0xFF00;  // Test Clear    
  413.        asm (" RPT #6 || NOP");             
  414.        Test_flag = GpioDataRegs.GPFDAT.all;
  415.        if ( Test_flag != 0x0000 ) error(1);
  416.                             
  417.        GpioDataRegs.GPFSET.all = 0x5500;    // Test Set
  418.        asm(" RPT #6 || NOP");                         
  419.        Test_flag = GpioDataRegs.GPFDAT.all;
  420.        if ( Test_flag != 0x55D5 ) error(1);
  421.     
  422.        GpioDataRegs.GPFTOGGLE.all = 0xFF00; // Test Toggle 
  423.        asm(" RPT #6 || NOP");
  424.        Test_flag = GpioDataRegs.GPFDAT.all;
  425.        if ( Test_flag != 0x2A2A ) error(1); 
  426.      
  427.        test_count++; 
  428.     
  429.     }
  430.     
  431.     Test_var++;
  432.     
  433. } // End of Test #5
  434. void delay_loop()
  435. {
  436.     short      i;
  437.     for (i = 0; i < 1000; i++) {}
  438. }
  439. void Gpio_select(void)
  440. {
  441.      EALLOW;
  442.      
  443.     GpioMuxRegs.GPAMUX.all=var1;   // Configure MUXs as digital I/Os or
  444.     GpioMuxRegs.GPBMUX.all=var1;   // peripheral I/Os
  445.     GpioMuxRegs.GPDMUX.all=var1;
  446.     GpioMuxRegs.GPFMUX.all=var1;         
  447.     GpioMuxRegs.GPEMUX.all=var1; 
  448.     GpioMuxRegs.GPGMUX.all=var1;
  449.                                         
  450.     GpioMuxRegs.GPADIR.all=var2;   // GPIO PORTs  as output
  451.     GpioMuxRegs.GPBDIR.all=var2;   // GPIO DIR select GPIOs as output 
  452.     GpioMuxRegs.GPDDIR.all=var2;
  453.     GpioMuxRegs.GPEDIR.all=var2;        
  454.     GpioMuxRegs.GPFDIR.all=var2; 
  455.     GpioMuxRegs.GPGDIR.all=var2;
  456.     GpioMuxRegs.GPAQUAL.all=var3;  // Set GPIO input qualifier values
  457.     GpioMuxRegs.GPBQUAL.all=var3;   
  458.     GpioMuxRegs.GPDQUAL.all=var3;
  459.     GpioMuxRegs.GPEQUAL.all=var3;
  460.  
  461.     EDIS;
  462.      
  463. }     
  464. void error (int ErrorFlag)
  465. {
  466.    PASS_flag = 0xDEAD;               // Test case failed
  467.    Test_status[Test_var] = 0xDEAD;   // Sub-test failed
  468.    return;
  469. }
  470. void program_stop()
  471. {
  472. //All tests are done */    
  473.   if(PASS_flag !=0) 
  474.        PASS_flag=0xDEAD;          // Test code exit here..
  475.   else
  476.        PASS_flag=0xD0BE;          // Test code exit he    
  477. // end all tests      
  478.    asm("     ESTOP0");            // Done!
  479.    for(;;)     { }                // Dummy loop Wait forever
  480. }
  481. //===========================================================================
  482. // No more.
  483. //===========================================================================