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.

TMS320C6748: ti\C6748_StarterWare_1_20_04_01\examples\lcdkC6748\spi not working

Part Number: TMS320C6748

Hello

I am a new user for TI DSP.

Recently I have bought C6748 development kit (LCDK). I have installed StarterWare kit and trying to work on spi example from "C:\ti\C6748_StarterWare_1_20_04_01\examples\lcdkC6748\spi".

I have modified the SPI1 to SPI0 in the code. As I can easily get the SPI0 pins from the J15 connector in the development board. After deploying the edited code to the development kit and pressing the Resume (F8) button I checked the SPIO_CLK pin which is 25 pin on the J15 connector through oscilloscope but I could not see the clock pulse generated in that pin. Kindly go through my code change and also I attached the screenshot of Registry values of SPI0.

Kindly help me in getting started with working on SPI.

/**
 * \file spi.c
 *
 * \brief  This is a sample application file which invokes some APIs
 *         from the SPI device abstraction layer to perform configuration,
 *         transmission and reception operations.
 */

/*
* Copyright (C) 2012 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.
*/

#include <string.h>
#include "soc_C6748.h"
#include "hw_psc_C6748.h"
#include "lcdkC6748.h"
#include "uart.h"
#include "spi.h"
#include "psc.h"
#include "interrupt.h"
#include "uartStdio.h"

/******************************************************************************
**                      INTERNAL MACRO DEFINITIONS
*******************************************************************************/
/* value to configure SMIO,SOMI,CLK and CS pin as functional pin */
#define SIMO_SOMI_CLK_CS        0x00000E01
#define SIMO_SOMI_CLK_CS_DIR       0x00000601
#define CHAR_LENGTH             0x8

/******************************************************************************
**                      INTERNAL FUNCTION PROTOTYPES
*******************************************************************************/
static void SPIConfigDataFmtReg(unsigned int dataFormat);
static void SpiTransfer(void);
static void SetUpInt(void);
static void SetUpSPI(void);
static void GetStatusCommand(void);
static void ResetCommand(void);
void SPIIsr(void);

/******************************************************************************
**                      INTERNAL VARIABLE DEFINITIONS
*******************************************************************************/

volatile unsigned int flag = 1;
unsigned int tx_len;
unsigned int rx_len;
unsigned char vrf_data[260];
unsigned char tx_data[260];
volatile unsigned char rx_data[260];
unsigned char *p_tx;
volatile unsigned char *p_rx;
volatile unsigned char StatusResponseMessage[16];

/******************************************************************************
**                      INTERNAL FUNCTION DEFINITIONS
*******************************************************************************/
int main(void)
{
    /* Waking up the SPI1 instance. */
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_SPI0, PSC_POWERDOMAIN_ALWAYS_ON,
                     PSC_MDCTL_NEXT_ENABLE);

    /* Initializing the UART instance for serial communication. */
    UARTStdioInit();

    UARTPuts("Welcome to StarterWare SPI application.\r\n\r\n", -1);
    UARTPuts("Here the SPI controller on the SoC communicates with", -1);
    UARTPuts(" the Fingerprint Sensor present on the LCDK.\r\n\r\n", -1);

    /* Performing the Pin Multiplexing for SPI1. */
    SPIPinMuxSetup(0);

    /*
    ** Using the Chip Select(CS) 0 pin of SPI1 to communicate with the Fingerprint Sensor.
    */
    SPI0CSPinMuxSetup(0);

    /* Enable use of SPI1 interrupts. */
    SetUpInt();

    /* Configuring and enabling the SPI1 instance. */
    SetUpSPI();

    while(1)
    {
        ResetCommand();

    }

    /* Issue a Reset to the Fingerprint Sensor */
    ResetCommand();

    UARTPuts("Attempting to Reset the Fingerprint Sensor.\r\n\r\n", -1);

    /* Read the Status of the Fingerprint Sensor */
    GetStatusCommand();

    if(StatusResponseMessage[11] == 0x48)
    {

        UARTPuts("Fingerprint Sensor Successfully Reset.\r\n\r\n", -1);
    }
    else
    {

        UARTPuts("ERROR: Fingerprint Sensor Reset Attempt Unsuccessful.\r\n\r\n", -1);
    }
}

