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.

TMS320F28379D: SPI timing issues

Part Number: TMS320F28379D
Other Parts Discussed in Thread: C2000WARE

Hi Team,

Here're some issues from the customer may need your help:

I use an oscilloscope to test the SPI communication timing. The SPIA self-receiving and self-transmitting, the SPIA master and the SPIB slave are respectively tested.

The CCS debug interface displays normally during the SPIA self-receiving and self-testing. The oscilloscope measures SCLK as shown in the figure below, 8 pulses are in a group, and the width of a single pulse is 12.4us (both high and low level time are 6.2us), but there will be a time interval of 31.4us between each group of pulses. Is this normal?

Measured the SIMO pin and found that it will continue to send the same data. The measurement time is about 32.3ms, and the data is repeated about 243 times. How to solve this?

The following is the program of SPIA self-receiving and self-sending:

/*
 * SPI self-receive and self-transmit
 *
 */

#include "F28x_Project.h"

typedef unsigned char Uint8;


//statement
void gpio_init();   //Configure all GPIO ports connected to the PCB board (including 3-wire SPI)
void spia_init();
void spia_xmit(Uint8 a);


//global variable
char sdata;
char rdata;

void main()
{
    //initialization
    InitSysCtrl();  
    InitGpio();
    DINT;//disable interrupt
    InitPieCtrl();
    IER = 0x0000; 
    IFR = 0x0000;
    InitPieVectTable();


    gpio_init();


    spia_init();

    sdata = 0x0045;

    for(;;)
    {
        spia_xmit(sdata);
        while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
        rdata = SpiaRegs.SPIRXBUF;
        sdata++;
    }


}

void gpio_init()
{
    /* 
     * 60   SPICLKA_DA     SPIA CLK
     * 59   SPISOMIA_DA    SPIA SOMI
     * 58   SPISIMOA_DA    SPIA SIMO
     */

    EALLOW;

    //SPI
    //DA(enable、asynchronous、SPI)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA

    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA

    EDIS;

}

void spia_init()
{
    //DAC1282 clock polarity(CPOL)is 0,clock phase(CPHA)is 0
    //Configuration Control Register(8 bits reserved,0000 0000 0000 0111 = 0x0007)
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI reset
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//clock polarity is 0(SCK idle is low)
    SpiaRegs.SPICCR.bit.HS_MODE = 0;//Turn off high speed mode
    SpiaRegs.SPICCR.bit.SPILBK = 1;//Turn off loopback mode
    SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//Word length 8 bits

    //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006)
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//Disable receive overflow interrupt
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//clock phase is 0(Sampled on the first transition edge)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU master
    SpiaRegs.SPICTL.bit.TALK = 1;//enable master transmit
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;//disable SPI interrupt

    //SpiaRegs.SPISTS.all = 0;

    //baud rate register(9 bits reserved,0000 0000 0000 007C)
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * without adding an external auxiliary clock
     * The CPU frequency of F28379D is 10MHz, the corresponding minimum low-speed peripheral clock is 715KHz, and the minimum baud rate is 5586SPS
     * This minimum baud rate is greater than the maximum baud rate 4000SPS when FIR filter mode is selected
     * Therefore, the Sinc filter mode is selected, the baud rate is set to 8000SPS, and the frequency is divided by 10,SPIBRR=124=0x007C
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101(divide by 10)
    EDIS;

    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    //Priority Control Register
    SpiaRegs.SPIPRI.bit.FREE = 1;//Free run during simulation, pause on breakpoint does not stop SPI

    //Stop SPI software reset ready to receive or transmit
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}

void spia_xmit(Uint8 a)
{
    SpiaRegs.SPITXBUF = a;//Pass 8-bit data to serial transmit buffer

}

Connection for SPIA master SPIB slave test:

SPIA CLK-SPIB CLK

SPIA SIMO-SPIB SOMI

SPIA SOMI-SPIB SIMO

The SCLK waveform is the same as that of SPIA, but after a period of normal operation, the debug interface shows that rdata is always FFFF, SpiaRegs.SPITS.bit.INT_FLAG is always 1, and the while loop cannot be jumped out. How should this be resolved?

Program for SPIA master and SPIB slave:

/*
 *
 *
 */

#include "F28x_Project.h"

typedef unsigned char Uint8;



void gpio_init();
void spia_init();
void spia_xmit(Uint8 a);
void spib_init();
void spib_xmit(Uint8 a);



char sdata;
char rdata;

int i;

