Skip to main content
Visitor II
January 6, 2005
Question

Is there anything wrong in my ST10 SPI driver

  • January 6, 2005
  • 3 replies
  • 830 views
Posted on January 06, 2005 at 23:22

Is there anything wrong in my ST10 SPI driver

    This topic has been closed for replies.

    3 replies

    bearjoeAuthor
    Visitor II
    January 6, 2005
    Posted on January 06, 2005 at 04:36

    We use ST10 as the master and ST7 as the slave.

    St7 driver is OK and can communicate with MPC561.

    But our ST10 SPI can connect with ST7.

    We check the polarity, phase and Baudrate, but no problem.

    Now we want to add time delay before and after transfer, but no effect.

    Is there any standard SPI driver code for ST10?

    I search the ST website and find nothing.

    ST10:

    /*

    ============================================================================

    ========= */

    /* spi_st.c - Communication Interface (SPI)

    */

    /*

    ============================================================================

    ========= */

    #include ''reg276.h'' /* register definitions for st10f276*/

    #include ''spi_ft10.h'' /* SPI control register definitions */

    #include ''misc_ft10.h'' /* system code */

    /*

    |

    |***********************************************************************

    |****

    *************

    | | void QSPIInit(void)

    |

    |***********************************************************************

    |****

    *************

    | | Description:

    | | Initiallize the QSPI.

    | |

    | | Input Parameters:

    | | None

    | |

    | | Return:

    | | None

    | |

    |

    |***********************************************************************

    |****

    *************

    \*/

    void QSPIInit(void)

    {

    P3 = 0x0000; // Pin Data Reg.

    DP3 = 0x2200; // P3.8 (MRST) - Input; P3.9 (MTSR) - Output;

    P3.13(SCLK) - Output

    SSCBR = SPI_2M_BaudRate; // Baud Rate Generation - 2M

    SSCCON = 0x4037; // Data Width = 8, SSCPH =1, SSCPO = 0, Master Mode,

    MSB first

    SSCCON |= 0x8000; // SSCEN = 1 to Enter Operating Mode

    P3 = 0x2300; // SSCPO=0, enable alternate data output P3.13=1

    return;

    }

    /*

    |

    |***********************************************************************

    |****

    *************

    | | U16 QSPIWriteRead(U08 device_cs, U16 data)

    |

    |***********************************************************************

    |****

    *************

    | | Description:

    | | Write the command to spi device and read the data from spi device.

    | | Spi delay should follow the spec.

    | |

    | | Input Parameters:

    | | device_cs, data

    | |

    | | Return:

    | | Data received from spi device

    | |

    |

    |***********************************************************************

    |****

    *************

    \*/

    U08 QSPIWriteRead(U08 device_cs, U08 data) {

    U08 SPIReceiveData=0x0;

    device_cs=device_cs;

    /*

    ** Set P6.7 low,Enable Equizzer

    ** Enable SCCEN

    */

    P6 &= 0x7F;

    SSCCON |= 0x8000;

    /* transfer data */

    SSCTB = data;

    /* Wait untill receive and transmit finished,SSCRIC */

    while ( ((SSCRIC & 0x0080) == 0x0)

    || ((SSCTIC & 0x0080) == 0x0)

    || ((SSCCON & 0x1000) == 0x1000) );

    /*Get the correct received bytes*/

    P6 |= 0x80;

    U16_Delay(6);

    SPIReceiveData= (U08)SSCRB;

    /*

    ** Close Equizzer

    ** Disable SCCEN

    */

    SSCCON &= 0x7FFF;

    /* Disable SSCRIR and SSCTIR */

    SSCRIC &= 0xFF7F;

    SSCTIC &= 0xFF7F;

    return (SPIReceiveData);

    }

    ST7:

    /*-----------------------------------------------------------------------

    Copyright 2003 - Visteon Corporation

    *** CONFIDENTIAL AND PROPRIETARY ***

    History:

    20Oct03 S.Lv S7FIFR10 - ST7 FEPS-LESS IVFER Version1.0

    Initial Version

    -----------------------------------------------------------------------*/

    #include ''commonf12.h''

    #include ''spif12.h''

    //----------------------------------------------------------------

    // void SPI_Slave_Initialize(void)

    // Description:

    // Initialize the SPI port

    //

    // Input Parameters:

    // None

    //

    // Return:

    // None

    //----------------------------------------------------------------

    void SPI_Slave_Initialize(void)

    {

    // Clear the SSI bit in SPICSR

    SPICSR = 0x00;

    // Master bit = 0 => Slave mode enabled, (CPOL, CPHA) = (0, 0)

    SPICR = 0x40;

    return;

    }

    //----------------------------------------------------------------

    // U8 Put_Get_Byte(U8 byte_to_send)

    // Description:

    // Send a byte to the primary microprocessor through the SPI.

    // Read a byte from SPI but return it.

    //

    // Parameters:

    // byte_to_send input - byte to put into the SPI

    //

    // Return:

    // U8 read from SPI

    //

    // Function Calls:

    //----------------------------------------------------------------

    U8 Put_Get_Byte(U8 byte_to_send)

    {

    U8 Get_Spi_Data, Temp_Variable;

    // Send SPI output data and enable transfer

    SPIDR = byte_to_send;

    // wait until SPIF = 1 means transfer has been completed

    while((SPICSR & SPIF) == 0){}

    // Clear SPIF Flag

    Get_Spi_Data = SPICSR;

    // Get SPI input data

    Get_Spi_Data = SPIDR;

    return(Get_Spi_Data);

    }

    Visitor II
    January 6, 2005
    Posted on January 06, 2005 at 08:52

    Hi,

    I didn't focuse a lot in your program but you can refer to the discussion in the following link:

    http://mcu.st.com/modules.php?mop=modload&name=Splatt_Forums&file=viewtopic&topic=1903&forum=5

    i think it is useful.

    Bye

    [ This message was edited by: Najoua on 07-01-2005 09:27 ]

    bearjoeAuthor
    Visitor II
    January 6, 2005
    Posted on January 06, 2005 at 23:22

    Yeah, it works. Thanks you

    /* Disable SSCRIR and SSCTIR */

    SSCRIR =0;

    SSCTIR =0;

    /* transfer data */

    SSCTB = data;

    while (SSCTIR==0)

    {

    PatDog();

    }

    SSCTIR=0;

    /* receive data*/

    while (SSCRIR ==0)

    {

    PatDog();

    }

    SPIReceiveData=SSCRB;

    SSCRIR=0;