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

DSP编程

开发平台:

C/C++

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