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.

求一个MSP430G2211的SPI例程

现在要用到MSP4320G2211的SPI 做东西,自己软件模拟的SPI怎么也调不通,求大神分享一个例程,多谢

  • 模拟spi的关键在于时序

    建议用逻辑分析仪或者带存储的示波器观察着时序调

  • 好的 多谢提供思路
  • /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * 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.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x21/G2x31 Demo - SPI full-Duplex 3-wire Master
    //
    //  Description: SPI Master communicates full-duplex with SPI Slave using
    //  3-wire mode. The level on P1.4 is TX'ed and RX'ed to P1.0.
    //  Master will pulse slave reset for synch start.
    //  ACLK = n/a, MCLK = SMCLK = Default DCO
    //
    //  **** used with "msp430g2x21_usi_03.c"   ****
    //
    //                Slave                      Master
    //             MSP430G2x21/G2x31          MSP430G2x21/G2x31
    //             -----------------          -----------------
    //            |              XIN|-    /|\|              XIN|-
    //            |                 |      | |                 |
    //            |             XOUT|-     --|RST          XOUT|-
    //            |                 | /|\    |                 |
    //            |          RST/NMI|--+<----|P1.2             |
    //      LED <-|P1.0             |        |             P1.4|<-
    //          ->|P1.4             |        |             P1.0|-> LED
    //            |         SDI/P1.7|<-------|P1.6/SDO         |
    //            |         SDO/P1.6|------->|P1.7/SDI         |
    //            |        SCLK/P1.5|<-------|P1.5/SCLK        |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  October 2010
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    
    #include <msp430.h>
    
    
    int main(void)
    {
      volatile unsigned int i;
    
      WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
      P1OUT =  0x10;                        // P1.4 set, else reset
      P1REN |= 0x10;                        // P1.4 pullup
      P1DIR = 0x01;                         // P1.0 output, else input
      USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master
      USICTL1 |= USIIE;                     // Counter interrupt, flag remains set
      USICKCTL = USIDIV_4 + USISSEL_2;      // /16 SMCLK
      USICTL0 &= ~USISWRST;                 // USI released for operation
      USISRL = P1IN;                        // init-load data
    
      P1DIR |= 0x04;                        // Reset Slave
      P1DIR &= ~0x04;
      for (i = 0xFFF; i > 0; i--);          // Time for slave to ready
      USICNT = 8;                           // init-load counter
      __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0 w/ interrupt
    }
    
    // USI interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=USI_VECTOR
    __interrupt void universal_serial_interface(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(USI_VECTOR))) universal_serial_interface (void)
    #else
    #error Compiler not supported!
    #endif
    {
      if (0x10 & USISRL)
        P1OUT |= 0x01;
      else
        P1OUT &= ~0x01;
      USISRL = P1IN;
      USICNT = 8;                           // re-load counter
    }
    

  • /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * 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.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x21/G2x31 Demo - SPI full-Duplex 3-wire Slave
    //
    //  Description: SPI Master communicates full-duplex with SPI Slave using
    //  3-wire mode. The level on P1.4 is TX'ed and RX'ed to P1.0.
    //  Master will pulse slave reset for synch start.
    //  ACLK = n/a, MCLK = SMCLK = Default DCO
    //
    //  **** used with "msp430g2x21_usi_02.c"   ****
    //
    //                Slave                      Master
    //             MSP430G2x21/G2x31          MSP430G2x21/G2x31
    //             -----------------          -----------------
    //            |              XIN|-    /|\|              XIN|-
    //            |                 |      | |                 |
    //            |             XOUT|-     --|RST          XOUT|-
    //            |                 | /|\    |                 |
    //            |          RST/NMI|--+<----|P1.2             |
    //      LED <-|P1.0             |        |             P1.4|<-
    //          ->|P1.4             |        |             P1.0|-> LED
    //            |         SDI/P1.7|<-------|P1.6/SDO         |
    //            |         SDO/P1.6|------->|P1.7/SDI         |
    //            |        SCLK/P1.5|<-------|P1.5/SCLK        |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  October 2010
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    
    #include <msp430.h>
    
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
      P1OUT =  0x10;                        // P1.4 set, else reset
      P1REN |= 0x10;                        // P1.4 pullup
      P1DIR = 0x01;                         // P1.0 output, else input
      USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE; // Port, SPI slave
      USICTL1 |= USIIE;                     // Counter interrupt, flag remains set
      USICTL0 &= ~USISWRST;                 // USI released for operation
      USISRL = P1IN;                        // init-load data
      USICNT = 8;                           // init-load counter
    
      __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0 w/ interrupt
    }
    
    // USI interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=USI_VECTOR
    __interrupt void universal_serial_interface(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(USI_VECTOR))) universal_serial_interface (void)
    #else
    #error Compiler not supported!
    #endif
    {
      if (0x10 & USISRL)
        P1OUT |= 0x01;
      else
        P1OUT &= ~0x01;
      USISRL = P1IN;
      USICNT = 8;                           // re-load counter
    }
    

  • /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * 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.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x21/G2x31 Demo - USI SPI Interface with HC165/164 Shift Registers
    //
    //  Description: Demonstrate USI in two-way SPI mode. Data are read from
    //  an HC165, and same data written back to the HC164.
    //  ACLK = n/a  MCLK = SMCLK = default DCO, USICLK = SMCLK/2
    //  //*USART0 control bits are in different SFR's from other MSP430's//
    //
    //                       MSP430G2x21/G2x31
    //                       -----------------
    //                   /|\|              XIN|-
    //                    | |                 |     ^      HC164
    //          HC165     --|RST          XOUT|-    |  -------------
    //        ----------    |                 |     |-|/CLR,B       |  8
    //    8  |      /LD|<---|P1.1   SIMO0/P1.6|------>|A          Qx|--\->
    //   -\->|A-H   CLK|<---|P1.5/SCLK0 - P1.5|------>|CLK          |
    //     |-|INH    QH|--->|P1.7/SOMI0       |       |             |
    //     |-|SER      |    |                 |       |             |
    //     - |         |    |                 |       |             |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  October 2010
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    
    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    
      P1OUT = 0;
      P1OUT |= 0x02;
      P1DIR |= 0x02;
      USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI Master
      USICTL1 |= USICKPH + USIIE;               // Counter interrupt, flag remains set
      USICKCTL = USIDIV_1 + USISSEL_2;          // /2 SMCLK
      USICTL0 &= ~USISWRST;                     // USI released for operation
      USICNT = 8;                               // init-load counter
    
      while (1)                                 // Loop
      {
        unsigned i;
        for (i = 0xFFFF; i > 0; i--);           // Delay
        while (!(USIIFG & USICTL1));            // Counter clear?
        P1OUT &= ~0x02;                         // Latch data into 'HC165
        P1OUT |= 0x02;
    //  ********************                    // Read data are ready to be written
        USICNT = 8;                             // re-load counter
      }
    }
    

  • /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * 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.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x21/G2x31 Demo - USI SPI Interface to TLC549 8-bit ADC
    //
    //   Description: This program demonstrates the USI in SPI mode interface to a
    //   TLC549 8-bit ADC. If AIN > 0.5(REF+ - REF-), P1.0 set, else reset.
    //   ACLK = n/a, MCLK = SMCLK = default DCO, UCICLK = SMCLK/4
    //   //** VCC must be at least 3v for TLC549 **//
    //
    //                       MSP430G2x21/G2x31
    //                       -----------------
    //                   /|\|              XIN|-
    //        TLC549      | |                 |
    //    -------------   --|RST          XOUT|-
    //   |           CS|<---|P1.1             |
    //   |      DATAOUT|--->|P1.7/SOMI    P1.0|-->LED
    // ~>|AIN   I/O CLK|<---|P1.5/SCLK        |
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  October 2010
    //  Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    
    #include <msp430.h>
    
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      P1OUT = 0;
      P1DIR |= 0x03;
      USICTL0 |= USIPE7 + USIPE5 + USIMST + USIOE; // Port, SPI master
      USICTL1 |= USIIE;                         // Counter interrupt, flag remains set
      USICKCTL = USIDIV_2 + USISSEL_2;          // /4 SMCLK
      USICTL0 &= ~USISWRST;                     // USI released for operation
      USICNT = 8;                               // init-load counter
      __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
    }
    
    // USI interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=USI_VECTOR
    __interrupt void universal_serial_interface(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(USI_VECTOR))) universal_serial_interface (void)
    #else
    #error Compiler not supported!
    #endif
    {
      P1OUT |= 0x02;                            // Disable TLC549
      if (USISRL > 0x7F)
        P1OUT |= 0x01;
      else
        P1OUT &= ~0x01;
      P1OUT &= ~0x02;                            // Enable TLC549
      USICNT = 8;                                // re-load counter
    }
    

  • 多谢了,我用IO口模拟SPI已经实现了,不过还是很感谢你的帮助,又多了一种解决方案~
  • 很高兴您能解决问题。模拟SPI跟芯片没关系,所以官方没有相关的例程。但是网络上有很多这样的教程。