TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28379D最为spi的从机,从机向主机发送数据?使用哪个函数?

TMS320F28379D最为spi的从机,从机向主机发送数据?使用哪个函数?

Susan Yang:

建议您先参考一下C200ware内的 spi_ex3_external_loopback_fifo_interrupts

C:\ti\c2000\C2000Ware_2_00_00_02\driverlib\f2837xd\examples\cpu1\spi

//#############################################################################
//
// FILE:spi_ex3_external_loopback_fifo_interrupt.c
//
// TITLE:SPI Digital Loopback with FIFO Interrupts
//
//! \addtogroup driver_example_list
//! <h1>SPI Digital External Loopback with FIFO Interrupts</h1>
//!
//! This program uses the external loopback between two SPI modules. Both
//! the SPI FIFOs and their interrupts are used. SPIA is configured as a slave
//! and receives data from SPI B which is configured as a master.
//!
//! A stream of data is sent and then compared to the received stream.
//! The sent data looks like this: \n
//!0000 0001 \n
//!0001 0002 \n
//!0002 0003 \n
//!.... \n
//!FFFE FFFF \n
//!FFFF 0000 \n
//!etc.. \n
//! This pattern is repeated forever.
//!
//! \b External \b Connections \n
//!-GPIO25 and GPIO17 - SPISOMI
//!-GPIO24 and GPIO16 - SPISIMO
//!-GPIO27 and GPIO19 - SPISTE
//!-GPIO26 and GPIO18 - ***
//!
//! \b Watch \b Variables \n
//!- \b sData - Data to send
//!- \b rData - Received data
//!- \b rDataPoint - Used to keep track of the last position in the receive
//!stream for error checking
//!
//
//#############################################################################
// $TI Release: F2837xD Support Library v3.06.00.00 $
// $Release Date: Mon May 27 06:48:24 CDT 2019 $
// $Copyright:
// Copyright (C) 2013-2019 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.
// $
//#############################################################################//
// Included Files
//
#include "driverlib.h"
#include "device.h"//
// Globals
//
volatile uint16_t sData[2];// Send data buffer
volatile uint16_t rData[2];// Receive data buffer
volatile uint16_t rDataPoint = 0;// To keep track of where we are in the// data stream to check received data//
// Function Prototypes
//
void initSPIBMaster(void);
void initSPIASlave(void);
void configGPIOs(void);
__interrupt void spibTxFIFOISR(void);
__interrupt void spiaRxFIFOISR(void);//
// Main
//
void main(void)
{uint16_t i;//// Initialize device clock and peripherals//Device_init();//// Disable pin locks and enable internal pullups.//Device_initGPIO();//// Initialize PIE and clear PIE registers. Disables CPU interrupts.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).//Interrupt_initVectorTable();//// Interrupts that are used in this example are re-mapped to ISR functions// found within this file.//Interrupt_register(INT_SPIB_TX, &spibTxFIFOISR);Interrupt_register(INT_SPIA_RX, &spiaRxFIFOISR);//// Configure GPIOs for external loopback.//configGPIOs();//// Set up SPI B as master, initializing it for FIFO mode//initSPIBMaster();//// Set up SPI A as slave, initializing it for FIFO mode//initSPIASlave();//// Initialize the data buffers//for(i = 0; i < 2; i++){sData[i] = i;rData[i]= 0;}//// Enable interrupts required for this example//Interrupt_enable(INT_SPIA_RX);Interrupt_enable(INT_SPIB_TX);//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop forever. Suspend or place breakpoints to observe the buffers.//while(1){;}
}//
// Function to configure SPI B as master with FIFO enabled.
//
void initSPIBMaster(void)
{//// Must put SPI into reset before configuring it//SPI_disableModule(SPIB_BASE);//// SPI configuration. Use a 500kHz *** and 16-bit word size.//SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,SPI_MODE_MASTER, 500000, 16);SPI_disableLoopback(SPIB_BASE);SPI_setEmulationMode(SPIB_BASE, SPI_EMULATION_FREE_RUN);//// FIFO and interrupt configuration//SPI_enableFIFO(SPIB_BASE);SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_TXFF);SPI_setFIFOInterruptLevel(SPIB_BASE, SPI_FIFO_TX2, SPI_FIFO_RX2);SPI_enableInterrupt(SPIB_BASE, SPI_INT_TXFF);//// Configuration complete. Enable the module.//SPI_enableModule(SPIB_BASE);
}//
// Function to configure SPI A as slave with FIFO enabled.
//
void initSPIASlave(void)
{//// Must put SPI into reset before configuring it//SPI_disableModule(SPIA_BASE);//// SPI configuration. Use a 500kHz *** and 16-bit word size.//SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,SPI_MODE_SLAVE, 500000, 16);SPI_disableLoopback(SPIA_BASE);SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);//// FIFO and interrupt configuration//SPI_enableFIFO(SPIA_BASE);SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_RXFF);SPI_setFIFOInterruptLevel(SPIA_BASE, SPI_FIFO_TX2, SPI_FIFO_RX2);SPI_enableInterrupt(SPIA_BASE, SPI_INT_RXFF);//// Configuration complete. Enable the module.//SPI_enableModule(SPIA_BASE);
}//
// Configure GPIOs for external loopback.
//
void configGPIOs(void)
{//// This test is designed for an external loopback between SPIA// and SPIB.// External Connections:// -GPIO25 and GPIO17 - SPISOMI// -GPIO24 and GPIO16 - SPISIMO// -GPIO27 and GPIO19 - SPISTE// -GPIO26 and GPIO18 - ***////// GPIO17 is the SPISOMIA.//GPIO_setMasterCore(17, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_17_SPISOMIA);GPIO_setPadConfig(17, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC);//// GPIO16 is the SPISIMOA clock pin.//GPIO_setMasterCore(16, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_16_SPISIMOA);GPIO_setPadConfig(16, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);//// GPIO19 is the SPISTEA.//GPIO_setMasterCore(19, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_19_SPISTEA);GPIO_setPadConfig(19, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC);//// GPIO18 is the ***.//GPIO_setMasterCore(18, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_18_SPICLKA);GPIO_setPadConfig(18, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC);//// GPIO25 is the SPISOMIB.//GPIO_setMasterCore(25, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_25_SPISOMIB);GPIO_setPadConfig(25, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(25, GPIO_QUAL_ASYNC);//// GPIO24 is the SPISIMOB clock pin.//GPIO_setMasterCore(24, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_24_SPISIMOB);GPIO_setPadConfig(24, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(24, GPIO_QUAL_ASYNC);//// GPIO27 is the SPISTEB.//GPIO_setMasterCore(27, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_27_SPISTEB);GPIO_setPadConfig(27, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(27, GPIO_QUAL_ASYNC);//// GPIO26 is the ***.//GPIO_setMasterCore(26, GPIO_CORE_CPU1);GPIO_setPinConfig(GPIO_26_SPICLKB);GPIO_setPadConfig(26, GPIO_PIN_TYPE_PULLUP);GPIO_setQualificationMode(26, GPIO_QUAL_ASYNC);
}//
// SPI A Transmit FIFO ISR
//
__interrupt void spibTxFIFOISR(void)
{uint16_t i;//// Send data//for(i = 0; i < 2; i++){SPI_writeDataNonBlocking(SPIB_BASE, sData[i]);}//// Increment data for next cycle//for(i = 0; i < 2; i++){sData[i] = sData[i] + 1;}//// Clear interrupt flag and issue ACK//SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_TXFF);Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);
}//
// SPI B Receive FIFO ISR
//__interrupt void spiaRxFIFOISR(void)
{uint16_t i;//// Read data//for(i = 0; i < 2; i++){rData[i] = SPI_readDataNonBlocking(SPIA_BASE);}//// Check received data//for(i = 0; i < 2; i++){if(rData[i] != (rDataPoint + i)){// Something went wrong. rData doesn't contain expected data.Example_Fail = 1;ESTOP0;}}rDataPoint++;//// Clear interrupt flag and issue ACK//SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_RXFF);Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);Example_PassCount++;
}//
// End of File
//

TMS320F28379D最为spi的从机,从机向主机发送数据?使用哪个函数?

xu liu2:

回复 Susan Yang:

我参考过这个这个只是主机发从机收从机没有发 送的动作。我想知道要是从机发送该怎么配置一下

TMS320F28379D最为spi的从机,从机向主机发送数据?使用哪个函数?

Susan Yang:

回复 xu liu2:

您可以看一下www.ti.com.cn/…/spruhm8i.pdf

的 18.4.5 SPI 3-Wire Mode Code Examples

Uint16 data;
Uint16 dummy;
SpiaRegs.***.bit.TALK = 1; // Enable Transmit path
SpiaRegs.SPITXBUF = data; // Slave transmits data
while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data rx’d
dummy = SpiaRegs.SPIRXBUF; // Clears junk data from itself

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28379D最为spi的从机,从机向主机发送数据?使用哪个函数?
分享到: 更多 (0)