static void GetStatusCommand(void)
{
    unsigned int i;

    // Issue Get Status command and read Status Message Response
    tx_data[0] = 0x80;
    tx_data[1] = 0x10;
    tx_data[2] = 0xBA;
    tx_data[3] = 0x07;
    tx_data[4] = 0x00;
    tx_data[5] = 0x00;
    tx_data[6] = 0x00;
    tx_data[7] = 0xFF;
    tx_data[8] = 0xFF;
    tx_data[9] = 0xFF;
    tx_data[10] = 0xFF;
    tx_data[11] = 0xFF;
    tx_data[12] = 0xFF;
    tx_data[13] = 0xFF;
    tx_data[14] = 0xFF;
    tx_data[15] = 0xFF;
    tx_data[16] = 0xFF;
    tx_data[17] = 0xFF;
    tx_data[18] = 0xFF;
    tx_data[19] = 0xFF;
    tx_data[20] = 0xFF;
    tx_data[21] = 0xFF;
    tx_data[22] = 0xFF;
    tx_len = 23;
    rx_len = 23;

    SPIDat1Config(SOC_SPI_0_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), 0x01);
    SpiTransfer();

    for(i=0;i<16;i++)
    {
        StatusResponseMessage[i] = rx_data[i+7];
    }
}

static void ResetCommand(void)
{
    // Issue Reset Command
    tx_data[0] = 0x80;
    tx_data[1] = 0x14;
    tx_data[2] = 0xBA;
    tx_data[3] = 0x07;
    tx_data[4] = 0x00;
    tx_data[5] = 0x00;
    tx_data[6] = 0x00;

    tx_len = 7;
    rx_len = 7;

    SPIDat1Config(SOC_SPI_0_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), 0x01);
    SpiTransfer();
}

/*
** Configures ARM interrupt controller to generate SPI interrupt
**
*/
static void SetUpInt(void)
{
    // Setup the ARM or DSP interrupt controller

#ifdef _TMS320C6X
    // Initialize the DSP interrupt controller
    IntDSPINTCInit();

    // Register the ISR in the vector table
    IntRegister(C674X_MASK_INT4, SPIIsr);

    // Map system interrupt to the DSP maskable interrupt
    IntEventMap(C674X_MASK_INT4, SYS_INT_SPI0_INT);

    // Enable the DSP maskable interrupt
    IntEnable(C674X_MASK_INT4);

    // Enable DSP interrupts globally
    IntGlobalEnable();
#else
    /* Initialize the ARM Interrupt Controller.*/
    IntAINTCInit();

    /* Register the ISR in the Interrupt Vector Table.*/
    IntRegister(SYS_INT_SPINT0, SPIIsr);

    /* Set the channnel number 2 of AINTC for system interrupt 56.
     * Channel 2 is mapped to IRQ interrupt of ARM9.
    */
    IntChannelSet(SYS_INT_SPINT0, 2);

    /* Enable the System Interrupts for AINTC.*/
    IntSystemEnable(SYS_INT_SPINT0);

    /* Enable IRQ in CPSR.*/
    IntMasterIRQEnable();

    /* Enable the interrupts in GER of AINTC.*/
    IntGlobalEnable();

    /* Enable the interrupts in HIER of AINTC.*/
    IntIRQEnable();
#endif
}

