This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SCI Interrupts



G'day,

Just wondering if someone could help me,

i am trying to get the interrupts to work for the serial communications interface. I am making a GUI for it and was wanting to send some data to start with so it will send info to the GUI when i want it to. However, i cant get the interrupts to work. I have used SCI_echoback and SCI_Loopback_interrupts and combined them to try and get the code to work and for the c2000 to interrupt when i send some data through hyperterminal. If someone has some code or can help me that would be fantastic

 

cheers

  • and just for completeness i added the code from the main file, all the other support files are the same as the sci_echoback and sci_loopback_interrupts example code.

     

    // TI File $Revision: /main/2 $
    // Checkin $Date: July 30, 2009   18:45:31 $
    //###########################################################################
    //
    // FILE:    Example_2833xSci_Echoback.c
    //
    // TITLE:   DSP2833x Device SCI Echoback.
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP2833x header files.
    //    As supplied, this project is configured for "boot to SARAM" operation.
    //
    //    Connect the SCI-A port to a PC via a transciever and cable.
    //    The PC application 'hypterterminal' can be used to view the data
    //    from the SCI and to send information to the SCI.  Characters recieved
    //    by the SCI port are sent back to the host.
    //
    //    As supplied, this project is configured for "boot to SARAM"
    //    operation.  The 2833x Boot Mode table is shown below.
    //    For information on configuring the boot mode of an eZdsp,
    //    please refer to the documentation included with the eZdsp,
    //
    //       $Boot_Table:
    //
    //         GPIO87   GPIO86     GPIO85   GPIO84
    //          XA15     XA14       XA13     XA12
    //           PU       PU         PU       PU
    //        ==========================================
    //            1        1          1        1    Jump to Flash
    //            1        1          1        0    SCI-A boot
    //            1        1          0        1    SPI-A boot
    //            1        1          0        0    I2C-A boot
    //            1        0          1        1    eCAN-A boot
    //            1        0          1        0    McBSP-A boot
    //            1        0          0        1    Jump to XINTF x16
    //            1        0          0        0    Jump to XINTF x32
    //            0        1          1        1    Jump to OTP
    //            0        1          1        0    Parallel GPIO I/O boot
    //            0        1          0        1    Parallel XINTF boot
    //            0        1          0        0    Jump to SARAM	    <- "boot to SARAM"
    //            0        0          1        1    Branch to check boot mode
    //            0        0          1        0    Boot to flash, bypass ADC cal
    //            0        0          0        1    Boot to SARAM, bypass ADC cal
    //            0        0          0        0    Boot to SCI-A, bypass ADC cal
    //                                              Boot_Table_End$
    //
    // DESCRIPTION:
    //
    //
    //    This test recieves and echo-backs data through the SCI-A port.
    //
    //    1) Configure hyperterminal:
    //       Use the included hyperterminal configuration file SCI_96.ht.
    //       To load this configuration in hyperterminal: file->open
    //       and then select the SCI_96.ht file.
    //    2) Check the COM port.
    //       The configuration file is currently setup for COM1.
    //       If this is not correct, disconnect Call->Disconnect
    //       Open the File-Properties dialog and select the correct COM port.
    //    3) Connect hyperterminal Call->Call
    //       and then start the 2833x SCI echoback program execution.
    //    4) The program will print out a greeting and then ask you to
    //       enter a character which it will echo back to hyperterminal.
    //
    //    As is, the program configures SCI-A for 9600 baud with
    //    SYSCLKOUT = 150MHz and LSPCLK = 37.5 MHz
    //    SYSCLKOUT = 100MHz and LSPCLK = 25.0 Mhz
    //
    //
    //    Watch Variables:
    //       LoopCount for the number of characters sent
    //       ErrorCount
    //
    //
    //###########################################################################
    // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
    // $Release Date: August 4, 2009 $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Prototype statements for functions found within this file.
    void scia_echoback_init(void);
    void scia_fifo_init(void);
    void scia_xmit(int a);
    void scia_msg(char *msg);
    interrupt void sciaRxFifoIsr(void);
    
    // Global counts used in this example
    Uint16 LoopCount;
    Uint16 ErrorCount;
    Uint16 ReceivedChar;
    
    void main(void)
    {
       
        char *msg;
    
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
       // InitGpio(); Skipped for this example
    
    // For this example, only init the pins for the SCI-A port.
    // This function is found in the DSP2833x_Sci.c file.
       InitSciaGpio();
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;	// This is needed to write to EALLOW protected registers
       PieVectTable.SCIRXINTA = &sciaRxFifoIsr;   
       EDIS;   // This is needed to disable write to EALLOW protected registers
       
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
    
    // Step 5. User specific code:
    
        LoopCount = 0;
        ErrorCount = 0;
    
        scia_fifo_init();	   // Initialize the SCI FIFO
        scia_echoback_init();  // Initalize SCI for echoback
    
        msg = "\r\n\n\nHello World!\0";
        scia_msg(msg);
    
        msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
        scia_msg(msg);
    	ReceivedChar = 1;
    	for(;;)
        { 
           //msg = "\r\nEnter a character: \0";
           //scia_msg(msg);
    
           // Wait for inc character
           //while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for XRDY =1 for empty state
    
           // Get character
           //ReceivedChar = SciaRegs.SCIRXBUF.all;
    
           // Echo character back
           //msg = "  You sent: \0";
           //scia_msg(msg);
           //scia_xmit(ReceivedChar);
    
           //LoopCount++;
        }
    
    }
    
    
    // Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
    void scia_echoback_init()
    {
        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
    
     	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    	SciaRegs.SCICTL2.all =0x0003;
    	SciaRegs.SCICTL2.bit.TXINTENA = 1;
    	SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
    	SciaRegs.SCIHBAUD    =0x0000;  // 38400 baud @LSPCLK = 37.5MHz.
    	SciaRegs.SCILBAUD    =0x0079;
    	SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
    }
    
    // Transmit a character from the SCI
    void scia_xmit(int a)
    {
        while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
        SciaRegs.SCITXBUF=a;
    
    }
    
    void scia_msg(char * msg)
    {
        int i;
        i = 0;
        while(msg[i] != '\0')
        {
            scia_xmit(msg[i]);
            i++;
        }
    }
    
    // Initalize the SCI FIFO
    void scia_fifo_init()
    {
        SciaRegs.SCIFFTX.all=0xE040;
        SciaRegs.SCIFFRX.all=0x204f;
        SciaRegs.SCIFFCT.all=0x0;
    
    }
    
    interrupt void sciaRxFifoIsr(void)
    {
        
    	
    	
    	ReceivedChar = SciaRegs.SCIRXBUF.all;
    	
    
    	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    
    	PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
    }
    
    
    
    
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    

  • After looking at your code I think I found your problem.   It is in how you set up your interrupts.  You have set them up for non-FIFO, whilst you are using FIFOs.

    The lines:

    SciaRegs.SCICTL2.bit.TXINTENA = 1;
    SciaRegs.SCICTL2.bit.RXBKINTENA = 1;

    Are the old (non-FIFO) set up. Remove them. When you initialize your fifo, change the lines

    SciaRegs.SCIFFTX.all=0xE040;
    SciaRegs.SCIFFRX.all=0x204f;

    To

    SciaRegs.SCIFFTX.all=0xE060;
    SciaRegs.SCIFFRX.all=0x2061;

    This should enable the FIFO interrupts to work as if there was no FIFO (interrupting on first byte received/transmit).
    [RXFFIENA = 1, TXFFIENA = 1, interrupt levels set appropriately.]

    For reference on what the bits do and how the interrupts work with the FIFOs see Figure 1-10 and Tables 2-9 and 2-10 of SPRUFZ5A.pdf
     (The UART guide for the F28335).

    Hopefully this helps fix your issues,

    Tim



  • ok, i kept the code the same but changed what you told me to, still have no luck, thank you very much for the help, if you have any other ideas that would be great. i will look through that pdf file right now.

  • Sorry,  I didn't look hard enough before.  Looking again I spotted that you have not turned on interrupts, which will of course cause you not to have any. 

    In your code just before the "Step 5: User Code" add:

    IER |= 0x0100;              // Turn INT9 ON

    EnableInterrupts();     // Enable PIE and global interrupts

     

    Hopefully this fixes it further,

    Tim

  • thank you very much for your help but unfortunately it still doesn't work.

     

    I added in the updated code if there is anything else that would be great

    // TI File $Revision: /main/2 $
    // Checkin $Date: July 30, 2009   18:45:31 $
    //###########################################################################
    //
    // FILE:    Example_2833xSci_Echoback.c
    //
    // TITLE:   DSP2833x Device SCI Echoback.
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP2833x header files.
    //    As supplied, this project is configured for "boot to SARAM" operation.
    //
    //    Connect the SCI-A port to a PC via a transciever and cable.
    //    The PC application 'hypterterminal' can be used to view the data
    //    from the SCI and to send information to the SCI.  Characters recieved
    //    by the SCI port are sent back to the host.
    //
    //    As supplied, this project is configured for "boot to SARAM"
    //    operation.  The 2833x Boot Mode table is shown below.
    //    For information on configuring the boot mode of an eZdsp,
    //    please refer to the documentation included with the eZdsp,
    //
    //       $Boot_Table:
    //
    //         GPIO87   GPIO86     GPIO85   GPIO84
    //          XA15     XA14       XA13     XA12
    //           PU       PU         PU       PU
    //        ==========================================
    //            1        1          1        1    Jump to Flash
    //            1        1          1        0    SCI-A boot
    //            1        1          0        1    SPI-A boot
    //            1        1          0        0    I2C-A boot
    //            1        0          1        1    eCAN-A boot
    //            1        0          1        0    McBSP-A boot
    //            1        0          0        1    Jump to XINTF x16
    //            1        0          0        0    Jump to XINTF x32
    //            0        1          1        1    Jump to OTP
    //            0        1          1        0    Parallel GPIO I/O boot
    //            0        1          0        1    Parallel XINTF boot
    //            0        1          0        0    Jump to SARAM	    <- "boot to SARAM"
    //            0        0          1        1    Branch to check boot mode
    //            0        0          1        0    Boot to flash, bypass ADC cal
    //            0        0          0        1    Boot to SARAM, bypass ADC cal
    //            0        0          0        0    Boot to SCI-A, bypass ADC cal
    //                                              Boot_Table_End$
    //
    // DESCRIPTION:
    //
    //
    //    This test recieves and echo-backs data through the SCI-A port.
    //
    //    1) Configure hyperterminal:
    //       Use the included hyperterminal configuration file SCI_96.ht.
    //       To load this configuration in hyperterminal: file->open
    //       and then select the SCI_96.ht file.
    //    2) Check the COM port.
    //       The configuration file is currently setup for COM1.
    //       If this is not correct, disconnect Call->Disconnect
    //       Open the File-Properties dialog and select the correct COM port.
    //    3) Connect hyperterminal Call->Call
    //       and then start the 2833x SCI echoback program execution.
    //    4) The program will print out a greeting and then ask you to
    //       enter a character which it will echo back to hyperterminal.
    //
    //    As is, the program configures SCI-A for 9600 baud with
    //    SYSCLKOUT = 150MHz and LSPCLK = 37.5 MHz
    //    SYSCLKOUT = 100MHz and LSPCLK = 25.0 Mhz
    //
    //
    //    Watch Variables:
    //       LoopCount for the number of characters sent
    //       ErrorCount
    //
    //
    //###########################################################################
    // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
    // $Release Date: August 4, 2009 $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Prototype statements for functions found within this file.
    void scia_echoback_init(void);
    void scia_fifo_init(void);
    void scia_xmit(int a);
    void scia_msg(char *msg);
    interrupt void sciaRxFifoIsr(void);
    
    // Global counts used in this example
    Uint16 LoopCount;
    Uint16 ErrorCount;
    Uint16 ReceivedChar;
    char *msg;
    
    void main(void)
    {
       
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
       // InitGpio(); Skipped for this example
    
    // For this example, only init the pins for the SCI-A port.
    // This function is found in the DSP2833x_Sci.c file.
       InitSciaGpio();
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;	// This is needed to write to EALLOW protected registers
       PieVectTable.SCIRXINTA = &sciaRxFifoIsr;   
       EDIS;   // This is needed to disable write to EALLOW protected registers
       
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
    
    	IER |= 0x0100;              // Turn INT9 ON
    	EnableInterrupts();     // Enable PIE and global interrupts
    	
    // Step 5. User specific code:
    
        LoopCount = 0;
        ErrorCount = 0;
    
        scia_fifo_init();	   // Initialize the SCI FIFO
        scia_echoback_init();  // Initalize SCI for echoback
    
        msg = "\r\n\n\nHello World!\0";
        scia_msg(msg);
    
        msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
        scia_msg(msg);
    	ReceivedChar = 1;
    	
    	for(;;)
        { 
           //msg = "\r\nEnter a character: \0";
           //scia_msg(msg);
    
           // Wait for inc character
           //while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for XRDY =1 for empty state
    
           // Get character
           //ReceivedChar = SciaRegs.SCIRXBUF.all;
    
           // Echo character back
           //msg = "  You sent: \0";
           //scia_msg(msg);
           //scia_xmit(ReceivedChar);
    
           //LoopCount++;
        }
    
    }
    
    
    // Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
    void scia_echoback_init()
    {
        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
    
     	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    	SciaRegs.SCICTL2.all =0x0003;
    	//SciaRegs.SCICTL2.bit.TXINTENA = 1;
    	//SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
    	SciaRegs.SCIHBAUD    =0x0000;  // 38400 baud @LSPCLK = 37.5MHz.
    	SciaRegs.SCILBAUD    =0x0079;
    	SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
    }
    
    // Transmit a character from the SCI
    void scia_xmit(int a)
    {
        while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
        SciaRegs.SCITXBUF=a;
    
    }
    
    void scia_msg(char * msg)
    {
        int i;
        i = 0;
        while(msg[i] != '\0')
        {
            scia_xmit(msg[i]);
            i++;
        }
    }
    
    // Initalize the SCI FIFO
    void scia_fifo_init()
    {
        SciaRegs.SCIFFTX.all=0xE060;
        SciaRegs.SCIFFRX.all=0x2061;
        SciaRegs.SCIFFCT.all=0x0;
    
    }
    
    interrupt void sciaRxFifoIsr(void)
    {
        
    	msg = "In Interrupt \0";
        scia_msg(msg);
    	
    	ReceivedChar = SciaRegs.SCIRXBUF.all;
    	
    
    	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    
    	PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
    }
    
    
    
    
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    

  • Just a few questions/points:

    1) The RX ISR should be being reached.  Have you got JTAG emulation?  If so place a breakpoint at the start of the ISR and check whether it is being reached. 

    2) You have not allocated memory for msg, just for the pointer.  In your global variables go

      char msg[MAX_MESSAGE_LENGTH]; where MAX_MESSAGE_LENGTH is the maximum message length.

    3) What exactly is its behaviour at the moment?  Is it sending the initial messages?

    Tim

     

  • Having a look at my code I think I forgot to give you all the code needed:

    To your function

    void scia_fifo_init()
    {
    SciaRegs.SCIFFTX.all=0xE060;
    SciaRegs.SCIFFRX.all=0x2061;
    SciaRegs.SCIFFCT.all=0x0;

    Add the following code:

    // Take the FIFOs out of RESET
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    }

    I accidentally left them in reset! Hopefully now you will see some activity on the bus,

    Tim
  • Thanks for your reply.

    changed the code and still am not receiving anything. It is weird because i need to get this working. It sends the initial messages "hello world" and "you will enter a character..." but once that happens it just sits in the for loop waiting for an interrupt but it never comes. Polling works because the echoback code works fine but my c2000 is controlling a single phase rectifier and three phase inverter so i cant have it wasting so much time polling for the message.

     

    ill keep adding the updated code just for completeness

     

    // TI File $Revision: /main/2 $
    // Checkin $Date: July 30, 2009   18:45:31 $
    //###########################################################################
    //
    // FILE:    Example_2833xSci_Echoback.c
    //
    // TITLE:   DSP2833x Device SCI Echoback.
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP2833x header files.
    //    As supplied, this project is configured for "boot to SARAM" operation.
    //
    //    Connect the SCI-A port to a PC via a transciever and cable.
    //    The PC application 'hypterterminal' can be used to view the data
    //    from the SCI and to send information to the SCI.  Characters recieved
    //    by the SCI port are sent back to the host.
    //
    //    As supplied, this project is configured for "boot to SARAM"
    //    operation.  The 2833x Boot Mode table is shown below.
    //    For information on configuring the boot mode of an eZdsp,
    //    please refer to the documentation included with the eZdsp,
    //
    //       $Boot_Table:
    //
    //         GPIO87   GPIO86     GPIO85   GPIO84
    //          XA15     XA14       XA13     XA12
    //           PU       PU         PU       PU
    //        ==========================================
    //            1        1          1        1    Jump to Flash
    //            1        1          1        0    SCI-A boot
    //            1        1          0        1    SPI-A boot
    //            1        1          0        0    I2C-A boot
    //            1        0          1        1    eCAN-A boot
    //            1        0          1        0    McBSP-A boot
    //            1        0          0        1    Jump to XINTF x16
    //            1        0          0        0    Jump to XINTF x32
    //            0        1          1        1    Jump to OTP
    //            0        1          1        0    Parallel GPIO I/O boot
    //            0        1          0        1    Parallel XINTF boot
    //            0        1          0        0    Jump to SARAM	    <- "boot to SARAM"
    //            0        0          1        1    Branch to check boot mode
    //            0        0          1        0    Boot to flash, bypass ADC cal
    //            0        0          0        1    Boot to SARAM, bypass ADC cal
    //            0        0          0        0    Boot to SCI-A, bypass ADC cal
    //                                              Boot_Table_End$
    //
    // DESCRIPTION:
    //
    //
    //    This test recieves and echo-backs data through the SCI-A port.
    //
    //    1) Configure hyperterminal:
    //       Use the included hyperterminal configuration file SCI_96.ht.
    //       To load this configuration in hyperterminal: file->open
    //       and then select the SCI_96.ht file.
    //    2) Check the COM port.
    //       The configuration file is currently setup for COM1.
    //       If this is not correct, disconnect Call->Disconnect
    //       Open the File-Properties dialog and select the correct COM port.
    //    3) Connect hyperterminal Call->Call
    //       and then start the 2833x SCI echoback program execution.
    //    4) The program will print out a greeting and then ask you to
    //       enter a character which it will echo back to hyperterminal.
    //
    //    As is, the program configures SCI-A for 9600 baud with
    //    SYSCLKOUT = 150MHz and LSPCLK = 37.5 MHz
    //    SYSCLKOUT = 100MHz and LSPCLK = 25.0 Mhz
    //
    //
    //    Watch Variables:
    //       LoopCount for the number of characters sent
    //       ErrorCount
    //
    //
    //###########################################################################
    // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
    // $Release Date: August 4, 2009 $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Prototype statements for functions found within this file.
    void scia_echoback_init(void);
    void scia_fifo_init(void);
    void scia_xmit(int a);
    void scia_msg(char *msg);
    interrupt void sciaRxFifoIsr(void);
    
    
    // Global counts used in this example
    Uint16 LoopCount;
    Uint16 ErrorCount;
    Uint16 ReceivedChar;
    char *msg;
    
    void main(void)
    {
       
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
       // InitGpio(); Skipped for this example
    
    // For this example, only init the pins for the SCI-A port.
    // This function is found in the DSP2833x_Sci.c file.
       InitSciaGpio();
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;	// This is needed to write to EALLOW protected registers
       PieVectTable.SCIRXINTA = &sciaRxFifoIsr;    
       EDIS;   // This is needed to disable write to EALLOW protected registers
       
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
    
    	IER |= 0x0100;              // Turn INT9 ON
    	EnableInterrupts();     // Enable PIE and global interrupts
    	
    // Step 5. User specific code:
    
        LoopCount = 0;
        ErrorCount = 0;
    
        scia_fifo_init();	   // Initialize the SCI FIFO
        scia_echoback_init();  // Initalize SCI for echoback
    
        msg = "\r\n\n\nHello World!\0";
        scia_msg(msg);
    
        msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
        scia_msg(msg);
    	ReceivedChar = 1;
    	
    	for(;;)
        { 
           //msg = "\r\nEnter a character: \0";
           //scia_msg(msg);
    
           // Wait for inc character
           //while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for XRDY =1 for empty state
    
           // Get character
           //ReceivedChar = SciaRegs.SCIRXBUF.all;
    
           // Echo character back
           //msg = "  You sent: \0";
           //scia_msg(msg);
           //scia_xmit(ReceivedChar);
    
           //LoopCount++;
        }
    
    }
    
    
    // Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
    void scia_echoback_init()
    {
        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
    
     	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    	SciaRegs.SCICTL2.all =0x0003;
    	//SciaRegs.SCICTL2.bit.TXINTENA = 1;
    	//SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
    	SciaRegs.SCIHBAUD    =0x0000;  // 38400 baud @LSPCLK = 37.5MHz.
    	SciaRegs.SCILBAUD    =0x0079;
    	SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
    }
    
    // Transmit a character from the SCI
    void scia_xmit(int a)
    {
        while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
        SciaRegs.SCITXBUF=a;
    
    }
    
    void scia_msg(char * msg)
    {
        int i;
        i = 0;
        while(msg[i] != '\0')
        {
            scia_xmit(msg[i]);
            i++;
        }
    }
    
    // Initalize the SCI FIFO
    void scia_fifo_init()
    {
        SciaRegs.SCIFFTX.all=0xE060;
        SciaRegs.SCIFFRX.all=0x2061;
        SciaRegs.SCIFFCT.all=0x0;
        SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    	SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    
    }
    
    interrupt void sciaRxFifoIsr(void)
    {
        
    	msg = "In Interrupt \0";
        scia_msg(msg);
    	
    	ReceivedChar = SciaRegs.SCIRXBUF.all;
    	
    
    	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    
    	PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
    }
    
    
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    

  • I had a look at the loopback with interrupts example code to see what was missing.  I found I had forgotten to turn on the PIE for the SCI.

    Add the following code just before EnableInterrupts()

       PieCtrlRegs.PIEIER9.bit.INTx1=1;     // PIE Group 9, int1
       PieCtrlRegs.PIEIER9.bit.INTx2=1;     // PIE Group 9, INT2

    This will enable the respective bits in the PIE to allow the SCI interrupts to pass through. 

    Hopefully this will be the final thing,

    Tim

  • Thank you very much, that worked a charm. Although i removed the second line PieCtrlRegs.PIEIER9.bit.INTx2 as this would cause problems when it was sending the messages. It now works fine. Thank you very much for your help.

    Ill add the code in one last time if anyone needs it. 

     

    Thanks again.

     

    // TI File $Revision: /main/2 $
    // Checkin $Date: July 30, 2009   18:45:31 $
    //###########################################################################
    //
    // FILE:    Example_2833xSci_Echoback.c
    //
    // TITLE:   DSP2833x Device SCI Echoback.
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP2833x header files.
    //    As supplied, this project is configured for "boot to SARAM" operation.
    //
    //    Connect the SCI-A port to a PC via a transciever and cable.
    //    The PC application 'hypterterminal' can be used to view the data
    //    from the SCI and to send information to the SCI.  Characters recieved
    //    by the SCI port are sent back to the host.
    //
    //    As supplied, this project is configured for "boot to SARAM"
    //    operation.  The 2833x Boot Mode table is shown below.
    //    For information on configuring the boot mode of an eZdsp,
    //    please refer to the documentation included with the eZdsp,
    //
    //       $Boot_Table:
    //
    //         GPIO87   GPIO86     GPIO85   GPIO84
    //          XA15     XA14       XA13     XA12
    //           PU       PU         PU       PU
    //        ==========================================
    //            1        1          1        1    Jump to Flash
    //            1        1          1        0    SCI-A boot
    //            1        1          0        1    SPI-A boot
    //            1        1          0        0    I2C-A boot
    //            1        0          1        1    eCAN-A boot
    //            1        0          1        0    McBSP-A boot
    //            1        0          0        1    Jump to XINTF x16
    //            1        0          0        0    Jump to XINTF x32
    //            0        1          1        1    Jump to OTP
    //            0        1          1        0    Parallel GPIO I/O boot
    //            0        1          0        1    Parallel XINTF boot
    //            0        1          0        0    Jump to SARAM	    <- "boot to SARAM"
    //            0        0          1        1    Branch to check boot mode
    //            0        0          1        0    Boot to flash, bypass ADC cal
    //            0        0          0        1    Boot to SARAM, bypass ADC cal
    //            0        0          0        0    Boot to SCI-A, bypass ADC cal
    //                                              Boot_Table_End$
    //
    // DESCRIPTION:
    //
    //
    //    This test recieves and echo-backs data through the SCI-A port.
    //
    //    1) Configure hyperterminal:
    //       Use the included hyperterminal configuration file SCI_96.ht.
    //       To load this configuration in hyperterminal: file->open
    //       and then select the SCI_96.ht file.
    //    2) Check the COM port.
    //       The configuration file is currently setup for COM1.
    //       If this is not correct, disconnect Call->Disconnect
    //       Open the File-Properties dialog and select the correct COM port.
    //    3) Connect hyperterminal Call->Call
    //       and then start the 2833x SCI echoback program execution.
    //    4) The program will print out a greeting and then ask you to
    //       enter a character which it will echo back to hyperterminal.
    //
    //    As is, the program configures SCI-A for 9600 baud with
    //    SYSCLKOUT = 150MHz and LSPCLK = 37.5 MHz
    //    SYSCLKOUT = 100MHz and LSPCLK = 25.0 Mhz
    //
    //
    //    Watch Variables:
    //       LoopCount for the number of characters sent
    //       ErrorCount
    //
    //
    //###########################################################################
    // $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
    // $Release Date: August 4, 2009 $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Prototype statements for functions found within this file.
    void scia_echoback_init(void);
    void scia_fifo_init(void);
    void scia_xmit(int a);
    void scia_msg(char *msg);
    interrupt void sciaRxFifoIsr(void);
    
    
    // Global counts used in this example
    Uint16 LoopCount;
    Uint16 ErrorCount;
    Uint16 ReceivedChar;
    char *msg;
    
    void main(void)
    {
       
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
       // InitGpio(); Skipped for this example
    
    // For this example, only init the pins for the SCI-A port.
    // This function is found in the DSP2833x_Sci.c file.
       InitSciaGpio();
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;	// This is needed to write to EALLOW protected registers
       PieVectTable.SCIRXINTA = &sciaRxFifoIsr;    
       EDIS;   // This is needed to disable write to EALLOW protected registers
       
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
    
    	IER |= 0x0100;              // Turn INT9 ON
    	PieCtrlRegs.PIEIER9.bit.INTx1=1;     // PIE Group 9, int1
        //PieCtrlRegs.PIEIER9.bit.INTx2=1;     // PIE Group 9, INT2
    	EnableInterrupts();     // Enable PIE and global interrupts
    	
    // Step 5. User specific code:
    
        LoopCount = 0;
        ErrorCount = 0;
    
        scia_fifo_init();	   // Initialize the SCI FIFO
        scia_echoback_init();  // Initalize SCI for echoback
    
        msg = "\r\n\n\nHello World!\0";
        scia_msg(msg);
    
        msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
        scia_msg(msg);
    	ReceivedChar = 1;
    	
    	for(;;)
        { 
           //msg = "\r\nEnter a character: \0";
           //scia_msg(msg);
    
           // Wait for inc character
           //while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for XRDY =1 for empty state
    
           // Get character
           //ReceivedChar = SciaRegs.SCIRXBUF.all;
    
           // Echo character back
           //msg = "  You sent: \0";
           //scia_msg(msg);
           //scia_xmit(ReceivedChar);
    
           //LoopCount++;
        }
    
    }
    
    
    // Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
    void scia_echoback_init()
    {
        // Note: Clocks were turned on to the SCIA peripheral
        // in the InitSysCtrl() function
    
     	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    	SciaRegs.SCICTL2.all =0x0003;
    	//SciaRegs.SCICTL2.bit.TXINTENA = 1;
    	//SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
    	SciaRegs.SCIHBAUD    =0x0000;  // 38400 baud @LSPCLK = 37.5MHz.
    	SciaRegs.SCILBAUD    =0x0079;
    	SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
    }
    
    // Transmit a character from the SCI
    void scia_xmit(int a)
    {
        while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
        SciaRegs.SCITXBUF=a;
    
    }
    
    void scia_msg(char * msg)
    {
        int i;
        i = 0;
        while(msg[i] != '\0')
        {
            scia_xmit(msg[i]);
            i++;
        }
    }
    
    // Initalize the SCI FIFO
    void scia_fifo_init()
    {
        SciaRegs.SCIFFTX.all=0xE060;
        SciaRegs.SCIFFRX.all=0x2061;
        SciaRegs.SCIFFCT.all=0x0;
        SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    	SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    
    }
    
    interrupt void sciaRxFifoIsr(void)
    {
        
    	msg = "In Interrupt \0";
        scia_msg(msg);
    	
    	ReceivedChar = SciaRegs.SCIRXBUF.all;
    	scia_xmit(ReceivedChar);
    
    	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    
    	PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
    }
    
    
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    

  • No worries.  Good to hear it worked finally. 

    As for INTx2, that is the TX interrupt.  It is likely that you will need to use that eventually because polling is not going to work in real time in a power electronics application.  However, the TX FIFO interrupt is a real pain in the neck.  The reason for this is that it is based on the Transmit FIFO being empty, not on a transmission complete.  This means that if you are not transmitting it just keeps going off all the time (as the FIFO is empty).  The trick that I found is to do the following:

    [Have the TX interrupt disabled in the SciaRegs by default]

    Send_Message_Function()

    Set up buffer

    Send first character

    Enable TX int in SciaRegs

    TX_ISR()

    If buffer has more than 1 char to go

       Send next character

    else

     Send final char

      Disable TX int in SciaRegs

     

    This means that the TX ISR is not blazing away all the time.  The final thing to note is that the interrupt triggers on when the data goes from the FIFO -> output buffer.  This means it occurs before the data is sent.  If you are wanting to make sure the transmission is complete, you will have to wait the time of a transmission (~10bits * 38400).

    Hopefully this information is useful to you,

     

    Tim

  • Ok ill keep that in mind, however i won't need to send that much information so i might poll it if i only need to send a few things.

    I think all i will be sending is a value that is the grid frequency and maybe a power factor or something like that.

    Just something to keep in mind i guess

  • I found this discussion extremely useful. The whole interrupt handling chain is confusing at first. It took several readings of SPRUFB0D and SPRUFZ5A before I had a clear idea of the sequence of events. The most useful thing I found was that I had to clear PIEACK after receiving every character (not using FIFO yet).

    Thanks Blake for asking the question, and Tim for taking the trouble to make the answer clear.

    Cheers;

    Peter.

  • Hi all!

    I'm trying to run the code given by Blake. The character I'm sending through Hyperteminal is echoed, but where should I see the messages? I've also added a test variable to increment when the sciaRxFifoIsr() interrupt is reached, and this variable is always 2989 . It should not increment every time I send a new characters?

    Thanks a lot,

    monica

  • Hi Monica.

    The responses should follow your input. If the variable isn't being incremented, then the ISR isn't being called, and so there won't be a response.

    Check carefully that the address of the ISR is put into the vector table, and that the interrupt is enabled. The sequence of initialising, loading and enabling is important. If you can, try to do it as fall through code. If that isn't possible, check that the call sequence is always correct. Finally, make sure that the interrupt is acknowledged when the ISR returns or you will see at most one response.

    Peter.

  • Thanks Peter!

    One more question, maybe I'm doing it completely wrong. Do I need another connection except the USB? I know that FTDI from the docking station makes the convertion from serial to USB, but this is used by Code Composer also. Can this work?

    Thanks,

    Monica

  • Hi Monica.

    On the two machines that I have used there was a separate serial port. One was a standard serial port on a desktop machine, the other was a laptop and used a USB to RS232 dongle. If your docking station allows you to use a serial port then it should work. Make sure that you have the correct serial port configured in Hyperterminal or you'll be talking to empty space.

    Cheers;

    Peter.