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

TMS320F28P650DK: SPI DMA 外部回环通信

feng chen阅读(197)

Part Number:TMS320F28P650DKOther Parts Discussed in Thread:LAUNCHXL-F28P65X

我尝试将F28P65的spi_ex3_external_loopback示例工程修改为DMA传输,但是始终无法成功,无法进入DMA中断,同时使用逻辑分析仪无法捕捉到正常的SPI信号,但如果不使用DMA SPI通信正常,想咨询一下我的代码处理在哪里还有问题。完整工程见附件,我的测试平台是 LAUNCHXL-F28P65X 开发版,使用SPIA作为从,SPID作为主形成外部回环。

//#############################################################################
//
// FILE:spi_ex3_external_loopback.c
//
// TITLE:  SPI Digital Loopback without using FIFOs and Interrupts
//
//! \addtogroup driver_example_list
//! <h1>SPI Digital External Loopback without FIFO Interrupts</h1>
//!
//! This program uses the external loopback between two SPI modules. Both
//! the SPI FIFOs and interrupts are not used in this example. SPIA is
//! configured as a peripheral and SPI B is configured as controller. This example
//! demonstrates full duplex communication where both controller and peripheral transmits
//! and receives data simultaneously.
//!
//
//#############################################################################
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_
//
// 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 "CPU1_RAM/syscfg/board.h"
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include <string.h>

//
// SPI_peripheral
//
#define SPI_peripheral_BASE SPIA_BASE
// slaveSPIA --> SPIA
// GPIO201MOSI --> GPIO16
// GPIO202MISO --> GPIO17
// GPIO203CLK  --> GPIO18
// GPIO204CS--> GPIO57
//
// PICO - MOSI
#define SPI_peripheral_SPIPICO_GPIO 16
#define SPI_peripheral_SPIPICO_PIN_CONFIG GPIO_16_SPIA_PICO
// POCI - MISO
#define SPI_peripheral_SPIPOCI_GPIO 17
#define SPI_peripheral_SPIPOCI_PIN_CONFIG GPIO_17_SPIA_POCI
// CLK - CLK
#define SPI_peripheral_SPICLK_GPIO 18
#define SPI_peripheral_SPICLK_PIN_CONFIG GPIO_18_SPIA_CLK
// PTE - CS
#define SPI_peripheral_SPIPTE_GPIO 57
#define SPI_peripheral_SPIPTE_PIN_CONFIG GPIO_57_SPIA_PTE

//
// SPI_controller Pinmux
//
#define SPI_controller_BASE SPID_BASE
// masterSPIB --> SPID
// GPIO58MOSI --> GPIO91
// GPIO59MISO --> GPIO92
// GPIO60CLK  --> GPIO93
// GPIO61CS--> GPIO94
//
// PICO - MOSI
#define SPI_controller_SPIPICO_GPIO 91
#define SPI_controller_SPIPICO_PIN_CONFIG GPIO_91_SPID_PICO
// POCI - MISO
#define SPI_controller_SPIPOCI_GPIO 92
#define SPI_controller_SPIPOCI_PIN_CONFIG GPIO_92_SPID_POCI
// CLK - CLK
#define SPI_controller_SPICLK_GPIO 93
#define SPI_controller_SPICLK_PIN_CONFIG GPIO_93_SPID_CLK
// PTE - CS
#define SPI_controller_SPIPTE_GPIO 94
#define SPI_controller_SPIPTE_PIN_CONFIG GPIO_94_SPID_PTE

void UserPinMux_init()
{//// PinMux for modules assigned to CPU1//// SPI_peripheral PinmuxGPIO_setPinConfig(SPI_peripheral_SPIPICO_PIN_CONFIG);GPIO_setPadConfig(SPI_peripheral_SPIPICO_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_peripheral_SPIPICO_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_peripheral_SPIPOCI_PIN_CONFIG);GPIO_setPadConfig(SPI_peripheral_SPIPOCI_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_peripheral_SPIPOCI_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_peripheral_SPICLK_PIN_CONFIG);GPIO_setPadConfig(SPI_peripheral_SPICLK_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_peripheral_SPICLK_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_peripheral_SPIPTE_PIN_CONFIG);GPIO_setPadConfig(SPI_peripheral_SPIPTE_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_peripheral_SPIPTE_GPIO, GPIO_QUAL_ASYNC);// SPI_controller PinmuxGPIO_setPinConfig(SPI_controller_SPIPICO_PIN_CONFIG);GPIO_setPadConfig(SPI_controller_SPIPICO_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_controller_SPIPICO_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_controller_SPIPOCI_PIN_CONFIG);GPIO_setPadConfig(SPI_controller_SPIPOCI_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_controller_SPIPOCI_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_controller_SPICLK_PIN_CONFIG);GPIO_setPadConfig(SPI_controller_SPICLK_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_controller_SPICLK_GPIO, GPIO_QUAL_ASYNC);GPIO_setPinConfig(SPI_controller_SPIPTE_PIN_CONFIG);GPIO_setPadConfig(SPI_controller_SPIPTE_GPIO, GPIO_PIN_TYPE_STD);GPIO_setQualificationMode(SPI_controller_SPIPTE_GPIO, GPIO_QUAL_ASYNC);
}