/*
** Configures SPI Controller
**
*/
static void SetUpSPI(void)
{
    unsigned char cs  = 0x01;
    unsigned char dcs = 0x01;
    unsigned int  val = SIMO_SOMI_CLK_CS;
    unsigned int  val1 = SIMO_SOMI_CLK_CS_DIR;
    SPIReset(SOC_SPI_0_REGS);

    SPIOutOfReset(SOC_SPI_0_REGS);

    SPIModeConfigure(SOC_SPI_0_REGS, SPI_MASTER_MODE);

    //SPIClkConfigure(SOC_SPI_1_REGS, 150000000, 20000000, SPI_DATA_FORMAT0);
    SPIClkConfigure(SOC_SPI_0_REGS, 150000000, 1000000, SPI_DATA_FORMAT0);//0

    SPIPinControl(SOC_SPI_0_REGS, 0, 0, &val);
    SPIPinControl(SOC_SPI_0_REGS, 1, 0,&val1  );
    SPIDefaultCSSet(SOC_SPI_0_REGS, dcs);

    /* Configures SPI Data Format Register */
    SPIConfigDataFmtReg(SPI_DATA_FORMAT0);
 
     /* Selects the SPI Data format register to used and Sets CSHOLD
      * to assert CS pin(line)  
      */
    SPIDat1Config(SOC_SPI_0_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), cs);

     /* map interrupts to interrupt line INT1 */
    SPIIntLevelSet(SOC_SPI_0_REGS, SPI_RECV_INTLVL | SPI_TRANSMIT_INTLVL);
    
    /* Enable SPI communication */
    SPIEnable(SOC_SPI_0_REGS);
}
/*
** Configures Data Format register of SPI
**
*/
static void SPIConfigDataFmtReg(unsigned int dataFormat)
{
    /* Configures the polarity and phase of SPI clock */
    /*
    SPIConfigClkFormat(SOC_SPI_1_REGS,
                       (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE),
                       dataFormat);
    */
    SPIConfigClkFormat(SOC_SPI_0_REGS,
                       (SPI_CLK_POL_LOW | SPI_CLK_INPHASE),
                       dataFormat);

    /* Configures SPI to transmit MSB bit First during data transfer */
    SPIShiftMsbFirst(SOC_SPI_0_REGS, dataFormat);

    /* Sets the Charcter length */
    SPICharLengthSet(SOC_SPI_0_REGS, CHAR_LENGTH, dataFormat);
}

/*
** Enables SPI Transmit and Receive interrupt.
** Deasserts Chip Select line.
*/
static void  SpiTransfer(void)
{
    p_tx = &tx_data[0];
    p_rx = &rx_data[0];
    SPIIntEnable(SOC_SPI_0_REGS, (SPI_RECV_INT | SPI_TRANSMIT_INT));
    while(flag);
    flag = 1;
    /* Deasserts the CS pin(line) */
    SPIDat1Config(SOC_SPI_0_REGS, SPI_DATA_FORMAT0, 0x4);
}

/*
** Data transmission and receiption SPIIsr
**
*/
void SPIIsr(void)
{
    unsigned int intCode = 0;

#ifdef _TMS320C6X
    IntEventClear(SYS_INT_SPI0_INT);
#else
    IntSystemStatusClear(56);
#endif

    intCode = SPIInterruptVectorGet(SOC_SPI_0_REGS);

    while (intCode)
    {
        if(intCode == SPI_TX_BUF_EMPTY)
        {
            tx_len--;
            SPITransmitData1(SOC_SPI_0_REGS, *p_tx);
            p_tx++;
            if (!tx_len)
            {
                SPIIntDisable(SOC_SPI_0_REGS, SPI_TRANSMIT_INT);
            }
        }

        if(intCode == SPI_RECV_FULL)
        {
            rx_len--;
            *p_rx = (char)SPIDataReceive(SOC_SPI_0_REGS);
            p_rx++;
            if (!rx_len)
            {
                flag = 0;
                SPIIntDisable(SOC_SPI_0_REGS, SPI_RECV_INT);
            }
        }

        intCode = SPIInterruptVectorGet(SOC_SPI_0_REGS);
    }
}

/******************************* End of file *********************************/

Thank you

Navaneetha krishnan