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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE:    Example_281xECanBack2Back.c
  4. //
  5. // TITLE:   DSP281x eCAN Back-to-back transmission and reception in 
  6. //          SELF-TEST mode
  7. //
  8. // ASSUMPTIONS:
  9. //
  10. //          This program requires the DSP281x V1.00 header files.  
  11. //          As supplied, this project is configured for "boot to H0" operation.
  12. //
  13. //          Other then boot mode configuration, no other hardware configuration
  14. //          is required.    
  15. //
  16. // DESCRIPTION:
  17. //
  18. //          This test transmits data back-to-back at high speed without 
  19. //          stopping.
  20. //          The received data is verified. Any error is flagged. 
  21. //          MBX0 transmits to MBX16, MBX1 transmits to MBX17 and so on....
  22. //          This program illustrates the use of self-test mode
  23. //
  24. //###########################################################################
  25. //
  26. //  Ver | dd mmm yyyy | Who  | Description of changes
  27. // =====|=============|======|===============================================
  28. //  1.00| 11 Sep 2003 | L.H. | Original Author H.J.
  29. //      |             |      | Changes since previous version (v.58 Alpha)
  30. //      |             |      | Updated to reflect bit name corrections in 
  31. //      |             |      |    the DSP281x_ECan.h file
  32. //###########################################################################
  33. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  34. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  35. // Prototype statements for functions found within this file.
  36. void mailbox_check(int32 T1, int32 T2, int32 T3);
  37. void mailbox_read(int16 i); 
  38. // Global variable for this example
  39. Uint32  ErrorCount;
  40. Uint32  MessageReceivedCount;
  41. Uint32  TestMbox1 = 0;
  42. Uint32  TestMbox2 = 0;
  43. Uint32  TestMbox3 = 0;
  44. void main(void)
  45. {
  46.     Uint16  j;
  47. // eCAN control registers require read/write access using 32-bits.  Thus we
  48. // will create a set of shadow registers for this example.  These shadow
  49. // registers will be used to make sure the access is 32-bits and not 16.
  50.    struct ECAN_REGS ECanaShadow; 
  51. // Step 1. Initialize System Control:
  52. // PLL, WatchDog, enable Peripheral Clocks
  53. // This example function is found in the DSP281x_SysCtrl.c file.
  54.    InitSysCtrl();
  55. // Step 2. Initalize GPIO: 
  56. // This example function is found in the DSP281x_Gpio.c file and
  57. // illustrates how to set the GPIO to it's default state.
  58. // InitGpio();  // Skipped for this example  
  59. // For this example, configure CAN pins using GPIO regs here
  60.    EALLOW;
  61.    GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;
  62.    GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;
  63.    EDIS;
  64. // Step 3. Clear all interrupts and initialize PIE vector table:
  65. // Disable CPU interrupts 
  66.    DINT;
  67. // Initialize PIE control registers to their default state.
  68. // The default state is all PIE interrupts disabled and flags
  69. // are cleared.  
  70. // This function is found in the DSP281x_PieCtrl.c file.
  71.    InitPieCtrl();
  72. // Disable CPU interrupts and clear all CPU interrupt flags:
  73.    IER = 0x0000;
  74.    IFR = 0x0000;
  75. // Initialize the PIE vector table with pointers to the shell Interrupt 
  76. // Service Routines (ISR).  
  77. // This will populate the entire table, even if the interrupt
  78. // is not used in this example.  This is useful for debug purposes.
  79. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  80. // This function is found in DSP281x_PieVect.c.
  81.    InitPieVectTable();
  82. // Step 4. Initialize all the Device Peripherals:
  83. // This function is found in DSP281x_InitPeripherals.c
  84. // InitPeripherals(); // Not required for this example
  85.  
  86. // Step 5. User specific code, enable interrupts:
  87.     MessageReceivedCount = 0;
  88.     ErrorCount = 0;
  89.     
  90.     // eCAN control registers require 32-bit access. 
  91.     // If you want to write to a single bit, the compiler may break this
  92.     // access into a 16-bit access.  One solution, that is presented here,
  93.     // is to use a shadow register to force the 32-bit access. 
  94.      
  95.     // Read the entire register into a shadow register.  This access
  96.     // will be 32-bits.  Change the desired bit and copy the value back
  97.     // to the eCAN register with a 32-bit write. 
  98.    
  99.     // Configure the eCAN RX and TX pins for eCAN transmissions
  100.     EALLOW;
  101.     ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
  102.     ECanaShadow.CANTIOC.bit.TXFUNC = 1;
  103.     ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
  104.     ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
  105.     ECanaShadow.CANRIOC.bit.RXFUNC = 1;
  106.     ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
  107.     EDIS;
  108.      
  109.     // Disable all Mailboxes
  110.     // Since this write is to the entire register (instead of a bit
  111.     // field) a shadow register is not required.
  112.     ECanaRegs.CANME.all = 0;
  113.     // Mailboxs can be written to 16-bits or 32-bits at a time
  114.     // Write to the MSGID field of TRANSMIT mailboxes MBOX0 - 15 
  115.     ECanaMboxes.MBOX0.MSGID.all = 0x9555AAA0; 
  116.     ECanaMboxes.MBOX1.MSGID.all = 0x9555AAA1; 
  117.     ECanaMboxes.MBOX2.MSGID.all = 0x9555AAA2; 
  118.     ECanaMboxes.MBOX3.MSGID.all = 0x9555AAA3; 
  119.     ECanaMboxes.MBOX4.MSGID.all = 0x9555AAA4; 
  120.     ECanaMboxes.MBOX5.MSGID.all = 0x9555AAA5; 
  121.     ECanaMboxes.MBOX6.MSGID.all = 0x9555AAA6; 
  122.     ECanaMboxes.MBOX7.MSGID.all = 0x9555AAA7; 
  123.     ECanaMboxes.MBOX8.MSGID.all = 0x9555AAA8; 
  124.     ECanaMboxes.MBOX9.MSGID.all = 0x9555AAA9; 
  125.     ECanaMboxes.MBOX10.MSGID.all = 0x9555AAAA; 
  126.     ECanaMboxes.MBOX11.MSGID.all = 0x9555AAAB; 
  127.     ECanaMboxes.MBOX12.MSGID.all = 0x9555AAAC; 
  128.     ECanaMboxes.MBOX13.MSGID.all = 0x9555AAAD; 
  129.     ECanaMboxes.MBOX14.MSGID.all = 0x9555AAAE; 
  130.     ECanaMboxes.MBOX15.MSGID.all = 0x9555AAAF; 
  131.     
  132.     // Write to the MSGID field of RECEIVE mailboxes MBOX16 - 31
  133.     ECanaMboxes.MBOX16.MSGID.all = 0x9555AAA0; 
  134.     ECanaMboxes.MBOX17.MSGID.all = 0x9555AAA1; 
  135.     ECanaMboxes.MBOX18.MSGID.all = 0x9555AAA2; 
  136.     ECanaMboxes.MBOX19.MSGID.all = 0x9555AAA3; 
  137.     ECanaMboxes.MBOX20.MSGID.all = 0x9555AAA4; 
  138.     ECanaMboxes.MBOX21.MSGID.all = 0x9555AAA5; 
  139.     ECanaMboxes.MBOX22.MSGID.all = 0x9555AAA6; 
  140.     ECanaMboxes.MBOX23.MSGID.all = 0x9555AAA7; 
  141.     ECanaMboxes.MBOX24.MSGID.all = 0x9555AAA8; 
  142.     ECanaMboxes.MBOX25.MSGID.all = 0x9555AAA9; 
  143.     ECanaMboxes.MBOX26.MSGID.all = 0x9555AAAA; 
  144.     ECanaMboxes.MBOX27.MSGID.all = 0x9555AAAB; 
  145.     ECanaMboxes.MBOX28.MSGID.all = 0x9555AAAC; 
  146.     ECanaMboxes.MBOX29.MSGID.all = 0x9555AAAD; 
  147.     ECanaMboxes.MBOX30.MSGID.all = 0x9555AAAE; 
  148.     ECanaMboxes.MBOX31.MSGID.all = 0x9555AAAF; 
  149.     // Configure Mailboxes 0-15 as Tx, 16-31 as Rx 
  150.     // Since this write is to the entire register (instead of a bit
  151.     // field) a shadow register is not required.
  152.     ECanaRegs.CANMD.all = 0xFFFF0000; 
  153.     
  154.     // Enable all Mailboxes */
  155.     // Since this write is to the entire register (instead of a bit
  156.     // field) a shadow register is not required.
  157.     ECanaRegs.CANME.all = 0xFFFFFFFF;
  158.     // Specify that 8 bits will be sent/received
  159.     ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
  160.     ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
  161.     ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
  162.     ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
  163.     ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
  164.     ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
  165.     ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
  166.     ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
  167.     ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
  168.     ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
  169.     ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
  170.     ECanaMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
  171.     ECanaMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
  172.     ECanaMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
  173.     ECanaMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
  174.     ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
  175.     
  176.     // No remote frame is requested
  177.     // Since RTR bit is undefined upon reset,
  178.     // it must be initialized to the proper value 
  179.     ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;      
  180.     ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0;  
  181.     ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 0;  
  182.     ECanaMboxes.MBOX3.MSGCTRL.bit.RTR = 0;
  183.     ECanaMboxes.MBOX4.MSGCTRL.bit.RTR = 0;
  184.     ECanaMboxes.MBOX5.MSGCTRL.bit.RTR = 0;
  185.     ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
  186.     ECanaMboxes.MBOX7.MSGCTRL.bit.RTR = 0;
  187.     ECanaMboxes.MBOX8.MSGCTRL.bit.RTR = 0;
  188.     ECanaMboxes.MBOX9.MSGCTRL.bit.RTR = 0;
  189.     ECanaMboxes.MBOX10.MSGCTRL.bit.RTR = 0;
  190.     ECanaMboxes.MBOX11.MSGCTRL.bit.RTR = 0;
  191.     ECanaMboxes.MBOX12.MSGCTRL.bit.RTR = 0;
  192.     ECanaMboxes.MBOX13.MSGCTRL.bit.RTR = 0;
  193.     ECanaMboxes.MBOX14.MSGCTRL.bit.RTR = 0;
  194.     ECanaMboxes.MBOX15.MSGCTRL.bit.RTR = 0;
  195.     
  196.     // Write to the mailbox RAM field of MBOX0 - 15
  197.     ECanaMboxes.MBOX0.MDL.all = 0x9555AAA0;
  198.     ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
  199.     ECanaMboxes.MBOX1.MDL.all = 0x9555AAA1;
  200.     ECanaMboxes.MBOX1.MDH.all = 0x89ABCDEF;
  201.    
  202.     ECanaMboxes.MBOX2.MDL.all = 0x9555AAA2;
  203.     ECanaMboxes.MBOX2.MDH.all = 0x89ABCDEF;
  204.  
  205.     ECanaMboxes.MBOX3.MDL.all = 0x9555AAA3;
  206.     ECanaMboxes.MBOX3.MDH.all = 0x89ABCDEF;
  207.  
  208.     ECanaMboxes.MBOX4.MDL.all = 0x9555AAA4;
  209.     ECanaMboxes.MBOX4.MDH.all = 0x89ABCDEF;
  210.  
  211.     ECanaMboxes.MBOX5.MDL.all = 0x9555AAA5;
  212.     ECanaMboxes.MBOX5.MDH.all = 0x89ABCDEF;
  213.  
  214.     ECanaMboxes.MBOX6.MDL.all = 0x9555AAA6;
  215.     ECanaMboxes.MBOX6.MDH.all = 0x89ABCDEF;
  216.  
  217.     ECanaMboxes.MBOX7.MDL.all = 0x9555AAA7;
  218.     ECanaMboxes.MBOX7.MDH.all = 0x89ABCDEF;
  219.  
  220.     ECanaMboxes.MBOX8.MDL.all = 0x9555AAA8;
  221.     ECanaMboxes.MBOX8.MDH.all = 0x89ABCDEF;
  222.  
  223.     ECanaMboxes.MBOX9.MDL.all = 0x9555AAA9;
  224.     ECanaMboxes.MBOX9.MDH.all = 0x89ABCDEF;
  225.  
  226.     ECanaMboxes.MBOX10.MDL.all = 0x9555AAAA;
  227.     ECanaMboxes.MBOX10.MDH.all = 0x89ABCDEF;
  228.  
  229.     ECanaMboxes.MBOX11.MDL.all = 0x9555AAAB;
  230.     ECanaMboxes.MBOX11.MDH.all = 0x89ABCDEF;
  231.  
  232.     ECanaMboxes.MBOX12.MDL.all = 0x9555AAAC;
  233.     ECanaMboxes.MBOX12.MDH.all = 0x89ABCDEF;
  234.  
  235.     ECanaMboxes.MBOX13.MDL.all = 0x9555AAAD;
  236.     ECanaMboxes.MBOX13.MDH.all = 0x89ABCDEF;
  237.  
  238.     ECanaMboxes.MBOX14.MDL.all = 0x9555AAAE;
  239.     ECanaMboxes.MBOX14.MDH.all = 0x89ABCDEF;
  240.  
  241.     ECanaMboxes.MBOX15.MDL.all = 0x9555AAAF;
  242.     ECanaMboxes.MBOX15.MDH.all = 0x89ABCDEF;
  243.     // Since this write is to the entire register (instead of a bit
  244.     // field) a shadow register is not required. 
  245.     EALLOW;
  246.     ECanaRegs.CANMIM.all = 0xFFFFFFFF;
  247.     // Request permission to change the configuration registers
  248.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  249.     ECanaShadow.CANMC.bit.CCR = 1;            
  250.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  251.     EDIS;
  252.     
  253.     // Wait until the CPU has been granted permission to change the
  254.     // configuration registers
  255.     // Wait for CCE bit to be set..
  256.     do 
  257.     {
  258.       ECanaShadow.CANES.all = ECanaRegs.CANES.all;
  259.     } while(ECanaShadow.CANES.bit.CCE != 1 );  
  260.     
  261.     // Configure the eCAN timing
  262.     EALLOW;
  263.     ECanaShadow.CANBTC.all = ECanaRegs.CANBTC.all;
  264.     ECanaShadow.CANBTC.bit.BRPREG = 9;    // (BRPREG + 1) = 10 feeds a 15 MHz CAN clock
  265.     ECanaShadow.CANBTC.bit.TSEG2REG = 5 ; // to the CAN module. (150 / 10 = 15)
  266.     ECanaShadow.CANBTC.bit.TSEG1REG = 7;  // Bit time = 15
  267.     ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
  268.     
  269.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  270.     ECanaShadow.CANMC.bit.CCR = 0;            
  271.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  272.     EDIS;
  273.     // Wait until the CPU no longer has permission to change the
  274.     // configuration registers
  275.     do
  276.     {
  277.       ECanaShadow.CANES.all = ECanaRegs.CANES.all;
  278.     } while(ECanaShadow.CANES.bit.CCE != 0 ); 
  279.     // Configure the eCAN for self test mode 
  280.     // Enable the enhanced features of the eCAN.
  281.     EALLOW;
  282.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  283.     ECanaShadow.CANMC.bit.STM = 1;    // Configure CAN for self-test mode  
  284.     ECanaShadow.CANMC.bit.SCB = 1;    // eCAN mode (reqd to access 32 mailboxes)
  285.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  286.     EDIS;
  287.     
  288.     // Begin transmitting 
  289.     while(1)                                
  290.     {
  291.      
  292.        ECanaRegs.CANTRS.all = 0x0000FFFF;  // Set TRS for all transmit mailboxes
  293.        while(ECanaRegs.CANTA.all != 0x0000FFFF ) {}  // Wait for all TAn bits to be set..
  294.        ECanaRegs.CANTA.all = 0x0000FFFF;   // Clear all TAn    
  295.        MessageReceivedCount++;
  296.        //Read from Receive mailboxes and begin checking for data */
  297.        for(j=0; j<16; j++)         // Read & check 16 mailboxes
  298.        {
  299.           mailbox_read(j);         // This func reads the indicated mailbox data
  300.           mailbox_check(TestMbox1,TestMbox2,TestMbox3); // Checks the received data
  301.        } 
  302.     }
  303. }
  304. // This function reads out the contents of the indicated 
  305. // by the Mailbox number (MBXnbr).
  306. void mailbox_read(int16 MBXnbr)
  307. {
  308.    volatile struct MBOX *Mailbox;
  309.    Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
  310.    TestMbox1 = Mailbox->MDL.all; // = 0x9555AAAn (n is the MBX number)
  311.    TestMbox2 = Mailbox->MDH.all; // = 0x89ABCDEF (a constant)
  312.    TestMbox3 = Mailbox->MSGID.all;// = 0x9555AAAn (n is the MBX number)
  313. } // MSGID of a rcv MBX is transmitted as the MDL data.
  314. void mailbox_check(int32 T1, int32 T2, int32 T3)
  315. {
  316.     if((T1 != T3) || ( T2 != 0x89ABCDEF))
  317.     {
  318.        ErrorCount++;
  319.     }
  320. }
  321. //===========================================================================
  322. // No more.
  323. //===========================================================================