void main()
{
    
    InitSysCtrl();
    InitGpio();//GPIO
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();


    gpio_init();


    spia_init();
    spib_init();

    sdata = 0x0000;
    rdata = 0x0000;

    for(;;)
    {
        spia_xmit(sdata);
        while(SpibRegs.SPISTS.bit.INT_FLAG != 1){}
        rdata = SpibRegs.SPIRXBUF;
        sdata++;

    }


}

void gpio_init()
{
    /*
     * 60   SPICLKA_DA     SPIA CLK
     * 59   SPISOMIA_DA    SPIA SOMI
     * 58   SPISIMOA_DA    SPIA SIMO
     *
     * 65   SPICLKB_AD     SPIB CLK
     * 64   SPISOMIB_AD    SPIB SOMI
     * 63   SPISIMOB_AD    SPIB SIMO
     */

    EALLOW;

    //SPI
    //DA
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA

    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA

    //SPI
    //DA
    GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0;
    GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB

    GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;
    GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB

    GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB

    EDIS;

}

void spia_init()
{
    
    
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpiaRegs.SPICCR.bit.HS_MODE = 0;
    SpiaRegs.SPICCR.bit.SPILBK = 1;
    SpiaRegs.SPICCR.bit.SPICHAR = (8-1);

    
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU master
    SpiaRegs.SPICTL.bit.TALK = 1;
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;

    //SpiaRegs.SPISTS.all = 0;

    
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 
     * 
     * 
     * 
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101
    EDIS;

    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    
    SpiaRegs.SPIPRI.bit.FREE = 1;

    
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}

void spib_init()
{
    
    
    SpibRegs.SPICCR.bit.SPISWRESET = 0;
    SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
    SpibRegs.SPICCR.bit.HS_MODE = 0;
    SpibRegs.SPICCR.bit.SPILBK = 1;
    SpibRegs.SPICCR.bit.SPICHAR = (8-1);

    
    SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;
    SpibRegs.SPICTL.bit.CLK_PHASE = 0;
    SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU master
    SpibRegs.SPICTL.bit.TALK = 1;
    SpibRegs.SPICTL.bit.SPIINTENA = 0;

    //SpiaRegs.SPISTS.all = 0;

    
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 
     * 
     * 
     * 
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101
    EDIS;

    SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    
    SpibRegs.SPIPRI.bit.FREE = 1;

    
    SpibRegs.SPICCR.bit.SPISWRESET = 1;
}

void spia_xmit(Uint8 a)
{
    SpiaRegs.SPITXBUF = a;

}

Thanks & Regards

