Skip to main content
jannwaivut
Associate
March 5, 2014
Question

Need help No SPI Signal output

  • March 5, 2014
  • 3 replies
  • 1128 views
Posted on March 05, 2014 at 05:37

Something wrong with dspi ?

I have try debug with code for spi output signal with dspi module, it's not running. need some advide

this my code init :

void initDSPI(void){

SIU.ISEL2.R = 0x0;

DSPI_B.MCR.R = 0x80010000; // Configure DSPI_B as master

DSPI_B.CTAR0.R = 0x78003255;; // Configure CTAR0

//DSPI_B.MCR.B.HALT = 0x0; // Exit HALT mode: go from STOPPED to RUNNING state

SIU.PCR102.R = 0x0600; // DSPI_B_SCK

SIU.PCR103.R = 0x0500; // DSPI_B_SIN

SIU.PCR104.R = 0x0600; // DSPI_B_SOUT

SIU.PCR105.R = 0x0600; // DSPI_B_PCS[0]

}

and this one is code function, it's call in main program :

uint8_t EEPROM_WRITE_CMD(uint8_t cCmd, uint8_t cData){

uint8_t iloop;

if(cCmd == 1){

EEPROM_CS = EEPROM_ON;

DSPI_B.PUSHR.R = 0x08010000 | cData;

for(iloop=0;iloop<0xFF;iloop++);

EEPROM_CS = EEPROM_OFF;

return 0;

}

return 1;

}

thank you

Waivut J.

    This topic has been closed for replies.

    3 replies

    Erwan YVIN
    ST Employee
    March 10, 2014
    Posted on March 10, 2014 at 11:36

    Hello Waivut J ,

    Could you confirm the Microcontroller unit used ?

    For your information, there are some DSPI Test Applications in SPC5Studio 2.0

    You can import it by using SPC5Studio Wizard (Novel Users)

    I have put the source code in attachment (Low Level drivers and high level drivers)

    Example of Test Application:

    /*

    * Application entry point.

    */

    int main(void) {

    unsigned i;

    /* Initialization of all the imported components in the order specified in

    the application wizard. The function is generated automatically.*/

    componentsInit();

    /* Prepare transmit pattern.*/

    for (i = 0; i < sizeof(txbuf); i++)

    txbuf[i] = (uint8_t)i;

    /* Starting driver for test, DSPI_0 I/O pins setup.*/

    spiStart(&SPID1, &spi_config_low_speed);

    SIU.PCR[37].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SCK */

    SIU.PCR[38].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* SOUT */

    SIU.PCR[36].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[0] */

    SIU.PCR[54].R = PAL_MODE_OUTPUT_ALTERNATE(1); /* CS[2] */

    /* Testing sending and receiving at the same time.*/

    spiExchange(&SPID1, 4, txbuf, rxbuf);

    spiExchange(&SPID1, 32, txbuf, rxbuf);

    spiExchange(&SPID1, 512, txbuf, rxbuf);

    /* Testing clock pulses without data buffering.*/

    spiIgnore(&SPID1, 4);

    spiIgnore(&SPID1, 32);

    /* Testing sending data ignoring incoming data.*/

    spiSend(&SPID1, 4, txbuf);

    spiSend(&SPID1, 32, txbuf);

    /* Testing receiving data while sending idle bits (high level).*/

    spiReceive(&SPID1, 4, rxbuf);

    spiReceive(&SPID1, 32, rxbuf);

    /* Testing stop procedure.*/

    spiStop(&SPID1);

    /* Testing 16bits wide frames.*/

    spiStart(&SPID1, &spi_config_low_speed_16);

    spiExchange(&SPID1, 4, txbuf, rxbuf);

    spiExchange(&SPID1, 32, txbuf, rxbuf);

    spiExchange(&SPID1, 256, txbuf, rxbuf);

    spiStop(&SPID1);

    /* Application main loop, two SPI configuration are used alternating them.*/

    while (1) {

    palClearPad(PORT_D, PD_LED1); /* LED ON. */

    spiStart(&SPID1, &spi_config_high_speed); /* Setup parameters. */

    spiExchange(&SPID1, 512, txbuf, rxbuf);

    palSetPad(PORT_D, PD_LED1); /* LED OFF. */

    spiStart(&SPID1, &spi_config_low_speed); /* Setup parameters. */

    spiExchange(&SPID1, 512, txbuf, rxbuf);

    }

    }

    Example of Pre-Fill (in SPI LLD)

    /**

    * @brief Prefills the TX FIFO using 8 bits frames.

    *

    * @param[in] spip pointer to the @p SPIDriver object

    * @param[in,out] np pointer to the number of frames to send, must be

    * greater than zero, contains the number of remaining

    * frames on return

    * @param[in,out] txpp pointer to the pointer to the transmit buffer

    *

    * @notapi

    */

    static void spi_dspi_prefill_txfifo8(SPIDriver *spip,

    size_t *np,

    const uint8_t **txpp) {

    uint32_t cmd = spip->config->pushr;

    while (spip->dspi->SR.B.TXCTR < SPC5_DSPI_FIFO_DEPTH) {

    uint32_t frame = **txpp;

    (*txpp)++;

    if (--(*np) == 0) {

    spip->dspi->PUSHR.R = (SPC5_PUSHR_EOQ | cmd | frame) & ~SPC5_PUSHR_CONT;

    break;

    }

    spip->dspi->PUSHR.R = cmd | frame;

    }

    }

    I advice you to herit from these SPI drivers or to update the test application ;)

    Full source code are available in attachment

    Best regards

    Erwan YVIN

    ________________

    Attachments :

    SPC56ELxx_OS-Less_DSPI_Example_Application.zip : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0V2&d=%2Fa%2F0X0000000bZl%2FdrsmS3os1vfcY.KaFZrsXjH5tRzZY6kwuJunXAjkPQ0&asPdf=false
    jannwaivut
    Associate
    March 11, 2014
    Posted on March 11, 2014 at 07:58

    Hi,

    0690X0000060MoRQAU.gifThank youfor your advice. I found the problem now, I forgot to setslew rate control in siu_pcr for sck, sout and sin. and now spi is working.

    ps. I used spc563m64 for my project.

    Best regards

    Waivut J.

    Patriks
    Senior
    August 19, 2014
    Posted on August 19, 2014 at 16:08

    I have a similar problem with SPI on a SPC560D discovery board. I tired to understand the DSPI test application for the discovery board, but it seems that there is no SPI output signal generated.

    For testing purpose, I added following line to the test application to configure the DSPI input pin.

    SIU.

    PCR

    [12].

    B

    .

    IBE

    = 1;

    //PA[12]

    Then, I connected output(PCR[13]) and input(PCR[12]) and used the command

    spiExchange(&SPID1, 32, txbuf, rxbuf);

    to send the content of the txbuf variable (as it is already done in the test application). For my understanding the variable rxbuf should afterwards have the same content as txbuf within the first 32 elements. But in my case, the first 32 entries of rxbuf have the value 0xFF.

    By the way, I found an error in the User Manual UM1681 for the SPC560D-DIS discovery board. The pinning of the I/O header shown in table 4 is not the same as shown in figure 14. There is at least one error e.g. at connector X2, pin 31. In the table it is PF[13] but in the figure it is PA[13].

    Best regards,

    Patrik