Skip to main content
Visitor II
June 14, 2007
Question

SPI interrupt too early?

  • June 14, 2007
  • 7 replies
  • 1253 views
Posted on June 14, 2007 at 12:23

SPI interrupt too early?

    This topic has been closed for replies.

    7 replies

    tech9Author
    Visitor II
    June 12, 2007
    Posted on June 12, 2007 at 17:26

    Has anyone tried various speeds for the SPI bus to read an SD card?

    We have found some timing problems when doing so: the interrupt is triggered on the RFNE flag, but the char is not ready, we have to insert a delay before reading it.

    Has anyone solved this without inserting delays in an ISR?

    We are using an STR710 and an STR711, with IAR Embedded Workbench 4.41A

    Thanks!

    Jp

    Visitor II
    June 13, 2007
    Posted on June 13, 2007 at 06:47

    Hi-tech :) ;

    Could you detail how do you have configured clocks MCLK, PCLK1, which BSPI prescaler value do you have used, on which mode the BSPI is configured(Master or slave) and how do you have configured the interruption.

    [ This message was edited by: M3allem on 13-06-2007 10:18 ]

    [ This message was edited by: M3allem on 13-06-2007 10:19 ]

    [ This message was edited by: M3allem on 13-06-2007 10:21 ]

    tech9Author
    Visitor II
    June 13, 2007
    Posted on June 13, 2007 at 14:01

    Hi M3allem,

    MCLK is running at 48 MHz, PCLK1 is at 24MHZ, and we have tried prescalers values for the BSPI at 6, 12, 24, 48 and 60.

    The BSPI is configured as master.

    We send the char, we wait until TFE is set, we then poll the RFNE flag until set, and (after the wait period), read the char.

    If RFNE is set, there should be no need to wait, since the MCU already got something to set it, right?

    Thanks and regards,

    Tech

    Visitor II
    June 13, 2007
    Posted on June 13, 2007 at 14:37

    Hi tech,

    Could you precise how do you get the char: by polling on RFNE or by using the interruption with RFNE?

    tech9Author
    Visitor II
    June 13, 2007
    Posted on June 13, 2007 at 15:26

    Hi M3allem

    Sorry if I mislead you in the beginning...

    We pool RFNE, we do not use the interrupt.

    Thank you.

    Jp

    Visitor II
    June 14, 2007
    Posted on June 14, 2007 at 11:52

    Hi tech,

    I have tested BSPI1 and BSPI0 in communication: BSPI1 in master mode, BSPI0 in salve mode, BSPI1 send a character to BSPI0 which poll RFNE and get this char. I don't have any problem.

    try this code (after you have configured BSPI 0 and 1):

    SendByte = 0xAA;

    /* Send a 8bit data BSPI1 ---> BSPI0*/

    BSPI_ByteBufferSend(BSPI1, (u8 *)&SendByte, 1);

    /* Pool RFNE flag */

    while( BSPI_FlagStatus(BSPI0, BSPI_RFNE) == RESET);

    /* Receive the char using BSPI0 */

    BSPI_ByteBufferReceive(BSPI0, Receivetab, 1);

    /* Display of the recieved data */

    printf(''0x%X\n'', Receivetab[0]);

    /* Infinite loop */

    while (1)

    {

    }

    [ This message was edited by: M3allem on 14-06-2007 15:23 ]

    tech9Author
    Visitor II
    June 14, 2007
    Posted on June 14, 2007 at 12:23

    Thanks for the reply.

    We have found that a dummy read immediately after sending the char helps a lot. Then; the next char to come is the one expected, and there is no longer a need for inserting a delay.

    Hope this could also be useful to someone else, thanks for all the help.

    Thanks and regards,

    Tech