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.

CCS/TMS320F28069F: Example_2806xSpi_FFDLB_int use without loopback

Part Number: TMS320F28069F

Tool/software: Code Composer Studio

Hello

I have download the Examples from TI for the SPI. The Example works fine I receive all Interrupt and the data's goes from write to read with loopback. I see the SPISIMO and the Clock on the board.

Now I would change the example from loopback to extern. So that I can comunicat with an extern chip.

On the Line SPISOMI I give an extern signal all high or all time low. 

When I debug the SPISOMI is every time 65535 I think it does not read the input

I have change the register from

SpiaRegs.SPICCR.all=0x001F;      // 16-bit character, Loopback mode

to

SpiaRegs.SPICCR.all=0x000F;      // 16-bit character, Loopback mode

Did I need to change something else?

Thanks for help. 

//###########################################################################
//
// FILE:   Example_2806xSpi_FFDLB_int.c
//
// TITLE:  SPI Digital Loop Back with Interrupts Example
//
//!  \addtogroup f2806x_example_list
//!  <h1>SPI Digital Loop Back with Interrupts(spi_loopback_interrupts)</h1>
//!
//!  This program uses the internal loop back test mode of the peripheral.
//!  Other then boot mode pin configuration, no other hardware configuration
//!  is required. Both interrupts and the SPI FIFOs are used.
//!
//!  A stream of data is sent and then compared to the received stream.
//!  The sent data looks like this: \n
//!  0000 0001 \n
//!  0001 0002 \n
//!  0002 0003 \n
//!  .... \n
//!  FFFE FFFF \n
//!  FFFF 0000 \n
//!  etc.. \n
//!  This pattern is repeated forever.
//!
//!  \b Watch \b Variables \n 
//!  - \b sdata , Data to send
//!  - \b rdata , Received data
//!  - \b rdata_point , Used to keep track of the last position in
//!    the receive stream for error checking
//
//###########################################################################
// $TI Release: F2806x Support Library v2.04.00.00 $
// $Release Date: Thu Oct 18 15:47:20 CDT 2018 $
// $Copyright:
// Copyright (C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions 
// are met:
// 
//   Redistributions of source code must retain the above copyright 
//   notice, this list of conditions and the following disclaimer.
// 
//   Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the 
//   documentation and/or other materials provided with the   
//   distribution.
// 
//   Neither the name of Texas Instruments Incorporated nor the names of
//   its contributors may be used to endorse or promote products derived
//   from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################

//
// Included Files
//
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

//
// Function Prototypes
//
__interrupt void spiTxFifoIsr(void);
__interrupt void spiRxFifoIsr(void);
void delay_loop(void);
void spi_fifo_init(void);
void error();

Uint16 sdata[2];     // Send data buffer
Uint16 rdata[2];     // Receive data buffer

//
// Keep track of where we are in the data stream to check received data
//
Uint16 rdata_point;

//
// Main
//
void main(void)
{
    Uint16 i;

    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2806x_SysCtrl.c file.
    //
    InitSysCtrl();

    //
    // Step 2. Initalize GPIO:
    // This example function is found in the F2806x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    //
    //InitGpio();  // Skipped for this example
    
    //
    // Setup only the GP I/O only for SPI-A functionality
    //
    InitSpiaGpio();

    //
    // Step 3. Initialize PIE vector table:
    // Disable and clear all CPU interrupts
    //
    DINT;
    IER = 0x0000;
    IFR = 0x0000;

    //
    // Initialize PIE control registers to their default state:
    // This function is found in the F2806x_PieCtrl.c file.
    //
    InitPieCtrl();

    //
    // 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 F2806x_DefaultIsr.c.
    // This function is found in F2806x_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.SPIRXINTA = &spiRxFifoIsr;
    PieVectTable.SPITXINTA = &spiTxFifoIsr;
    EDIS;      // This is needed to disable write to EALLOW protected registers

    //
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in F2806x_InitPeripherals.c
    //
    //InitPeripherals(); // Not required for this example
    spi_fifo_init();   // Initialize the SPI only

    //
    // Step 5. User specific code, enable interrupts
    //

    //
    // Initalize the send data buffer
    //
    for(i=0; i<2; i++)
    {
        sdata[i] = i;
    }
    rdata_point = 0;

    //
    // Enable interrupts required for this example
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER6.bit.INTx1=1;     // Enable PIE Group 6, INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1;     // Enable PIE Group 6, INT 2
    IER=0x20;                            // Enable CPU INT6
    EINT;                                // Enable Global Interrupts

    //
    // Step 6. IDLE loop. Just sit and loop forever (optional)
    //
    for(;;);
}