Yale Li

  • Hello Yale,

    The CCS debug interface displays normally during the SPIA self-receiving and self-testing. The oscilloscope measures SCLK as shown in the figure below, 8 pulses are in a group, and the width of a single pulse is 12.4us (both high and low level time are 6.2us), but there will be a time interval of 31.4us between each group of pulses. Is this normal?

    The timing seems right to me. It looks like your SPICLK is running at 80.6kHz. Since LSPCLK is set to /10 and your BRR is set to 124, that would mean your MCU SYSCLK is running at 80.6kHz * (124+1) * (10) = 100MHz. Does that sound right based on your expectation?

    The "grouping" is also normal since you are not using FIFO mode in your SPI configuration. If you want continuous data you have to enable FIFO mode. There are several examples in C2000ware which can show you how to do that.

    Measured the SIMO pin and found that it will continue to send the same data. The measurement time is about 32.3ms, and the data is repeated about 243 times. How to solve this?

    In your spia_xmit code you are writing a uint8 value to a uint16 register. I believe the compiler should have flagged a warning on this. You also need to shift your data << 8 since your SPI configuration is for 8 bits and the MSB of the SPITXBUF always gets shifted out first (see TRM for more information). Here is what I think your code should look like:

    void spia_xmit(Uint8 a)
    {
    SpiaRegs.SPITXBUF = (Uint16)(a<<8);//Pass 8-bit data to serial transmit buffer
    
    }

    The SCLK waveform is the same as that of SPIA, but after a period of normal operation, the debug interface shows that rdata is always FFFF, SpiaRegs.SPITS.bit.INT_FLAG is always 1, and the while loop cannot be jumped out. How should this be resolved?

    I don't see your spib_xmit() code, so not quite sure what could be the problem. But assuming you are using similar code to spia_xmit(), then you need to make the same changes as described above. 

  • Hi Gus,

    Thanks for your reply.

    My customer modified spia_xmit() and spib_xmit() as you said, and added the code to send data from spib to spia in the main function. However, the debug interface shows that spia can receive the data of spib normally, and the RXBUF of spib is still always FF.

    Here is the modified program:

    /*
     * 
     *
     */
    
    #include "F28x_Project.h"
    
    typedef unsigned char Uint8;
    
    
    
    void gpio_init();
    void spia_init();
    void spia_xmit(Uint8 a);
    void spib_init();
    void spib_xmit(Uint8 a);
    
    
    
    char sdata;
    char rdata;
    
    void main()
    {
        
        InitSysCtrl();
        InitGpio();
        DINT;
        InitPieCtrl();
        IER = 0x0000;
        IFR = 0x0000;
        InitPieVectTable();
    
    
        gpio_init();
    
    
        spia_init();
        spib_init();
    
        sdata = 0x0000;
        rdata = 0x0000;
    
        for(;;)
        {
            spia_xmit(sdata);
            while(SpibRegs.SPISTS.bit.INT_FLAG != 1){}
            rdata = SpibRegs.SPIRXBUF;
            spib_xmit(sdata);
            while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
            char rdataa = SpiaRegs.SPIRXBUF;
            sdata++;
    
        }
    
    
    }
    
    void gpio_init()
    {
        /* 
         * 60   SPICLKA_DA     SPIA CLK
         * 59   SPISOMIA_DA    SPIA SOMI
         * 58   SPISIMOA_DA    SPIA SIMO
         *
         * 65   SPICLKB_AD     SPIB CLK
         * 64   SPISOMIB_AD    SPIB SOMI
         * 63   SPISIMOB_AD    SPIB SIMO
         */
    
        EALLOW;
    
        //SPI
        //DA
        GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA
    
        GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA
    
        GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA
    
        //SPI
        //DA
        GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0;
        GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3;
        GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
        GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB
    
        GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0;
        GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3;
        GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
        GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB
    
        GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;
        GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3;
        GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
        GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB
    
        EDIS;
    
    }
    
    void spia_init()
    {
        
        
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
        SpiaRegs.SPICCR.bit.HS_MODE = 0;
        SpiaRegs.SPICCR.bit.SPILBK = 1;
        SpiaRegs.SPICCR.bit.SPICHAR = (8-1);
    
        
        SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
        SpiaRegs.SPICTL.bit.TALK = 1;
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;
    
        //SpiaRegs.SPISTS.all = 0;
    
        
        /*
         * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
         * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
         * 
         * 
         * 
         * 
         */
    
        EALLOW;
        ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
        EDIS;
    
        SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
    
        
        SpiaRegs.SPIPRI.bit.FREE = 1;
    
        
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;
    }
    
    void spib_init()
    {
        
        
        SpibRegs.SPICCR.bit.SPISWRESET = 0;
        SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
        SpibRegs.SPICCR.bit.HS_MODE = 0;
        SpibRegs.SPICCR.bit.SPILBK = 1;
        SpibRegs.SPICCR.bit.SPICHAR = (8-1);
    
        
        SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;
        SpibRegs.SPICTL.bit.CLK_PHASE = 0;
        SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;
        SpibRegs.SPICTL.bit.TALK = 1;
        SpibRegs.SPICTL.bit.SPIINTENA = 0;
    
        //SpiaRegs.SPISTS.all = 0;
    
        
        /*
         * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
         * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
         * 
         * 
         * 
         * 
         */
    
        EALLOW;
        ClkCfgRegs.LOSPCP.all = 0x0005;
        EDIS;
    
        SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;
    
        
        SpibRegs.SPIPRI.bit.FREE = 1;
    
        
        SpibRegs.SPICCR.bit.SPISWRESET = 1;
    }
    
    void spia_xmit(Uint8 a)
    {
        SpiaRegs.SPITXBUF = (Uint16)(a<<8);
    
    }
    
    void spib_xmit(Uint8 b)
    {
        SpibRegs.SPITXBUF = (Uint16)(b<<8);
    
    }

    What is the reason for this situation?

    Thanks & Regards

    Yale Li

  • Yale,

    The customer has loopback mode enabled in both spia and spib. Looback mode should be disabled for both interfaces.

    SpibRegs.SPICCR.bit.SPILBK = 1;

    SpiaRegs.SPICCR.bit.SPILBK = 1;

    From TRM:

    Loopback mode allows module validation during device testing. This mode is valid only in master mode of the SPI.

    • Reset type: SYSRSn
    • 0h (R/W) = SPI loopback mode disabled. This is the default value after reset.
    • 1h (R/W) = SPI loopback mode enabled, SIMO/SOMI lines are connected internally. Used for module self-tests.