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.

RM46L852ZWT SPI5 parallel mode transfer problem



Hi,

I am trying to use SPI5 in parallel mode and I am getting a problem to transmit data correctly. I am using a RM46 HDK board with  a test program sending 16 bit word with 2 line parallel mode (master). The SOMI/SIMO pins are connected outside with an external loopback. What is observed:

Single line line transfer:  OK

Two line transfer with internal loopback enabled: OK

Two line transfer with external   loopback  (SIMO/SOMI,   SIMO1/SOMI1 paired):    Low 8 bits transferred correctly,  high 8 bits are always 0xFF and look like the SOMI1 pin is floating.

I checked the lines and I see valid transmissions on each pair and 8 clocks (as it should be in 2 line mode). I tried  to use   SOMI1 as a GPIO and I see the line  toggling which means there is no cold joints and the line has a driver.

The chip on the board is labeled as    

xRM46L852ZWTT  

YFA-25A618W

Is it  a prototype chip mistake? There is no errata for this behavior.

Regards, Dmitri

   

  • Hi,

    Here is the source code I used:

    /** @file sys_main.c
    * @brief Application main file
    * @date 7.January.2013
    * @version 03.04.00
    *
    * This file contains an empty main function,
    * which can be used for the application.
    */

    /* (c) Texas Instruments 2009-2013, All rights reserved. */

    /* USER CODE BEGIN (0) */
    /* USER CODE END */

    /* Include Files */

    #include "sys_common.h"
    #include "system.h"

    /* USER CODE BEGIN (1) */
    #include "reg_mibspi.h"


    //bits definitions for SPIGCR1 register
    #define SPI_EN (1<<24U)
    #define SPI_LOOPBACK (1<<16U)
    #define SPI_POWERDOWN (1<<8U)
    #define SPI_CLKMOD (1<<1U)
    #define SPI_MASTER 1


    //bits definition for SPIPC0 register
    #define SPI_SOMI1FUN (0x2 <<24U)
    #define SPI_SIMO1FUN (0x2 <<16U)
    #define SPI_SOMIFUN (1<<11U)
    #define SPI_SIMOFUN (1<<10U)
    #define SPI_CLKFUN (1<<9U)
    #define SPI_ENFUN (1<<8U)
    #define SPI_CS0FUN (0x1U)


    //bits definition for SPIDAT1 register
    #define SPI_CSHOLD (1<<28U)
    #define SPI_WDEL (1<<26U)
    #define SPI_DFSEL0 0
    #define SPI_DFSEL1 (1<<24U)
    #define SPI_DFSEL2 (2<<24U)
    #define SPI_DFSEL3 (3<<24U)

    //bits definition for IOLPKTSTCR register
    #define SPI_DIGITAL_TX_LOOPBACK (0)
    #define SPI_DIGITAL_RX_LOOPBACK (1)
    #define SPI_ANALOG_TX_LOOPBACK (2)
    #define SPI_ANALOG_RX_LOOPBACK (3)
    #define IOLPBKSTENA (0x0A<<8U)
    #define IOLPBKSTDIS (0x05<<8U)

    #define CS0 (1)
    #define CS_NONE (0xFF)

    #define TX_DATA (0x0201)

    mibspiRAM_t * mibspi_debug;
    mibspiBASE_t *mibspiREG_debug;

    void spi_init(mibspiBASE_t * mibspi);

    /* USER CODE END */

    /** @fn void main(void)
    * @brief Application main function
    * @note This function is empty by default.
    *
    * This function is called after startup.
    * The user can use this function to implement the application.
    */

    /* USER CODE BEGIN (2) */
    /* USER CODE END */

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    unsigned short res_int_digi, res_int_tx_analog, res_int_rx_analog, res_ext;

    mibspi_debug = mibspiRAM1;
    mibspiREG_debug = mibspiREG5;
    res_int_digi = 0;
    res_int_tx_analog = 0;
    res_int_rx_analog = 0;
    res_ext = 0;

    spi_init(mibspiREG5);

    // Setting Internal Loopback
    mibspiREG5->GCR1 = SPI_LOOPBACK | SPI_CLKMOD | SPI_MASTER | SPI_EN;

    mibspiREG5->DAT1 = (CS0<<16) | TX_DATA;

    while( (mibspiREG5->FLG & 0x100) == 0){} /*wait for transmission finished */

    res_int_digi = mibspiREG5->BUF;

    spi_init(mibspiREG5);
    mibspiREG5->GCR1 = SPI_CLKMOD | SPI_MASTER | SPI_EN;

    mibspiREG5->DAT1 = (CS0<<16) | TX_DATA;

    while( (mibspiREG5->FLG & 0x100) == 0){} /*wait for transmission finished */

    res_ext = mibspiREG5->BUF;


    if(res_int_digi != TX_DATA){

    while(1){} /* internal digital loop back error*/
    }

    if(res_ext != TX_DATA){

    while(1){} /* external RX path loop back error*/
    }

    while(1){

    } /* loop forever */

    /* USER CODE END */
    }

    /* USER CODE BEGIN (4) */

    void spi_init(mibspiBASE_t * mibspi){

    // Resetting the Module

    mibspi->GCR0 = 0U ;
    // Disabling Reset

    mibspi->GCR0 = 1U ;

    // Setting mibspi pins to functional mode
    mibspi->PCFUN = SPI_SOMI1FUN| SPI_SIMO1FUN|SPI_SOMIFUN|SPI_SIMOFUN|SPI_CLKFUN| SPI_CS0FUN;

    // Setting Format 0
    mibspi->CSDEF = CS_NONE;
    mibspi->FMT0 = 0x10 | (5U<<8U);

    // Setting 2 parallel line support for FMT0
    mibspi->PMCTRL = 1U;

    // Pull control disabled all pins
    mibspi->PCDIS = 0xffffffff;

    mibspi->PCPSL = 0;

    }

    /* USER CODE END */

  • Hi,

    I also tried to activate internal analog back loop path with and the result is even more curios:  I don't see RX path working at all. TX path is Ok. Here is the code:

    /** @file sys_main.c
    * @brief Application main file
    * @date 7.January.2013
    * @version 03.04.00
    *
    * This file contains an empty main function,
    * which can be used for the application.
    */

    /* (c) Texas Instruments 2009-2013, All rights reserved. */

    /* USER CODE BEGIN (0) */
    /* USER CODE END */

    /* Include Files */

    #include "sys_common.h"
    #include "system.h"

    /* USER CODE BEGIN (1) */
    #include "reg_mibspi.h"


    //bits definitions for SPIGCR1 register
    #define SPI_EN (1<<24U)
    #define SPI_LOOPBACK (1<<16U)
    #define SPI_POWERDOWN (1<<8U)
    #define SPI_CLKMOD (1<<1U)
    #define SPI_MASTER 1


    //bits definition for SPIPC0 register
    #define SPI_SOMI1FUN (0x2 <<24U)
    #define SPI_SIMO1FUN (0x2 <<16U)
    #define SPI_SOMIFUN (1<<11U)
    #define SPI_SIMOFUN (1<<10U)
    #define SPI_CLKFUN (1<<9U)
    #define SPI_ENFUN (1<<8U)
    #define SPI_CS0FUN (0x1U)


    //bits definition for SPIDAT1 register
    #define SPI_CSHOLD (1<<28U)
    #define SPI_WDEL (1<<26U)
    #define SPI_DFSEL0 0
    #define SPI_DFSEL1 (1<<24U)
    #define SPI_DFSEL2 (2<<24U)
    #define SPI_DFSEL3 (3<<24U)

    //bits definition for IOLPKTSTCR register
    #define SPI_DIGITAL_TX_LOOPBACK (0)
    #define SPI_DIGITAL_RX_LOOPBACK (1)
    #define SPI_ANALOG_TX_LOOPBACK (2)
    #define SPI_ANALOG_RX_LOOPBACK (3)
    #define IOLPBKSTENA (0x0A<<8U)
    #define IOLPBKSTDIS (0x05<<8U)

    #define CS0 (1)
    #define CS_NONE (0xFF)

    #define TX_DATA (0x0201)

    mibspiRAM_t * mibspi_debug;
    mibspiBASE_t *mibspiREG_debug;

    void spi_init(mibspiBASE_t * mibspi);

    /* USER CODE END */

    /** @fn void main(void)
    * @brief Application main function
    * @note This function is empty by default.
    *
    * This function is called after startup.
    * The user can use this function to implement the application.
    */

    /* USER CODE BEGIN (2) */
    /* USER CODE END */

    void main(void)
    {
    /* USER CODE BEGIN (3) */
    unsigned short res_int_digi, res_int_tx_analog, res_int_rx_analog, res_ext;

    mibspi_debug = mibspiRAM1;
    mibspiREG_debug = mibspiREG5;
    res_int_digi = 0;
    res_int_tx_analog = 0;
    res_int_rx_analog = 0;
    res_ext = 0;

    spi_init(mibspiREG5);

    // Setting Internal Loopback
    mibspiREG5->GCR1 = SPI_LOOPBACK | SPI_CLKMOD | SPI_MASTER | SPI_EN;

    mibspiREG5->DAT1 = (CS0<<16) | TX_DATA;

    while( (mibspiREG5->FLG & 0x100) == 0){} /*wait for transmission finished */

    res_int_digi = mibspiREG5->BUF;


    // Setting External analog RX loopback


    spi_init(mibspiREG5);

    mibspiREG5->IOLPKTSTCR = SPI_ANALOG_RX_LOOPBACK;
    mibspiREG5->IOLPKTSTCR |=IOLPBKSTENA;
    mibspiREG5->GCR1 = SPI_CLKMOD | SPI_MASTER | SPI_EN;

    mibspiREG5->DAT1 = (CS0<<16) | TX_DATA;

    while( (mibspiREG5->FLG & 0x100) == 0){} /*wait for transmission finished */

    res_int_rx_analog = mibspiREG5->BUF;

    spi_init(mibspiREG5);

    // Setting External analog TX loopback
    mibspiREG5->IOLPKTSTCR = SPI_ANALOG_TX_LOOPBACK;
    mibspiREG5->IOLPKTSTCR |=IOLPBKSTENA;
    mibspiREG5->GCR1 = SPI_CLKMOD | SPI_MASTER | SPI_EN;


    mibspiREG5->DAT1 = (CS0<<16) | TX_DATA;

    while( (mibspiREG5->FLG & 0x100) == 0){} /*wait for transmission finished */

    res_int_tx_analog = mibspiREG5->BUF;


    if(res_int_digi != TX_DATA){

    while(1){} /* internal digital loop back error*/
    }

    if(res_int_rx_analog != TX_DATA){

    while(1){} /* external RX path loop back error*/
    }

    if(res_int_tx_analog != TX_DATA){

    while(1){} /* external TX path loop back error*/
    }
    while(1){

    } /* loop forever */

    /* USER CODE END */
    }

    /* USER CODE BEGIN (4) */

    void spi_init(mibspiBASE_t * mibspi){

    // Resetting the Module

    mibspi->GCR0 = 0U ;
    // Disabling Reset

    mibspi->GCR0 = 1U ;

    // Setting mibspi pins to functional mode
    mibspi->PCFUN = SPI_SOMI1FUN| SPI_SIMO1FUN|SPI_SOMIFUN|SPI_SIMOFUN|SPI_CLKFUN| SPI_CS0FUN;

    // Setting Format 0
    mibspi->CSDEF = CS_NONE;
    mibspi->FMT0 = 0x10 | (5U<<8U);

    // Setting 2 parallel line support for FMT0
    mibspi->PMCTRL = 0U;

    // Pull control disabled all pins
    mibspi->PCDIS = 0xffffffff;

    mibspi->PCPSL = 0;

    }

    /* USER CODE END */

     

  • Hi Dmitri,

         Thank you for your support of our forum. 

    I just did the same experiment as your described above and found that maybe you forget to set the pinmux function. Did you design the project with the help of our HALCONGEN? if yes, you can enable the mibspi5 in the pinmux tab menu and you will find the pin H18 and J19 are conflicting. what you need to do is unchecking the MIBSPI5SOMI_1 of H18 and MIBSPISOMI_2 of J19. because these two pins are assigned to E17 and H16 in the PCB of our RM46 HDK. After this, you can generate the source code then compiler and download it to the chip. I just tested that it did work.

        Hope it can help you!

    Thanks and Best Regards!

  • Hi Ken,

    It is true I started to work with  HALCONGEN first but went to manual settings because I need more complicated setup. Yes you are right!  It comes from HALCONGEN pinmux. 

    Thanks, Dmitri.


  • Hi Dmitri,

        I am so glad that you fix the problem.Thanks for your support of our forum and Hercules chips.

    Thanks and Best Regards,

    Ken