//
// Some Useful local functions
//
void
delay_loop()
{
    long      i;
    for (i = 0; i < 1000000; i++)
    {
        
    }
}

//
// error -
//
void
error(void)
{
    __asm("     ESTOP0");  //Test failed!! Stop!
    for (;;);
}

//
// spi_fifo_init - Initialize SPI FIFO registers
//
void
spi_fifo_init()
{
    //SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI // angepasst

    SpiaRegs.SPICCR.all=0x000F;      // 16-bit character, Loopback mode
    SpiaRegs.SPICTL.all=0x0007; // Interrupt enabled, Master/Slave XMIT enabled
    //SpiaRegs.SPISTS.all=0x0000;
    SpiaRegs.SPIBRR=0x007F;           // Baud rate
    SpiaRegs.SPIFFTX.all=0xC022;      // Enable FIFO's, set TX FIFO level to 4
    SpiaRegs.SPIFFRX.all=0x0022;      // Set RX FIFO level to 4
    SpiaRegs.SPIFFCT.all=0x00;
    SpiaRegs.SPIPRI.all=0x0010;

    SpiaRegs.SPICCR.bit.SPISWRESET=1;  // Enable SPI

    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}

//
// spiTxFifoIsr - 
//
__interrupt void
spiTxFifoIsr(void)
{
    Uint16 i;
    for(i=0;i<2;i++)
    {
       SpiaRegs.SPITXBUF=sdata[i];      // Send data
    }

    for(i=0;i<2;i++)                    // Increment data for next cycle
    {
       sdata[i] = sdata[i] + 1;
    }

    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ACK
}

//
// spiRxFifoIsr - 
//
__interrupt void
spiRxFifoIsr(void)
{
    Uint16 i;
    for(i=0;i<2;i++)
    {
        rdata[i]=SpiaRegs.SPIRXBUF;     // Read data
    }
    rdata_point++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
}

//
// End of File
//

  • Hi Salvatore,

    Yes, clearing the loopback bit is all that is necessary. 

    Please confirm that even if you drive SPISOMI to 0, the SPI reads it as all 1's? 

    What hardware are you using? LaunchPad? ControlCard? custom board?

    Are you certain that you are on the correct pin? 

    A good test is to ensure that the loopback bit is cleared, and then actually run a wire from SPISIMO to SPISOMI. The results of this test will be the same as if the internal loopback was enabled, and no wires are connected. 

    FYI, it is not necessary to post all of your code in your thread unless there are specific points you have questions about. If that is the case, just include the relevant snippets. It helps to make the post easier to read, and will be less distracting to others viewing the thread.

    Regards,

    Mark

  • Hello

    Thanks

    We use a custom board

    Yes I have measure direct on the pin 42 on the uC

    I test them with the wire this afternoon

  • Salvatore,

    Are you still working on this issue?

    Regards,
    Mark
  • No sorry. The error was on the init witch has make me colleg on the main project. There was a conflict.

  • Salvatore,
    I am glad you were able to resolve the issue. Though I am not sure I understand what the conflict was with the init. Can you rephrase what the issue ended up being?

    -Mark
  • Hello

    With the example I did not know where the problem was. I have reload the c2000 example from TI and change the loopback flag. Then it has work. Something was changed on me local example

    On the project where I would put the software my colleg has init the gpio.
    He has to init an other pin with the spi-A
    // GPIO-54 - SPISIMOA
    GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // 0=GPIO, 1=SPISIMOA, 2=EQEP2A, 3=HRCAP1
    //--------------------------------------------------------------------------------------
    // GPIO-55 - SPISOMIA
    GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // 0=GPIO, 1=SPISOMIA, 2=EQEP2B, 3=HRCAP2
    //--------------------------------------------------------------------------------------
    // GPIO-56 - SPICLKA
    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // 0=GPIO, 1=SPICLKA, 2=EQEP2I, 3=HRCAP3

    When I have change them it has work after the example on me project
  • Thanks for the update!

    If you have additional questions in the future, please don't hesitate to post.

    -Mark