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.

TM4C1294NCPDT: SSI MAXIMUM CLOCK CONFIGURATION

Part Number: TM4C1294NCPDT

Tool/software:

Hi TI Team,

I am looking to transfer spi data in maximum speed. In datasheet it has given as 60MHz maximum as shown below,

In my code , I can only give 30MHz maximum. When i give more than that. It does not working.I have mentioned the code below,

void ConfigureSPI(uint32_t Clock)
{
//
// The SSI0 peripheral must be enabled for use.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

//
// Configure the pin muxing for SSI0 functions on PA[5:2].
//
GPIOPinConfigure(GPIO_PA2_SSI0CLK); // PA2 - SSI0CLK
GPIOPinConfigure(GPIO_PA3_SSI0FSS); // PA3 - SSI0Fss
GPIOPinConfigure(GPIO_PA4_SSI0XDAT0); // PA4 - SSI0TX
GPIOPinConfigure(GPIO_PA5_SSI0XDAT1); // PA5 - SSI0RX


GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2);

SSIConfigSetExpClk(SSI0_BASE, Clock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER,30000000, 16);
// SSIConfigSetExpClk(SSI0_BASE, Clock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER,27000000, 8);

// SSIIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)

//
// Enable the SSI0 modules.
//
SSIEnable(SSI0_BASE);

}

Thanks and Regards,