void UserSPI_peripheral_init(){SPI_disableModule(SPI_peripheral_BASE);SPI_setConfig(SPI_peripheral_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,SPI_MODE_PERIPHERAL, 500000, 16);SPI_setPTESignalPolarity(SPI_peripheral_BASE, SPI_PTE_ACTIVE_LOW);SPI_disableFIFO(SPI_peripheral_BASE);SPI_disableLoopback(SPI_peripheral_BASE);SPI_setEmulationMode(SPI_peripheral_BASE, SPI_EMULATION_FREE_RUN);SPI_enableModule(SPI_peripheral_BASE);
}
void UserSPI_controller_init(){SPI_disableModule(SPI_controller_BASE);SPI_setConfig(SPI_controller_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,SPI_MODE_CONTROLLER, 500000, 16);SPI_setPTESignalPolarity(SPI_controller_BASE, SPI_PTE_ACTIVE_LOW);SPI_disableFIFO(SPI_controller_BASE);SPI_disableLoopback(SPI_controller_BASE);SPI_setEmulationMode(SPI_controller_BASE, SPI_EMULATION_FREE_RUN);SPI_enableModule(SPI_controller_BASE);
}
void UserSPI_init(){UserSPI_peripheral_init();UserSPI_controller_init();
}

typedef struct
{uint16_t pinId;//gpio的pin脚uint16_t cpuId;//使用cpu1还是cpu2uint32_t gpioMux;//gpio引脚的复用uint16_t gpioDir;//gpio引脚的方向:输入/输出uint16_t gpioPull;//gpio是否需要上拉uint32_t analogMode; //是否是模拟引脚
}GpioCfg_Stu;

static void gpioX_Init(const GpioCfg_Stu *gpioInit)
{GPIO_setControllerCore(gpioInit->pinId, (GPIO_CoreSelect)gpioInit->cpuId);GPIO_setPinConfig(gpioInit->gpioMux);GPIO_setDirectionMode(gpioInit->pinId, (GPIO_Direction)gpioInit->gpioDir);GPIO_setPadConfig(gpioInit->pinId, gpioInit->gpioPull);if((gpioInit->gpioMux & 0xf) != 0)GPIO_setQualificationMode(gpioInit->pinId, GPIO_QUAL_ASYNC);if (((gpioInit->pinId >= 198U) && (gpioInit->pinId <= 242U)) || (gpioInit->pinId == 42U) || (gpioInit->pinId == 43U)){if(gpioInit->analogMode == GPIO_ANALOG_ENABLED)GPIO_setAnalogMode(gpioInit->pinId, GPIO_ANALOG_ENABLED);elseGPIO_setAnalogMode(gpioInit->pinId, GPIO_ANALOG_DISABLED);}
}

typedef struct SpiPal{uint16_t spiId;uint32_t base;uint32_t msgNum;SPI_Mode mode;SPI_TransferProtocol protocol;SPI_PTEPolarity csPolarity;uint32_t bitRate;uint16_t dataBitWidth;uint8_t busy;void* buff;uint32_t buffSize;struct {GpioCfg_Stu cs, clk, miso, mosi;}gpio;struct {uint32_t dmaChBase;}tx;struct {uint32_t dmaChBase;void (*callback)(void* cbData);void* cbData;uint16_t* pReadBuf;}rx;
}SpiPal_Stu;

#pragma DATA_SECTION(dmaBuff, "ramgs0");
#define MAX_SPI_TXRX_BUFF_LEN256
uint16_t dmaBuff[6][MAX_SPI_TXRX_BUFF_LEN] = {0};
SpiPal_Stu spi[4] = {0};

