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

DSP编程

开发平台:

C/C++

  1. //###########################################################################
  2. //
  3. // FILE: Example_281xSci_Autobaud_.c
  4. //
  5. // TITLE: DSP281x SCI Autobaud detect example 
  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. //          Test requires the following hardware connections:
  13. //          
  14. //          SCIATX <-> SCIBRX
  15. //          SCIARX <-> SCIATX
  16. //
  17. //          This test will perform autobaud lock at a variety of baud rates, including
  18. //          very high baud rates.  
  19. //
  20. //          For this test to properly run, connect the SCI-A pins to the 
  21. //          SCI-B pins without going through a transciever.  
  22. // 
  23. //          At higher baud rates, the slew rate of the incoming data bits can be 
  24. //          affected by transceiver and connector performance. This slew rate may
  25. //          limit reliable autobaud detection at higher baud rates.  
  26. //          
  27. //          SCIA: Slave, autobaud locks, receives characters and
  28. //                echos them back to the host.  Uses the RX interrupt
  29. //                to receive characters.
  30. //
  31. //          SCIB: Host, known baud rate, sends characters to the slave
  32. //                and checks that they are echoed back.
  33. //
  34. // DESCRIPTION:
  35. //
  36. //          Internal Loopback test for ever through SCIA using interrupts,
  37. //         FIFOs are disabled. 
  38. //
  39. //          Watch Variables: BRRVal - current BRR value used for SCIB
  40. //                           ReceivedAChar - character received by SCIA
  41. //                           ReceivedBChar - character received by SCIB
  42. //                           SendChar      - character being sent by SCIB
  43. //                           SciaRegs.SCILBAUD - SCIA baud registers - set
  44. //                           SciaRegs.SCIHBAUD   by autobaud lock
  45. //
  46. //
  47. //###########################################################################
  48. //
  49. //  Ver | dd mmm yyyy | Who  | Description of changes
  50. // =====|=============|======|===============================================
  51. // 1.00 | 11 Sep 2003 | L.H. | First Release 
  52. //###########################################################################
  53. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  54. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  55. #define BAUDSTEP 100            // Amount BRR will be incremented between each
  56.                                 // autobaud lock
  57. // Prototype statements for functions found within this file.
  58. void scia_init(void);
  59. void scib_init(void);
  60. void scia_xmit(int a);
  61. void scib_xmit(int a);
  62. void scia_AutobaudLock(void);
  63. void error(int);
  64. interrupt void rxaint_isr(void); 
  65. // Global counts used in this example
  66. Uint16 LoopCount;
  67. //Uint16 xmitCount;
  68. Uint16 ReceivedCount;
  69. Uint16 ErrorCount; 
  70. Uint16 SendChar;
  71. Uint16 ReceivedAChar;   // scia received character
  72. Uint16 ReceivedBChar;   // scib received character
  73. Uint16 BRRVal;
  74. Uint16 Buff[10] = {0x55, 0xAA, 0xF0, 0x0F, 0x00, 0xFF, 0xF5, 0x5F, 0xA5, 0x5A};
  75. void main(void)
  76. {
  77.    Uint16 i;
  78. // Step 1. Initialize System Control:
  79. // PLL, WatchDog, enable Peripheral Clocks
  80. // This example function is found in the DSP281x_SysCtrl.c file.
  81.    InitSysCtrl();
  82. // Step 2. Initalize GPIO: 
  83. // This example function is found in the DSP281x_Gpio.c file and
  84. // illustrates how to set the GPIO to it's default state.
  85. // InitGpio();  // Skipped for this example  
  86.    EALLOW;
  87.    GpioMuxRegs.GPFMUX.all=0x0030; // Select GPIOs to be Scia pins  
  88.                                     // Port F MUX - x000 0000 0011 0000
  89.    GpioMuxRegs.GPGMUX.all=0x0030; // Select GPIOs to be Scib pins  
  90.                                     // Port G MUX - x000 0000 0011 0000
  91.    EDIS;
  92. // Initialize PIE control registers to their default state.
  93. // The default state is all PIE interrupts disabled and flags
  94. // are cleared.  
  95. // This function is found in the DSP281x_PieCtrl.c file.
  96.    InitPieCtrl();
  97.    
  98. // Disable CPU interrupts and clear all CPU interrupt flags:
  99.    IER = 0x0000;
  100.    IFR = 0x0000;
  101. // Initialize the PIE vector table with pointers to the shell Interrupt 
  102. // Service Routines (ISR).  
  103. // This will populate the entire table, even if the interrupt
  104. // is not used in this example.  This is useful for debug purposes.
  105. // The shell ISR routines are found in DSP281x_DefaultIsr.c.
  106. // This function is found in DSP281x_PieVect.c.
  107.    InitPieVectTable();
  108. // Interrupts that are used in this example are re-mapped to
  109. // ISR functions found within this file.  
  110.    EALLOW;     // This is needed to write to EALLOW protected registers
  111.    PieVectTable.RXAINT = &rxaint_isr;
  112.    EDIS;       // This is needed to disable write to EALLOW protected register
  113. // Step 4. Initialize all the Device Peripherals:
  114. // This function is found in DSP281x_InitPeripherals.c
  115. // InitPeripherals(); // Not required for this example
  116.    scia_init();       // Initalize SCIA
  117.    scib_init();       // Initalize SCIB
  118. // Step 5. User specific code, enable interrupts:
  119.    LoopCount = 0;
  120.    ErrorCount = 0;
  121.     
  122. // Enable interrupts
  123.    PieCtrlRegs.PIEIER9.all = 0x0001; // Enable all SCIA RXINT interrupt
  124.    IER |= 0x0100;          // enable PIEIER9, and INT9
  125.    EINT;
  126.     
  127.     // Start with BRR = 1, work through each baud rate setting
  128.     // incrementing BRR by BAUDSTEP
  129.     for (BRRVal = 0x0000; BRRVal < (Uint32)0xFFFF; BRRVal+=BAUDSTEP)
  130.     {
  131.           
  132.         // SCIB has a known baud rate.  SCIA will autobaud to match  
  133.     ScibRegs.SCIHBAUD = (BRRVal >> 8);
  134.     ScibRegs.SCILBAUD = (BRRVal);    
  135.     
  136.     // Initiate an autobaud lock with scia.  Check
  137.     // returned character against baud lock character 'A' 
  138.     scia_AutobaudLock();
  139.     while(ScibRegs.SCIRXST.bit.RXRDY != 1) { } 
  140.     ReceivedBChar = 0;
  141.     ReceivedBChar =  ScibRegs.SCIRXBUF.bit.RXDT;
  142.     if(ReceivedBChar != 'A') 
  143.     {
  144.         error(0);
  145.     }
  146.     
  147.     // Send/echoback characters
  148.     // 55 AA F0 0F 00 FF F5 5F A5 5A 
  149.     for(i= 0; i<=9; i++) 
  150.     {
  151.       SendChar = Buff[i];
  152.       scib_xmit(SendChar);     // Initiate interrupts and xmit data in isr
  153.       // Wait to get the character back and check
  154.       // against the sent character.
  155.       while(ScibRegs.SCIRXST.bit.RXRDY != 1) 
  156.       { 
  157.           asm("   NOP");
  158.       } 
  159.       ReceivedBChar = 0;
  160.       ReceivedBChar =  ScibRegs.SCIRXBUF.bit.RXDT;
  161.       if(ReceivedBChar != SendChar) error(1);
  162.     }
  163.     
  164.     } // Repeat for next BRR setting 
  165.     
  166.     // Stop here, no more
  167.     for(;;)
  168.     {
  169.        asm("    NOP");
  170.     }
  171. /* --------------------------------------------------- */
  172. /* ISR for PIE INT9.1                                  */
  173. /* Connected to RXAINT  SCI-A                          */
  174. /* ----------------------------------------------------*/
  175.      
  176. interrupt void rxaint_isr(void)     // SCI-A
  177. {
  178.   // Insert ISR Code here
  179.    
  180.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  181.    
  182.    // If we were autobaud detecting, we must clear CDC
  183.    if(SciaRegs.SCIFFCT.bit.CDC == 1) 
  184.    {
  185.       SciaRegs.SCIFFCT.bit.ABDCLR = 1;
  186.       SciaRegs.SCIFFCT.bit.CDC = 0;
  187.       // Check received character - should be 'A'
  188.       ReceivedAChar = 0;
  189.       ReceivedAChar = SciaRegs.SCIRXBUF.all;
  190.       if(ReceivedAChar != 'A') 
  191.       {
  192.          error(2);
  193.       }
  194.       else scia_xmit(ReceivedAChar);       
  195.    }  
  196.    
  197.    // This was not autobaud detect
  198.    else 
  199.    {      
  200.       // Check received character against sendchar
  201.       ReceivedAChar = 0;
  202.       ReceivedAChar = SciaRegs.SCIRXBUF.all;
  203.       if(ReceivedAChar != SendChar) 
  204.       {
  205.          error(3);
  206.       }
  207.       else scia_xmit(ReceivedAChar);
  208.    }
  209.       
  210.    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear Receive interrupt flag  
  211.    ReceivedCount++;
  212. }
  213. void error(int ErrorFlag)
  214. {
  215.       ErrorCount++;
  216.       asm("     ESTOP0");          // Uncomment to stop the test here
  217.       for (;;);
  218. }
  219. // SCIA  8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity 
  220. void scia_init()
  221. {    
  222.     // Note: Clocks were turned on to the SCIA peripheral
  223.     // in the InitSysCtrl() function
  224.     // Reset FIFO's 
  225.     SciaRegs.SCIFFTX.all=0x8000;
  226.         
  227.     SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback 
  228.                                    // No parity,8 char bits,
  229.                                    // async mode, idle-line protocol
  230.     SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK, 
  231.                                    // Disable RX ERR, SLEEP, TXWAKE
  232.     SciaRegs.SCICTL2.all =0x0003; 
  233.     SciaRegs.SCICTL2.bit.RXBKINTENA =1;
  234.     SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset 
  235. }
  236. // SCIB  8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity 
  237.  
  238. void scib_init()
  239. {
  240.     // Reset FIFO's 
  241.     ScibRegs.SCIFFTX.all=0x8000;
  242.     // 1 stop bit, No parity, 8-bit character
  243.     // No loopback
  244.     ScibRegs.SCICCR.all = 0x0007;
  245.     
  246.     // Enable TX, RX, Use internal SCICLK
  247.     ScibRegs.SCICTL1.all = 0x0003; 
  248.     // Disable RxErr, Sleep, TX Wake, 
  249.     // Diable Rx Interrupt, Tx Interrupt
  250.     ScibRegs.SCICTL2.all = 0x0000;
  251.     // Relinquish SCI-A from reset
  252.     ScibRegs.SCICTL1.all = 0x0023;
  253.      
  254.     return;
  255. // Transmit a character from the SCI-A'
  256. void scia_xmit(int a)
  257. {
  258.     SciaRegs.SCITXBUF=a;
  259. }
  260. // Transmit a character from the SCI-B'
  261. void scib_xmit(int a)
  262. {
  263.     ScibRegs.SCITXBUF=a;
  264. }  
  265.     
  266. //------------------------------------------------
  267. // Perform autobaud lock with the host. 
  268. // Note that if autobaud never occurs 
  269. // the program will hang in this routine as there
  270. // is no timeout mechanism included. 
  271. //------------------------------------------------
  272.                                 
  273. void scia_AutobaudLock()
  274. {
  275.     Uint32 i;
  276.     
  277.     SciaRegs.SCICTL1.bit.SWRESET = 0;
  278.     SciaRegs.SCICTL1.bit.SWRESET = 1;
  279.     
  280.     // Must prime baud register with >= 1
  281.     SciaRegs.SCILBAUD = 1;
  282.     
  283.     // Prepare for autobaud detection
  284.     // Make sure the ABD bit is clear by writing a 1 to ABDCLR
  285.     // Set the CDC bit to enable autobaud detection
  286.     SciaRegs.SCIFFCT.bit.ABDCLR = 1;
  287.     SciaRegs.SCIFFCT.bit.CDC = 1;
  288.     
  289.     // Wait until we correctly read an 
  290.     // 'A' or 'a' and lock    
  291.     while(SciaRegs.SCIFFCT.bit.CDC == 1) 
  292.     {
  293.        // Note the lower the baud rate the longer
  294.        // this delay has to be
  295.        for(i = 1; i<= 0x0FFFFFF; i++) 
  296.        {
  297.           asm("     NOP");
  298.        }  // delay
  299.        
  300.        if(SciaRegs.SCIFFCT.bit.CDC == 1) scib_xmit('A');
  301.     }
  302.     return;   
  303. }
  304.     
  305. //===========================================================================
  306. // No more.
  307. //===========================================================================