A. Ajith Kumar

  • Hi,

    In my code , I can only give 30MHz maximum. When i give more than that. It does not working

    Can you clarify what does not work when you set it to 60MHz? What is the actual frequency you measure on the scope? At this frequency, I suppose you will have shorter distance to the slave device. 

      In your below call to configure the SSI clock, what is the 'Clock'? It needs to be 120Mhz in order to achieve the highest 60Mhz SSI clock. 

      SSIConfigSetExpClk(SSI0_BASE, Clock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER,30000000, 16);

    I suppose you must have set up your Clock to something like below. Is that correct? What does Clock return? Is it not 120000000?

    Clock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_240), 120000000);

  • Hi Charles Tsai,

    Thanks for your response,

    I have set up my Clock to 120MHz only and I trying to set up spi clock as 60MHz. There is no clock is gotted in output of the SPI clock pin.

    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);

    We can only achieve 30MHz in SPI clock. More than that is set up means, there is no clock is received from spi clock pin.

    Thanks and Regards,

    R. Balaganesh

  • Hi,

    SSIConfigSetExpClk(SSI0_BASE, Clock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER,30000000, 16);

    In your original posting, you pass Clock variable as the source clock to the SSIConfigSetExpClk().

    I have set up my Clock to 120MHz only and I trying to set up spi clock as 60MHz. There is no clock is gotted in output of the SPI clock pin.

    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);

    In your last reply, you have the above system clock setup that returns the system clock frequency to the g_ui32SysClock variable. I just wanted to make sure if you pass 'Clock ' or 'g_ui32SysClock ' to SSIConfigSetExpClk(). 

    What is the value stored in Clock variable when you read it?

    What is the value stored in g_ui32SysClock when you read it?

    We can only achieve 30MHz in SPI clock. More than that is set up means, there is no clock is received from spi clock pin.

    Can you show a scope capture of the SPICLK when you configure for both 30Mhz and 60Mhz?

    Please also tell me if you are running on your own custom board or the LaunchPad? If you are using your own board, do you have the 25Mhz crystal?

    Can you run the same code on a LaunchPad, what do you see?

  • Hi Charles Tsai,

    The variable g_ui32SysClock and clock are the same both are 120MHz. The g_ui32SysClock is the variable and the clock is the attributes of the function.

    ConfigureSPI(g_ui32SysClock );

    I have set up my Clock to 120MHz only and I trying to set up spi clock as 60MHz. There is no clock is gotted in output of the SPI clock pin.

    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);

    We can only achieve 30MHz in SPI clock. More than that is set up means, there is no clock is received from spi clock pin.

    Thanks and Regards,

    A. Ajith Kumar

  • I cannot reproduce your issue on a LaunchPad. See below my capture for 60Mhz on SPICLK.

    Here is the simple code I use. 

    #include <stdbool.h>
    #include <stdint.h>
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/ssi.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/rom.h"
    #include "utils/uartstdio.h"
    
    
    //*****************************************************************************
    //
    //! \addtogroup ssi_examples_list
    //! <h1>SPI Master (spi_master)</h1>
    //!
    //! This example shows how to configure the SSI0 as SPI Master.  The code will
    //! send three characters on the master Tx then polls the receive FIFO until
    //! 3 characters are received on the master Rx.
    //!
    //! This example uses the following peripherals and I/O signals.  You must
    //! review these and change as needed for your own board:
    //! - SSI0 peripheral
    //! - GPIO Port A peripheral (for SSI0 pins)
    //! - SSI0Clk - PA2
    //! - SSI0Fss - PA3
    //! - SSI0Rx  - PA4
    //! - SSI0Tx  - PA5
    //!
    //! The following UART signals are configured only for displaying console
    //! messages for this example.  These are not required for operation of SSI0.
    //! - UART0 peripheral
    //! - GPIO Port A peripheral (for UART0 pins)
    //! - UART0RX - PA0
    //! - UART0TX - PA1
    //!
    //! This example uses the following interrupt handlers.  To use this example
    //! in your own application you must add these interrupt handlers to your
    //! vector table.
    //! - None.
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    // Number of bytes to send and receive.
    //
    //*****************************************************************************
    #define NUM_SSI_DATA            3
    
    
    
    uint32_t ui32SysClock;
    
    //*****************************************************************************
    //
    // Configure SSI0 in master Freescale (SPI) mode.  This example will send out
    // 3 bytes of data, then wait for 3 bytes of data to come in.  This will all be
    // done using the polling method.
    //
    //*****************************************************************************
    int
    main(void)
    {
    #if defined(TARGET_IS_TM4C129_RA0) ||                                         \
        defined(TARGET_IS_TM4C129_RA1) ||                                         \
        defined(TARGET_IS_TM4C129_RA2)
    #endif
    
        uint32_t pui32DataTx[NUM_SSI_DATA];
        uint32_t pui32DataRx[NUM_SSI_DATA];
        uint32_t ui32Index;
    
        //
        // Set the clocking to run directly from the external crystal/oscillator.
        // TODO: The SYSCTL_XTAL_ value must be changed to match the value of the
        // crystal on your board.
        //
    
        ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                                 SYSCTL_OSC_MAIN |
                                                 SYSCTL_USE_PLL |
                                                 SYSCTL_CFG_VCO_240), 120000000);
    
        //
        // The SSI0 peripheral must be enabled for use.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    
        //
        // For this example SSI0 is used with PortA[5:2].  The actual port and pins
        // used may be different on your part, consult the data sheet for more
        // information.  GPIO port A needs to be enabled so these pins can be used.
        // TODO: change this to whichever GPIO port you are using.
        //
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    
        //
        // Configure the pin muxing for SSI0 functions on port A2, A3, A4, and A5.
        // This step is not necessary if your part does not support pin muxing.
        // TODO: change this to select the port/pin you are using.
        //
        GPIOPinConfigure(GPIO_PA2_SSI0CLK);
        GPIOPinConfigure(GPIO_PA3_SSI0FSS);
        GPIOPinConfigure(GPIO_PA4_SSI0XDAT0);
        GPIOPinConfigure(GPIO_PA5_SSI0XDAT1);
    
    
        //
        // Configure the GPIO settings for the SSI pins.  This function also gives
        // control of these pins to the SSI hardware.  Consult the data sheet to
        // see which functions are allocated per pin.
        // The pins are assigned as follows:
        //      PA5 - SSI0Tx
        //      PA4 - SSI0Rx
        //      PA3 - SSI0Fss
        //      PA2 - SSI0CLK
        // TODO: change this to select the port/pin you are using.
        //
        GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
                       GPIO_PIN_2);
    
    
        //
        // Configure and enable the SSI port for SPI master mode.  Use SSI0,
        // system clock supply, idle clock level low and active low clock in
        // freescale SPI mode, master mode, 1MHz SSI frequency, and 8-bit data.
        // For SPI mode, you can set the polarity of the SSI clock when the SSI
        // unit is idle.  You can also configure what clock edge you want to
        // capture data on.  Please reference the datasheet for more information on
        // the different SPI modes.
        //
    
        SSIConfigSetExpClk(SSI0_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0,
                           SSI_MODE_MASTER, 60000000, 16);
    
        //
        // Enable the SSI0 module.
        //
        SSIEnable(SSI0_BASE);
    
        //
        // Read any residual data from the SSI port.  This makes sure the receive
        // FIFOs are empty, so we don't read any unwanted junk.  This is done here
        // because the SPI SSI mode is full-duplex, which allows you to send and
        // receive at the same time.  The SSIDataGetNonBlocking function returns
        // "true" when data was returned, and "false" when no data was returned.
        // The "non-blocking" function checks if there is any data in the receive
        // FIFO and does not "hang" if there isn't.
        //
        while(SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[0]))
        {
        }
    
        //
        // Initialize the data to send.
        //
        pui32DataTx[0] = 's';
        pui32DataTx[1] = 'p';
        pui32DataTx[2] = 'i';
    
    
        //
        // Display indication that the SSI is transmitting data.
        //
    
        //
        // Send 3 bytes of data.
        //
        //for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)
        ui32Index=0;
        while (1)
        {
            //
            // Display the data that SSI is transferring.
            //
    
            //
            // Send the data using the "blocking" put function.  This function
            // will wait until there is room in the send FIFO before returning.
            // This allows you to assure that all the data you send makes it into
            // the send FIFO.
            //
            SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]);
    
        }
    
    
        //
        // Return no errors
        //
        return(0);
    }

    You have never answered the below three questions.

    Can you show a scope capture of the SPICLK when you configure for both 30Mhz and 60Mhz?

    Please also tell me if you are running on your own custom board or the LaunchPad? If you are using your own board, do you have the 25Mhz crystal?

    Can you run the same code on a LaunchPad, what do you see?