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.

CC3200 作为 SPI Master

Other Parts Discussed in Thread: CC3200

利用SPI_Transfer函数.一次传一个字节.逻辑分析仪测量MOSI正常.MISO上测量到信号的与函数得到的不同.利用ccs调试,memory里Tx正常(与发出的字节相同),Rx是不知道是什么的字节

  • CC3200提供的有个SPI例程,条件编译包含主机模式和从机模式

    //*****************************************************************************
    //
    // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ 
    // 
    // 
    //  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.
    //
    //*****************************************************************************
    
    //*****************************************************************************
    //
    // Application Name     - SPI Demo
    // Application Overview - The demo application focuses on showing the required 
    //                        initialization sequence to enable the CC3200 SPI 
    //                        module in full duplex 4-wire master and slave mode(s).
    // Application Details  -
    // http://processors.wiki.ti.com/index.php/CC32xx_SPI_Demo
    // or
    // docs\examples\CC32xx_SPI_Demo.pdf
    //
    //*****************************************************************************
    
    
    //*****************************************************************************
    //
    //! \addtogroup SPI_Demo
    //! @{
    //
    //*****************************************************************************
    
    // Standard includes
    #include <string.h>
    
    // Driverlib includes
    #include "hw_types.h"
    #include "hw_memmap.h"
    #include "hw_common_reg.h"
    #include "hw_ints.h"
    #include "spi.h"
    #include "rom.h"
    #include "rom_map.h"
    #include "utils.h"
    #include "prcm.h"
    #include "uart.h"
    #include "interrupt.h"
    
    // Common interface includes
    #include "uart_if.h"
    #include "pinmux.h"
    
    
    #define APPLICATION_VERSION     "1.1.1"
    //*****************************************************************************
    //
    // Application Master/Slave mode selector macro
    //
    // MASTER_MODE = 1 : Application in master mode
    // MASTER_MODE = 0 : Application in slave mode
    //
    //*****************************************************************************
    #define MASTER_MODE      0
    
    #define SPI_IF_BIT_RATE  100000
    #define TR_BUFF_SIZE     100
    
    #define MASTER_MSG       "This is CC3200 SPI Master Application\n\r"
    #define SLAVE_MSG        "This is CC3200 SPI Slave Application\n\r"
    
    //*****************************************************************************
    //                 GLOBAL VARIABLES -- Start
    //*****************************************************************************
    static unsigned char g_ucTxBuff[TR_BUFF_SIZE];
    static unsigned char g_ucRxBuff[TR_BUFF_SIZE];
    static unsigned char ucTxBuffNdx;
    static unsigned char ucRxBuffNdx;
    
    #if defined(ccs)
    extern void (* const g_pfnVectors[])(void);
    #endif
    #if defined(ewarm)
    extern uVectorEntry __vector_table;
    #endif
    //*****************************************************************************
    //                 GLOBAL VARIABLES -- End
    //*****************************************************************************
    
    
    
    //*****************************************************************************
    //
    //! SPI Slave Interrupt handler
    //!
    //! This function is invoked when SPI slave has its receive register full or
    //! transmit register empty.
    //!
    //! \return None.
    //
    //*****************************************************************************
    static void SlaveIntHandler()
    {
        unsigned long ulRecvData;
        unsigned long ulStatus;
    
        ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);
    
        MAP_SPIIntClear(GSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);
    
        if(ulStatus & SPI_INT_TX_EMPTY)
        {
            MAP_SPIDataPut(GSPI_BASE,g_ucTxBuff[ucTxBuffNdx%TR_BUFF_SIZE]);
            ucTxBuffNdx++;
        }
    
        if(ulStatus & SPI_INT_RX_FULL)
        {
            MAP_SPIDataGetNonBlocking(GSPI_BASE,&ulRecvData);
            g_ucTxBuff[ucRxBuffNdx%TR_BUFF_SIZE] = ulRecvData;
            Report("%c",ulRecvData);
            ucRxBuffNdx++;
        }
    }
    
    //*****************************************************************************
    //
    //! SPI Master mode main loop
    //!
    //! This function configures SPI modelue as master and enables the channel for
    //! communication
    //!
    //! \return None.
    //
    //*****************************************************************************
    void MasterMain()
    {
    
        unsigned long ulUserData;
        unsigned long ulDummy;
    
        //
        // Initialize the message
        //
        memcpy(g_ucTxBuff,MASTER_MSG,sizeof(MASTER_MSG));
    
        //
        // Set Tx buffer index
        //
        ucTxBuffNdx = 0;
        ucRxBuffNdx = 0;
    
        //
        // Reset SPI
        //
        MAP_SPIReset(GSPI_BASE);
    
        //
        // Configure SPI interface
        //
        MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                         SPI_IF_BIT_RATE,SPI_MODE_MASTER,SPI_SUB_MODE_0,
                         (SPI_SW_CTRL_CS |
                         SPI_4PIN_MODE |
                         SPI_TURBO_OFF |
                         SPI_CS_ACTIVEHIGH |
                         SPI_WL_8));
    
        //
        // Enable SPI for communication
        //
        MAP_SPIEnable(GSPI_BASE);
    
        //
        // Print mode on uart
        //
        Message("Enabled SPI Interface in Master Mode\n\r");
    
        //
        // User input
        //
        Report("Press any key to transmit data....");
    
        //
        // Read a character from UART terminal
        //
        ulUserData = MAP_UARTCharGet(UARTA0_BASE);
    
    
        //
        // Send the string to slave. Chip Select(CS) needs to be
        // asserted at start of transfer and deasserted at the end.
        //
        MAP_SPITransfer(GSPI_BASE,g_ucTxBuff,g_ucRxBuff,50,
                SPI_CS_ENABLE|SPI_CS_DISABLE);
    
        //
        // Report to the user
        //
        Report("\n\rSend      %s",g_ucTxBuff);
        Report("Received  %s",g_ucRxBuff);
    
        //
        // Print a message
        //
        Report("\n\rType here (Press enter to exit) :");
    
        //
        // Initialize variable
        //
        ulUserData = 0;
    
        //
        // Enable Chip select
        //
        MAP_SPICSEnable(GSPI_BASE);
    
        //
        // Loop until user "Enter Key" is
        // pressed
        //
        while(ulUserData != '\r')
        {
            //
            // Read a character from UART terminal
            //
            ulUserData = MAP_UARTCharGet(UARTA0_BASE);
    
            //
            // Echo it back
            //
            MAP_UARTCharPut(UARTA0_BASE,ulUserData);
    
            //
            // Push the character over SPI
            //
            MAP_SPIDataPut(GSPI_BASE,ulUserData);
    
            //
            // Clean up the receive register into a dummy
            // variable
            //
            MAP_SPIDataGet(GSPI_BASE,&ulDummy);
        }
    
        //
        // Disable chip select
        //
        MAP_SPICSDisable(GSPI_BASE);
    }
    
    //*****************************************************************************
    //
    //! SPI Slave mode main loop
    //!
    //! This function configures SPI modelue as slave and enables the channel for
    //! communication
    //!
    //! \return None.
    //
    //*****************************************************************************
    void SlaveMain()
    {
        //
        // Initialize the message
        //
        memcpy(g_ucTxBuff,SLAVE_MSG,sizeof(SLAVE_MSG));
    
        //
        // Set Tx buffer index
        //
        ucTxBuffNdx = 0;
        ucRxBuffNdx = 0;
    
        //
        // Reset SPI
        //
        MAP_SPIReset(GSPI_BASE);
    
        //
        // Configure SPI interface
        //
        MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                         SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0,
                         (SPI_HW_CTRL_CS |
                         SPI_4PIN_MODE |
                         SPI_TURBO_OFF |
                         SPI_CS_ACTIVEHIGH |
                         SPI_WL_8));
    
        //
        // Register Interrupt Handler
        //
        MAP_SPIIntRegister(GSPI_BASE,SlaveIntHandler);
    
        //
        // Enable Interrupts
        //
        MAP_SPIIntEnable(GSPI_BASE,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);
    
        //
        // Enable SPI for communication
        //
        MAP_SPIEnable(GSPI_BASE);
    
        //
        // Print mode on uart
        //
        Message("Enabled SPI Interface in Slave Mode\n\rReceived : ");
    }
    
    //*****************************************************************************
    //
    //! Board Initialization & Configuration
    //!
    //! \param  None
    //!
    //! \return None
    //
    //*****************************************************************************
    static void
    BoardInit(void)
    {
    /* In case of TI-RTOS vector table is initialize by OS itself */
    #ifndef USE_TIRTOS
      //
      // Set vector table base
      //
    #if defined(ccs)
        MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]);
    #endif
    #if defined(ewarm)
        MAP_IntVTableBaseSet((unsigned long)&__vector_table);
    #endif
    #endif
        //
        // Enable Processor
        //
        MAP_IntMasterEnable();
        MAP_IntEnable(FAULT_SYSTICK);
    
        PRCMCC3200MCUInit();
    }
    
    //*****************************************************************************
    //
    //! Main function for spi demo application
    //!
    //! \param none
    //!
    //! \return None.
    //
    //*****************************************************************************
    void main()
    {
        //
        // Initialize Board configurations
        //
        BoardInit();
    
        //
        // Muxing UART and SPI lines.
        //
        PinMuxConfig();
    
        //
        // Enable the SPI module clock
        //
        MAP_PRCMPeripheralClkEnable(PRCM_GSPI,PRCM_RUN_MODE_CLK);
    
        //
        // Initialising the Terminal.
        //
        InitTerm();
    
        //
        // Clearing the Terminal.
        //
        ClearTerm();
    
        //
        // Display the Banner
        //
        Message("\n\n\n\r");
        Message("\t\t   ********************************************\n\r");
        Message("\t\t        CC3200 SPI Demo Application  \n\r");
        Message("\t\t   ********************************************\n\r");
        Message("\n\n\n\r");
    
        //
        // Reset the peripheral
        //
        MAP_PRCMPeripheralReset(PRCM_GSPI);
    
    #if MASTER_MODE
    
        MasterMain();
    
    #else
    
        SlaveMain();
    
    #endif
    
        while(1)
        {
    
        }
    
    }
    
  • Init部分是根据这个demo改的.