static SpiPal_Stu* SpiPal_DmaChToSpiHandle(uint32_t dmaChBase)
{uint16_t i = 0;for (i = 0; i < sizeof(spi)/sizeof(spi[0]); i++) {if ((spi[i].tx.dmaChBase == dmaChBase) || (spi[i].rx.dmaChBase == dmaChBase)){return &spi[i];}}return NULL;
}
static void SpiPal_SlaveDmaHandler(SpiPal_Stu* handle, uint32_t chBase)
{DMA_clearErrorFlag(chBase);if (DMA_getOverflowFlag(chBase))return;if (handle->rx.dmaChBase == chBase){// rx dma channalmemcpy(handle->rx.pReadBuf, handle->buff, handle->msgNum);DMA_stopChannel(handle->rx.dmaChBase);DMA_triggerSoftReset(handle->rx.dmaChBase);SPI_disableModule(handle->base);SPI_enableModule(handle->base);handle->busy = 0;if (handle->rx.callback){handle->rx.callback(handle->rx.cbData);}} else if (handle->tx.dmaChBase == chBase){// tx dma channal, do nothingDMA_stopChannel(handle->tx.dmaChBase);DMA_triggerSoftReset(handle->tx.dmaChBase);}else{}
}

#define SPIPAL_DMA_LIST(_do)\_do(1)\_do(2)\_do(3)\_do(4)\_do(5)\_do(6)
#define SPIPAL_IRQ_HANDLER(_ch)\__interrupt void SpiPal_SlaveDmaCh##_ch##Handler(void)\{\SpiPal_Stu* spiHandle = SpiPal_DmaChToSpiHandle(DMA_CH##_ch##_BASE);\SpiPal_SlaveDmaHandler(spiHandle, DMA_CH##_ch##_BASE);\Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP7);\}
SPIPAL_DMA_LIST(SPIPAL_IRQ_HANDLER)

static void* SpiPal_DmaToChIsrHandler(uint32_t chBase)
{switch(chBase){case DMA_CH1_BASE:return SpiPal_SlaveDmaCh1Handler;case DMA_CH2_BASE:return SpiPal_SlaveDmaCh2Handler;case DMA_CH3_BASE:return SpiPal_SlaveDmaCh3Handler;case DMA_CH4_BASE:return SpiPal_SlaveDmaCh4Handler;case DMA_CH5_BASE:return SpiPal_SlaveDmaCh5Handler;case DMA_CH6_BASE:return SpiPal_SlaveDmaCh6Handler;default:return NULL;}
}
static uint32_t SpiPal_DmaToChIsr(uint32_t chBase)
{switch(chBase){case DMA_CH1_BASE:return INT_DMA_CH1;case DMA_CH2_BASE:return INT_DMA_CH2;case DMA_CH3_BASE:return INT_DMA_CH3;case DMA_CH4_BASE:return INT_DMA_CH4;case DMA_CH5_BASE:return INT_DMA_CH5;case DMA_CH6_BASE:return INT_DMA_CH6;default:return 0;}
}
static int32_t SpiPal_RxDmaInit(SpiPal_Stu* spiHandle)
{uint32_t config = 0;if (spiHandle->dataBitWidth == 16)config = DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_16BIT;else if (spiHandle->dataBitWidth == 32)config = DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_32BIT;elsereturn -1;DMA_setEmulationMode(DMA_EMULATION_STOP);DMA_Trigger dmaRxTriggerMap[] = {DMA_TRIGGER_SPIARX, DMA_TRIGGER_SPIBRX, DMA_TRIGGER_SPICRX, DMA_TRIGGER_SPIDRX};DMA_configAddresses(spiHandle->rx.dmaChBase, spiHandle->buff, (uint16_t *)spiHandle->base + SPI_O_RXBUF);DMA_configBurst(spiHandle->rx.dmaChBase, 1U, 0, 1);DMA_configTransfer(spiHandle->rx.dmaChBase, 16U, 0, 1);DMA_configWrap(spiHandle->rx.dmaChBase, 65535U, 0, 65535U, 0);DMA_configMode(spiHandle->rx.dmaChBase, dmaRxTriggerMap[spiHandle->spiId], config);DMA_disableOverrunInterrupt(spiHandle->rx.dmaChBase);DMA_setInterruptMode(spiHandle->rx.dmaChBase, DMA_INT_AT_END);DMA_enableInterrupt(spiHandle->rx.dmaChBase);DMA_enableTrigger(spiHandle->rx.dmaChBase);DMA_stopChannel(spiHandle->rx.dmaChBase);Interrupt_register(SpiPal_DmaToChIsr(spiHandle->rx.dmaChBase), (void (*)(void))SpiPal_DmaToChIsrHandler(spiHandle->rx.dmaChBase));Interrupt_enable(SpiPal_DmaToChIsr(spiHandle->rx.dmaChBase));return 0;
}

static int32_t SpiPal_TxDmaInit(SpiPal_Stu* spiHandle)
{uint32_t config = 0;if (spiHandle->dataBitWidth == 16)config = DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_16BIT;else if (spiHandle->dataBitWidth == 32)config = DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_32BIT;elsereturn -1;DMA_setEmulationMode(DMA_EMULATION_STOP);DMA_Trigger dmaTxTriggerMap[] = {DMA_TRIGGER_SPIATX, DMA_TRIGGER_SPIATX, DMA_TRIGGER_SPIATX, DMA_TRIGGER_SPIATX};DMA_configAddresses(spiHandle->tx.dmaChBase, (uint16_t *)spiHandle->base + SPI_O_TXBUF, spiHandle->buff);DMA_configBurst(spiHandle->tx.dmaChBase, 1U, 1, 0);DMA_configTransfer(spiHandle->tx.dmaChBase, 16U, 1, 0);DMA_configWrap(spiHandle->tx.dmaChBase, 65535U, 0, 65535U, 0);DMA_configMode(spiHandle->tx.dmaChBase, dmaTxTriggerMap[spiHandle->spiId], config);DMA_disableOverrunInterrupt(spiHandle->tx.dmaChBase);DMA_setInterruptMode(spiHandle->tx.dmaChBase, DMA_INT_AT_END);DMA_enableInterrupt(spiHandle->tx.dmaChBase);DMA_enableTrigger(spiHandle->tx.dmaChBase);DMA_stopChannel(spiHandle->tx.dmaChBase);Interrupt_register(SpiPal_DmaToChIsr(spiHandle->tx.dmaChBase), (void (*)(void))SpiPal_DmaToChIsrHandler(spiHandle->tx.dmaChBase));Interrupt_enable(SpiPal_DmaToChIsr(spiHandle->tx.dmaChBase));return 0;
}
static int32_t SpiPal_DmaInit(SpiPal_Stu* spiHandle)
{SpiPal_RxDmaInit(spiHandle);SpiPal_TxDmaInit(spiHandle);return 0;
}

static int32_t SpiPal_PinMux_init(SpiPal_Stu* spiHandle)
{gpioX_Init(&spiHandle->gpio.cs);gpioX_Init(&spiHandle->gpio.clk);gpioX_Init(&spiHandle->gpio.miso);gpioX_Init(&spiHandle->gpio.mosi);return 0;
}

static int32_t SPI_Hw_init(SpiPal_Stu* spiHandle)
{SPI_disableModule(spiHandle->base);SPI_setConfig(spiHandle->base, DEVICE_LSPCLK_FREQ, spiHandle->protocol,spiHandle->mode, spiHandle->bitRate, spiHandle->dataBitWidth);SPI_setPTESignalPolarity(spiHandle->base, spiHandle->csPolarity);SPI_disableFIFO(spiHandle->base);SPI_disableLoopback(spiHandle->base);SPI_setEmulationMode(spiHandle->base, SPI_EMULATION_FREE_RUN);SPI_enableModule(spiHandle->base);return 0;
}

static SpiPal_Stu* SpiPal_idToHandle(uint16_t spiId)
{uint16_t i = 0;for (i = 0; i < sizeof(spi)/sizeof(spi[0]); i++){if(spiId == spi[i].spiId)return &spi[i];}return NULL;
}

static int32_t SpiPal_Request(uint16_t spiId, uint16_t *pWriteBuf, uint16_t *pReadBuf, uint16_t msgNum)
{SpiPal_Stu* handle = SpiPal_idToHandle(spiId);if (handle->busy)return -1;//===DMA spi receivehandle->msgNum = msgNum;handle->rx.pReadBuf = pReadBuf;DMA_configBurst(handle->rx.dmaChBase, 1U, 0, 1);DMA_configTransfer(handle->rx.dmaChBase, msgNum, 0, 1);//===DMA spi sendmemcpy(handle->buff, pWriteBuf, msgNum);DMA_configBurst(handle->tx.dmaChBase, 1U, 1, 0);DMA_configTransfer(handle->tx.dmaChBase, msgNum, 1, 0);DMA_triggerSoftReset(handle->rx.dmaChBase);DMA_triggerSoftReset(handle->tx.dmaChBase);handle->busy = 1;DMA_startChannel(handle->rx.dmaChBase);DMA_startChannel(handle->tx.dmaChBase);return 0;
}

static int32_t SpiPal_Transfer(uint16_t spiId, uint16_t *pWriteBuf, uint16_t *pReadBuf, uint16_t msgNum)
{SpiPal_Stu* handle = SpiPal_idToHandle(spiId);SpiPal_Request(spiId, pWriteBuf, pReadBuf, msgNum);while (handle->busy == 1);return 0;
}

static int32_t SpiPal_Init(SpiPal_Stu* spiHandle)
{int32_t ret = 0;ret = SpiPal_PinMux_init(spiHandle);if (ret != 0)return ret;ret = SPI_Hw_init(spiHandle);if (ret != 0)return ret;ret = SpiPal_DmaInit(spiHandle);if (ret != 0)return ret;return ret;
}


#define SPI_SLAVE_IDX 0
#define SPI_MASTER_IDX 1
#define SPI_SLAVE spi[SPI_SLAVE_IDX]
#define SPI_MASTER spi[SPI_MASTER_IDX]

void UserBoard_init()
{EALLOW;SPI_SLAVE.spiId = 0;SPI_SLAVE.base = SPI_peripheral_BASE;SPI_SLAVE.protocol = SPI_PROT_POL0PHA0;SPI_SLAVE.mode = SPI_MODE_PERIPHERAL;SPI_SLAVE.bitRate = 500000;SPI_SLAVE.dataBitWidth = 16;SPI_SLAVE.csPolarity = SPI_PTE_ACTIVE_LOW;SPI_SLAVE.gpio.cs.pinId = SPI_peripheral_SPIPTE_GPIO;SPI_SLAVE.gpio.cs.cpuId = GPIO_CORE_CPU1;SPI_SLAVE.gpio.cs.gpioMux = SPI_peripheral_SPIPTE_PIN_CONFIG;SPI_SLAVE.gpio.cs.gpioDir = GPIO_DIR_MODE_IN;SPI_SLAVE.gpio.cs.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_SLAVE.gpio.cs.analogMode = GPIO_ANALOG_DISABLED;SPI_SLAVE.gpio.clk.pinId = SPI_peripheral_SPICLK_GPIO;SPI_SLAVE.gpio.clk.cpuId = GPIO_CORE_CPU1;SPI_SLAVE.gpio.clk.gpioMux = SPI_peripheral_SPICLK_PIN_CONFIG;SPI_SLAVE.gpio.clk.gpioDir = GPIO_DIR_MODE_IN;SPI_SLAVE.gpio.clk.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_SLAVE.gpio.clk.analogMode = GPIO_ANALOG_DISABLED;SPI_SLAVE.gpio.miso.pinId = SPI_peripheral_SPIPOCI_GPIO;SPI_SLAVE.gpio.miso.cpuId = GPIO_CORE_CPU1;SPI_SLAVE.gpio.miso.gpioMux = SPI_peripheral_SPIPOCI_PIN_CONFIG;SPI_SLAVE.gpio.miso.gpioDir = GPIO_DIR_MODE_OUT;SPI_SLAVE.gpio.miso.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_SLAVE.gpio.miso.analogMode = GPIO_ANALOG_DISABLED;SPI_SLAVE.gpio.mosi.pinId = SPI_peripheral_SPIPICO_GPIO;SPI_SLAVE.gpio.mosi.cpuId = GPIO_CORE_CPU1;SPI_SLAVE.gpio.mosi.gpioMux = SPI_peripheral_SPIPICO_PIN_CONFIG;SPI_SLAVE.gpio.mosi.gpioDir = GPIO_DIR_MODE_IN;SPI_SLAVE.gpio.mosi.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_SLAVE.gpio.mosi.analogMode = GPIO_ANALOG_DISABLED;SPI_SLAVE.rx.dmaChBase = DMA_CH1_BASE;SPI_SLAVE.tx.dmaChBase = DMA_CH2_BASE;SPI_SLAVE.buff = dmaBuff[0];SPI_MASTER.spiId = 1;SPI_MASTER.base = SPI_controller_BASE;SPI_MASTER.protocol = SPI_PROT_POL0PHA0;SPI_MASTER.mode = SPI_MODE_CONTROLLER;SPI_MASTER.bitRate = 500000;SPI_MASTER.dataBitWidth = 16;SPI_MASTER.csPolarity = SPI_PTE_ACTIVE_LOW;SPI_MASTER.gpio.cs.pinId = SPI_controller_SPIPTE_GPIO;SPI_MASTER.gpio.cs.cpuId = GPIO_CORE_CPU1;SPI_MASTER.gpio.cs.gpioMux = SPI_controller_SPIPTE_PIN_CONFIG;SPI_MASTER.gpio.cs.gpioDir = GPIO_DIR_MODE_OUT;SPI_MASTER.gpio.cs.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_MASTER.gpio.cs.analogMode = GPIO_ANALOG_DISABLED;SPI_MASTER.gpio.clk.pinId = SPI_controller_SPICLK_GPIO;SPI_MASTER.gpio.clk.cpuId = GPIO_CORE_CPU1;SPI_MASTER.gpio.clk.gpioMux = SPI_controller_SPICLK_PIN_CONFIG;SPI_MASTER.gpio.clk.gpioDir = GPIO_DIR_MODE_OUT;SPI_MASTER.gpio.clk.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_MASTER.gpio.clk.analogMode = GPIO_ANALOG_DISABLED;SPI_MASTER.gpio.miso.pinId = SPI_controller_SPIPOCI_GPIO;SPI_MASTER.gpio.miso.cpuId = GPIO_CORE_CPU1;SPI_MASTER.gpio.miso.gpioMux = SPI_controller_SPIPOCI_PIN_CONFIG;SPI_MASTER.gpio.miso.gpioDir = GPIO_DIR_MODE_IN;SPI_MASTER.gpio.miso.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_MASTER.gpio.miso.analogMode = GPIO_ANALOG_DISABLED;SPI_MASTER.gpio.mosi.pinId = SPI_controller_SPIPICO_GPIO;SPI_MASTER.gpio.mosi.cpuId = GPIO_CORE_CPU1;SPI_MASTER.gpio.mosi.gpioMux = SPI_controller_SPIPICO_PIN_CONFIG;SPI_MASTER.gpio.mosi.gpioDir = GPIO_DIR_MODE_OUT;SPI_MASTER.gpio.mosi.gpioPull = GPIO_PIN_TYPE_PULLUP;SPI_MASTER.gpio.mosi.analogMode = GPIO_ANALOG_DISABLED;SPI_MASTER.rx.dmaChBase = DMA_CH3_BASE;SPI_MASTER.tx.dmaChBase = DMA_CH4_BASE;SPI_MASTER.buff = dmaBuff[1];//UserPinMux_init();SpiPal_PinMux_init(&SPI_SLAVE);SpiPal_PinMux_init(&SPI_MASTER);DMA_initController();SpiPal_DmaInit(&SPI_SLAVE);SpiPal_DmaInit(&SPI_MASTER);//UserSPI_init();SPI_Hw_init(&SPI_SLAVE);SPI_Hw_init(&SPI_MASTER);EDIS;
}

uint16_t TxData_Peripheral[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
uint16_t RxData_Peripheral[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint16_t TxData_Controller[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
uint16_t RxData_Controller[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int16_t resault = 0;

//
// 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();//// Board initialization//UserBoard_init();SpiPal_Request(SPI_SLAVE_IDX, TxData_Peripheral, RxData_Peripheral, sizeof(TxData_Peripheral));SpiPal_Transfer(SPI_MASTER_IDX, TxData_Controller, RxData_Controller, sizeof(TxData_Controller)+1);if(0 != memcmp(TxData_Controller, RxData_Peripheral, sizeof(TxData_Peripheral))){resault = -1;ESTOP0;}if(0 != memcmp(TxData_Peripheral, RxData_Controller, sizeof(TxData_Peripheral))){resault = -1;ESTOP0;}// //// // Loop forever. Suspend or place breakpoints to observe the buffers.// //// for(i = 0; i < 16; i++)// {//////// Set the TX buffer of peripheral SPI.//////SPI_writeDataNonBlocking(SPI_peripheral_BASE, TxData_Peripheral[i]);//////// Set the the controller TX buffer. This triggers the data transmission//////SPI_writeDataNonBlocking(SPI_controller_BASE, TxData_Controller[i]);//////// Read the received data//////RxData_Peripheral[i] = SPI_readDataBlockingNonFIFO(SPI_peripheral_BASE);//RxData_Controller[i] = SPI_readDataBlockingNonFIFO(SPI_controller_BASE);//////// Check the received data//////if(RxData_Peripheral[i] != TxData_Controller[i])//{//resault = -1;//ESTOP0;//}//if(RxData_Controller[i] != TxData_Peripheral[i])//{//resault = -1;//ESTOP0;//}// }ESTOP0;resault = 1;//// Loop forever//while(1);
}

spi_ex3_external_loopback.zip

Eirwen:

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

feng chen:

OK,问题解决了,SPI要使用dma必须使能fifo

TMS320F28055: 关于PGA的问题

user78960159阅读(253)

Part Number:TMS320F28055

 请问28055位于ADC前端的PGA是不是没有办法bypass

默认PGAEN位是0,也就是没有使能,那么是不是只有使能以后才能正常采集

Links:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Eirwen:

您好,28055的PGA不能bypass

,

user78960159:

好的 感谢您的帮助

以ADCINA1为例,就是必须要使能该通道的PGA,才可以对信号进行采集对吧

,

Eirwen:

是的

LAUNCHXL-F28P65X: 使用SYSCONFIG TOOLS 修改CLB时钟

user4868504阅读(206)

Part Number:LAUNCHXL-F28P65XOther Parts Discussed in Thread:SYSCONFIG

我在sysconfig里面修改了clb的时钟,如下图,但是发现在Device_init(void)函数中并没有体现出来。

修改了CLBCLKDIV,但是在device中没有看到有修改(但是我修改了外部时钟从25MHZ到20MHZ,确认已经修改过来了)。

现在也不知道CLB运行的时钟是多少,难道需要通过位域的方式来修改寄存器?

Vivian Gao:

感谢您对TI产品的关注! 关于你的咨询,我们正在确认你的问题,稍后回复您。

,

user4868504:

我在这个贴子里找到一些信息,感觉这里有大坑。

TMS320F28P650DK: Max CLB clock when SYSCLK = EPWMCLK = 200 MHz – C2000 microcontrollers forum – C2000Tm︎ microcontrollers – TI E2E support forums

,

Alice:

您好,

     在clocktree tool中修改此项应该会修改CLBCLKCTL寄存器中的TILECLKDIV和CLBCLKDIV位。

     从TRM中查看,这些位似乎是隐藏的,这在我们的文档中是一个错误,会确保在下一版TRM中对此进行修正。

      另一个方面是CLB是否使用同步时钟或异步时钟(由CLBCLKCTL控制)。如果使用同步时钟,时钟将等同于EPWMCLK,由EPWMCLKDIV控制。

      如果使用异步时钟,时钟应该由时钟树工具控制,应该会看到CLBCLKCTL中的保留位发生变化(这些保留位是CLBCLKDIV和TILECLKDIV,它们是隐藏的):

      

,

user4868504:

在使用异步时钟的情况下,然TRM手册,时钟源会来自AUXPLL,如下图

但是按sisconfig,看上去,无论是异步还是同步,应该来自RAWCLK, 甚至和EPWMCLKDIV都没关系,很让人费解。

,

Alice:

您好,

      clocktree假设CLB使用异步时钟,这会让人困惑。我会考虑是否可以更新以更清晰地表达。

     我认为TRM和时钟树之间的RAWCLK和AUXPLL存在命名不匹配。

      我会查找正确的名称应该是什么。

TMS320F2800135: 关于IIC在作为主机发送数据时,波形上只有START送出的情况

奋斗的小趴菜阅读(169)

Part Number:TMS320F2800135

在使用2800135历程时,按照配置能够正常发送数据,波形如下

而在将其移动至用户代码时,出现了在作为在S-A-D..(n)..D-P模式下,只发生了S的情况,波形如下

同时,在进行调试的过程中有对比内部寄存器,发现与预期配置一致,同时在发生此事件时STT位也正常复位 ,这种情况一般是因为什么原因所产生的

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Alice:

您好,

       无法猜测根本原因,建议屏蔽用户其它代码功能,专门测试I2C接口,尝试定位问题

,

奋斗的小趴菜:

目前问题原因已经找到,在配置过程中有一个IO口同时配置了SCL,感谢帮助

TMS320F28377D: 设计并网逆变器或电机驱动

大鹏阅读(802)

Part Number:TMS320F28377DOther Parts Discussed in Thread:CONTROLSUITE

尊敬的TI技术支持,我现在需要使用28379d设计并网逆变器控制程序。想咨询一下TI官方有没有可以参考的官方例程。

关于电机驱动的也行。

我以前在ControlSuite中找到一个SVPWM的例程,但是现在找不到了,您能不能提示一下具体在那个文件夹。

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Daniel:

您好

请您参考如下帖子说明

https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_3119837

以下是部分相关资料

dev.ti.com/…/node

,

大鹏:

感谢您的提示,我已经完成了SVPWM的实现。我还有一个问题就是TI官方有没有关于并网逆变器的例程。最好是系统的,包括采样+PLL+闭环控制。期待您的帮助

,

Daniel:

您好

https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_index.html

请您参考这个库,官方基于这个IC的相关参考设计。

,

lmh l:

您好。请问您的SVPWM资料在哪找的呀,可以推荐一下吗

,

大鹏:

dev.ti.com/…/node

,

lmh l:

好的,非常感谢您

TMS320F280049: 配置CMPSS的低位比较器(CMPSS1_LP)失败

wd k阅读(235)

Part Number:TMS320F280049Other Parts Discussed in Thread:SYSCONFIG

您好!我在配置CMPSS1的HP1与LP2两个引脚,使两个引脚能够触发不同阈值的TZ动作。现在CMPSS1的HP1已经配置成功,按照我所给定的最高电压进行判断(端口电压超过给定电压触发TZ保护),但LP2却不按照给定触发TZ动作。具体情况为:当我将触发阈值设置为1.2V/3.3V时,只要端口有极小电压值就会触发保护;当我将触发阈值设置为3V/3.3V时,端口电压为1V左右时触发TZ动作。下面是程序内容。请问程序是否存在问题,我应该如何修改?

需配置的端口:

宏定义:

#define PVCA_IPK_CMPSS_BASECMPSS1_BASE  //PGA1_IN
#define PVCA_IPK_CMPSS_ASYSCTRL_CMPLPMUXASYSCTL_CMPLPMUX_SELECT_1//通道号应和CMPSS编号一致
#define PVCA_IPK_CMPSS_ASYSCTRL_MUX_VALUE2

CMPSS配置:

setupCMPSSVN_L(PVCA_IPK_CMPSS_BASE,120,330);
void setupCMPSSVN_L(uint32_t base1, float32_t High_limit, float32_t cmp_max_sense )
{CMPSS_enableModule(base1);CMPSS_configDAC(base1, CMPSS_DACVAL_SYSCLK | CMPSS_DACREF_VDDA |CMPSS_DACSRC_SHDW);CMPSS_setDACValueLow(base1, (int16_t)((float32_t)High_limit*(float32_t)4095.0/(float32_t)cmp_max_sense));CMPSS_configLowComparator(base1, CMPSS_INSRC_DAC);CMPSS_configFilterLow(base1,2,10,7);CMPSS_initFilterLow(base1);CMPSS_configOutputsLow(base1, CMPSS_TRIPOUT_SYNC_COMP|CMPSS_TRIP_SYNC_COMP);CMPSS_clearFilterLatchLow(base1);PVA_TZClear=1;PVB_TZClear=1;PVC_TZClear=1;
}

引脚选择(参考宏定义):

ASysCtl_selectCMPLPMux(PVCA_IPK_CMPSS_ASYSCTRL_CMPLPMUX,PVCA_IPK_CMPSS_ASYSCTRL_MUX_VALUE);

EPWM TZ配置:

//--------------------PVC_A_IPK------------------------------------------------//XBAR_setEPWMMuxConfig(XBAR_TRIP9, XBAR_EPWM_MUX01_CMPSS1_CTRIPL);//PVCA_IPKXBAR_enableEPWMMux(XBAR_TRIP9, XBAR_MUX01);EPWM_setTripZoneAction(PVC_PhaseA_PWM_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_HIGH);EPWM_selectDigitalCompareTripInput(PVC_PhaseA_PWM_BASE,EPWM_DC_TRIP_TRIPIN9, EPWM_DC_TYPE_DCBH);EPWM_setTripZoneDigitalCompareEventCondition(PVC_PhaseA_PWM_BASE,EPWM_TZ_DC_OUTPUT_B1, EPWM_TZ_EVENT_DCXH_HIGH);EPWM_setDigitalCompareEventSource(PVC_PhaseA_PWM_BASE,EPWM_DC_MODULE_B, EPWM_DC_EVENT_1, EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);//DCAE1/DCBE1:One-shot TZEPWM_enableTripZoneSignals(PVC_PhaseA_PWM_BASE,EPWM_TZ_SIGNAL_DCBEVT1);//--------------------PVC_VDS------------------------------------------------//

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

user4868504:

如果高侧和低侧的正端接入的是同一个模拟信号,组成一个窗口比较器,这种情况下低侧端输出一般需要接个反相器,这样比较器的负端的值比较好设置。

,

wd k:

您好,我现在将高侧和低侧的正端接入了两个不同的模拟信号,希望能触发两个独立的TZ动作。

,

Eirwen:

是否有运算放大器或任何分压器电路连接至CMPSS引脚? 您能否将输入直接定位到CMPSS中,以验证输入是否为预期电压?

此外,检查您的配置时,我没有发现任何配置问题。 您也可以使用sysconfig来验证初始化代码。 我输入了您的设置,您所拥有的代码是预期的。

TMS320F280039C: 官方的280039c板子例程在c2000ware的哪个位置?需要能编译烧录的例程

mountain goat阅读(195)

Part Number:TMS320F280039COther Parts Discussed in Thread:C2000WARE

官方的280039c板子例程在c2000ware的哪个位置?需要能编译烧录的例程

Taylor:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Taylor:

可以在driverlib或device_support (bit-field)文件夹下的相应f280003x/examples文件夹中找到相应例程。如果为板子进行编译,请确保更改目标配置以选择与板子关联的版本。

TMS320F280039C: 芯片 LSRAM 和 GSRAM 的使用

Light阅读(226)

Part Number:TMS320F280039C

芯片有 LSRAM 和 GSRAM 两个部分,地址分别为:

RAMLS_PROG          : origin = 0x008000, length = 0x004000

RAMGS_PROG         : origin = 0x00C000, length = 0x004000

我将自己的部分程序搬移到 RAMLS_PROG 中时可以运行,但是尝试将程序搬移到 RAMGS_PROG 中时发现程序无法运行。

我想请教一下问题在哪里?RAMGS_PROG  是否可以用来执行程序代码?

Alice:

您好,    可以运行程序。

    请参考TMS320F28003x Real-Time Microcontrollers datasheet (Rev. C) ”Table 7-1. Memory Map“ 查看它们支持的接口功能的区别。

    如有更多疑问,请在您另一个帖子内等待后续回复。

     e2echina.ti.com/…/tms320f280039c-lsram-gsram

TMS320F2800137: fast关于级数多,低电感运行问题

fuqiang fu阅读(182)

Part Number:TMS320F2800137Other Parts Discussed in Thread:LAUNCHXL-F2800137, C2000WARE

我使用LAUNCHXL-F2800137开发板+DRV8323RS带BLDC电机(C2000Ware_MotorControl_SDKV5.03、V5.04),遇到个问题。

我把学习到的电机参数替换user_mtr1.h文件中定义的电机参数,编译下载后运行不正常,电机抖动噪音大。这时候我再进行一次电机学习后,运行就正常了。

实验很多次,一直是这种现象。下面是学习到的电机参数

#define USER_MOTOR1_TYPE MOTOR_TYPE_PM
#define USER_MOTOR1_NUM_POLE_PAIRS (14) //极对数
#define USER_MOTOR1_Rr_Ohm (NULL)
#define USER_MOTOR1_Rs_Ohm (0.0236597694) // (0.393955578f)
#define USER_MOTOR1_Ls_d_H (1.55352217e-05) // (0.000190442806f)
#define USER_MOTOR1_Ls_q_H (1.55352217e-05) // (0.000190442806f)
#define USER_MOTOR1_RATED_FLUX_VpHz (0.0214622617) //(0.0399353318f)

我还有另外一台BLDC电机输入电机参数后运行就是正常的,电机参数:

#define USER_MOTOR1_TYPE MOTOR_TYPE_PM
#define USER_MOTOR1_NUM_POLE_PAIRS (2) //极对数
#define USER_MOTOR1_Rr_Ohm (NULL)
#define USER_MOTOR1_Rs_Ohm (0.106479692f) // (0.393955578f)
#define USER_MOTOR1_Ls_d_H (0.000354574557f) // (0.000190442806f)
#define USER_MOTOR1_Ls_q_H (0.000354574557f) // (0.000190442806f)
#define USER_MOTOR1_RATED_FLUX_VpHz (0.0901994109f) //(0.0399353318f)

我想请教:TI-Fast关于多级数小电感电机还需要设置哪些参数吗,电机学习后除了上述电机参数外还更改了哪些变量?

Alice:

您好, 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

fuqiang fu:

再更新下实验信息,我找了28027F板子带小电感电机,输入电机参数后,调整下速度环和电流环PI就能够正常运行。

,

Taylor:

FAST算法在识别过程中可能调整了某些隐藏参数,这些参数未在user_mtr1.h中体现。

先进行一次电机识别,检查FAST识别后更新的全局参数,不仅局限在user_mtr1.h中。

,

fuqiang fu:

我监控过所有的变量参数,对比修改过。但是现象依旧,应该是修改了fast库中的变量,我监控不到。或者变量太多我漏掉了!

,

fuqiang fu:

项目来不及先用28027F顶上

,

Taylor:

好的,有时间可以再慢慢找原因。

TMDSCNCD28388D: Configuring clocktree with syscfg compilation error

L T阅读(203)

Part Number:TMDSCNCD28388DOther Parts Discussed in Thread:C2000WARE

First of all, I used c2000ware to import the example program, and everything worked fine when compiling, but the system clock was not what I wanted, so I configured clocktree via syscfg, and added device support, but the compilation would error, and I didn't know what the problem was. Device Support uses the default settings.Please help me see my program. Thanks

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Alice:

您好,  

clocktree工具使用问题请参考(+) TMS320F28386D: 如何使用sysconfig 中的ClockTree Tool工具? – C2000Tm︎ 微控制器论坛 – C2000 微控制器 – E2ETm 设计支持

© 2026 TI中文支持网   网站地图 鲁ICP备2022002796号-1