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.

msp如何基于tirtos使用两个spi?

Other Parts Discussed in Thread: MSP430F5529

hi,ti的工程师你们好,我遇到了一个问题,请帮忙看看。
使用的硬件;msp430f5529 launchpad
软件;tirtos tirtos_msp43x_2_20_00_06
我的目标是实现可以同时使用两个spi。
问题:tirtos在使用spi的时候需要用到dma的中断,但是因为用了两个spi,在调用SPI_serviceISR函数时有问题。所以怎样设置.cfg里面的中断,才能让SPI_serviceISR()正确的工作?????????
部分代码如下:
Void MSP_EXP430F5529LP_isrDMA(UArg arg)
{
/* Call the SPI DMA function, passing the SPI handle used for WiFi */

SPI_serviceISR((SPI_Handle) &(SPI_config[1])); //这里的入参应该是根据调用的是SPI_config[0]或者SPI_config[1],但是不知道怎么传递过来
//我尝试在这边加入全局变量来判断,但是程序在运行第二次SPI_transfer的时候就卡住了

}
///////////.cfg文件里增加

var hwiParams = new halHwi.Params();
hwiParams.arg = 0; //////////////如何修改这里为一个变量?????????????????????????????????????????
halHwi.create(50, "&MSP_EXP430F5529LP_isrDMA", hwiParams);
/////////////////////////
/*
* =============================== SPI ===============================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiUSCIBDMAHWAttrs, ".const:spiUSCIBDMAHWAttrs")
#endif

#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPIUSCIADMA.h>
#include <ti/drivers/spi/SPIUSCIBDMA.h>

SPIUSCIADMA_Object spiUSCIADMAObjects[MSP_EXP430F5529LP_SPICOUNT]; ///MSP_EXP430F5529LP_SPICOUNT =1
SPIUSCIBDMA_Object spiUSCIBDMAObjects[MSP_EXP430F5529LP_SPICOUNT];
uint8_t spiUSCIADMAscratchBuf[MSP_EXP430F5529LP_SPICOUNT];
uint8_t spiUSCIBDMAscratchBuf[MSP_EXP430F5529LP_SPICOUNT];
const SPIUSCIBDMA_HWAttrs spiUSCIBDMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT] = {
{
.baseAddr = USCI_B0_BASE,
.clockSource = USCI_B_SPI_CLOCKSOURCE_SMCLK,
.bitOrder = USCI_B_SPI_MSB_FIRST,
.scratchBufPtr = &spiUSCIBDMAscratchBuf[0],
.defaultTxBufValue = 0,

/* DMA */
.dmaBaseAddr = DMA_BASE,
/* Rx Channel */
.rxDMAChannelIndex = DMA_CHANNEL_2,
.rxDMASourceTrigger = DMA_TRIGGERSOURCE_18,
/* Tx Channel */
.txDMAChannelIndex = DMA_CHANNEL_0,
.txDMASourceTrigger = DMA_TRIGGERSOURCE_19
}

};

const SPIUSCIADMA_HWAttrs spiUSCIADMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT] = {
{
.baseAddr = USCI_A0_BASE,
.clockSource = USCI_A_SPI_CLOCKSOURCE_SMCLK,
.bitOrder = USCI_A_SPI_MSB_FIRST,
.scratchBufPtr = &spiUSCIADMAscratchBuf[0],
.defaultTxBufValue = 0,

/* DMA */
.dmaBaseAddr = DMA_BASE,
/* Rx Channel */
.rxDMAChannelIndex = DMA_CHANNEL_2,
.rxDMASourceTrigger = DMA_TRIGGERSOURCE_16,
/* Tx Channel */
.txDMAChannelIndex = DMA_CHANNEL_0,
.txDMASourceTrigger = DMA_TRIGGERSOURCE_17
}
};
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPIUSCIBDMA_fxnTable,
.object = &spiUSCIBDMAObjects[0],
.hwAttrs = &spiUSCIBDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPIUSCIADMA_fxnTable,
.object = &spiUSCIADMAObjects[0],
.hwAttrs = &spiUSCIADMAHWAttrs[0]
},
// {NULL, NULL, NULL},
};

/*
* ======== MSP_EXP430F5529LP_initSPI ========
*/
void MSP_EXP430F5529LP_initSPI(void)
{
/*
* NOTE: TI-RTOS examples configure USCIB0 as either SPI or I2C. Thus,
* a conflict occurs when the I2C & SPI drivers are used simultaneously in
* an application. Modify the pin mux settings in this file and resolve the
* conflict before running your the application.
*/

/* SPI CLK */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN2);
/* MOSI/SIMO */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN0);
/* MISO/SOMI */
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3, GPIO_PIN1);

/* SPI CLK */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN7);
/* MOSI/SIMO */
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P3, GPIO_PIN3);
/* MISO/SOMI */
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3, GPIO_PIN4);

SPI_init();
}

我已经确认了的事情:
1,单独使用其中一个配置是没有问题的。
2,两个同时用到 时候问题出在没有正确的进入SPI_serviceISR()函数。这个函数需要传入正确的入参,但是我没有找到正确的方法。

  • 自己问题只能是自己解决了。。。。。。。
    参考代码:e2e.ti.com/.../2568112
    void MSP_EXP430F5529LP_isrDMA(UArg arg)
    {


    SPIUSCIADMA_HWAttrs const *hwAttrsA;
    SPIUSCIBDMA_HWAttrs const *hwAttrsB;

    hwAttrsA = ((SPI_Handle)&(SPI_config[1]))->hwAttrs;
    hwAttrsB = ((SPI_Handle)&(SPI_config[0]))->hwAttrs;


    //Call the SPI DMA function, passing the SPI handle used for WiFi
    if(DMA_getInterruptStatus(hwAttrsA->txDMAChannelIndex) == DMA_INT_ACTIVE||
    DMA_getInterruptStatus(hwAttrsA->rxDMAChannelIndex) == DMA_INT_ACTIVE
    ){
    //DMA_clearInterrupt(hwAttrsA->txDMAChannelIndex);
    //DMA_clearInterrupt(hwAttrsA->rxDMAChannelIndex);
    //NOTE: PRINT CAN'T REMOVE AS DELAY
    System_printf("SPIA-SPI_serviceISR------------------\r\n");
    System_flush();
    SPI_serviceISR((SPI_Handle) &(SPI_config[0]));
    }
    if(DMA_getInterruptStatus(hwAttrsB->txDMAChannelIndex) == DMA_INT_ACTIVE||
    DMA_getInterruptStatus(hwAttrsB->rxDMAChannelIndex) == DMA_INT_ACTIVE
    ){
    //DMA_clearInterrupt(hwAttrsB->txDMAChannelIndex);
    //DMA_clearInterrupt(hwAttrsB->rxDMAChannelIndex);
    //NOTE: PRINT CAN'T REMOVE AS DELAY
    System_printf("SPIB-SPI_serviceISR------------------\r\n");
    System_flush();
    SPI_serviceISR((SPI_Handle) &(SPI_config[1]));
    }
    }

    里面的序号需要根据自己的实际情况来对应。
    嗯,解决这个问题,今天可以很开心了。
  • 很抱歉未能及时回复您的问题!很高兴您能解决问题并分享您的答案!