利用SPI_Transfer函数.一次传一个字节.逻辑分析仪测量MOSI正常.MISO上测量到信号的与函数得到的不同.利用ccs调试,memory里Tx正常(与发出的字节相同),Rx是不知道是什么的字节
gaoyang9992006:
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_MODE0#define SPI_IF_BIT_RATE100000 #define TR_BUFF_SIZE100#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 //! //! \paramNone //! //! \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\tCC3200 SPI Demo Application\n\r");Message("\t\t********************************************\n\r");Message("\n\n\n\r");//// Reset the peripheral//MAP_PRCMPeripheralReset(PRCM_GSPI);#if MASTER_MODEMasterMain();#elseSlaveMain();#endifwhile(1){}}
Yizhou Jiang1:
回复 gaoyang9992006:
Init部分是根据这个demo改的.