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.

[参考译文] RTOS/MSP430F5529:如何添加两个 SPI 驱动程序

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/711346/rtos-msp430f5529-how-to-add-two-spi-driver

器件型号:MSP430F5529

工具/软件:TI-RTOS

void MSP_EXP430F5529LP_isrDMA (UARg 参数)

/*调用 SPI DMA 函数、传递用于 WiFi 的 SPI 句柄*/

SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[1]));//如何使用 SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[0])???????


//////////////////// cfg文件里增加 μ A

var hwiParams = new halHwi.Params();
hwiParams.arg = 0;////////////////////////// 如何更改此??????????????????????????????????
halHwi.create (50、"&MSP_EXP430F5529LP_isrDMA"、hwiParams);
/////////////////////////////////////////////////////
/*
*========================================= SPI ========================================================
*
/*放入子段以允许 TI 链接器正确删除项目*/
#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
#pragma DATA_SECTION (spiUSCIBDMAHWAttrs、".const:spiUSCIBDMAHWAttrs")
#endif

#include
#include
#include

SPIUSCIADA_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 SPIUSCIIBDMA_HWAttrs spiUSCIBDMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT]={

baseAddr = USCI_B0_BASE、
时钟源= USCI_B_SPI_CLOCKSOURCE_SMCLK、
.bitOrder = USCI_B_SPI_MSB_FIRST、
.scratchBufPtr =&spiUSCIBDMAscratchBuf[0]、
defaultTxBufValue = 0、

/* DMA */
.dmaBaseAddr = dma_BASE、
/* Rx 通道*/
.rxDMAChannelIndex = DMA_CHANGE_2、
.rxDMASourcedTrigger = DMA_TRIGGERSOURCE_18、
/* Tx 通道*/
TxDMAChannelIndex = DMA_CHANGE_0、
TxDMASourcedTrigger = DMA_TRIGGERSOURCE_19

};

CONST SPIUSCIADA_HWAttrs spiUSCIADMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT]={

baseAddr = USCI_A0_BASE、
时钟源= USCI_A_SPI_CLOCKSOURCE_SMCLK、
.bitOrder = USCI_A_SPI_MSB_FIRST、
.scratchBufPtr =&spiUSCIADMAscratchBuf[0]、
defaultTxBufValue = 0、

/* DMA */
.dmaBaseAddr = dma_BASE、
/* Rx 通道*/
.rxDMAChannelIndex = DMA_CHANGE_2、
.rxDMASourcedTrigger = DMA_TRIGGERSOURCE_16、
/* Tx 通道*/
TxDMAChannelIndex = DMA_CHANGE_0、
TxDMASourcedTrigger = DMA_TRIGGERSOURCE_17

};
CONST SPI_Config SPI_CONFIG[]={

.fxnTablePtr =&SPIUSCIBDMA_fxnTable、
.object =&spiUSCIBDMAObjects[0]、
hwAttrs =&spiUSCIBDMAHWAttrs[0]
}、

.fxnTablePtr =&SPIUSCIADA_fxnTable、
.object =&spiUSCIADMAObjects[0]、
hwAttrs =&spiUSCIADMAHWAttrs[0]
}、
//{NULL、NULL、NULL}、
};

/*
*==== MSP_EXP430F5529LP_initSPI ===
*
void MSP_EXP430F5529LP_initSPI (void)

/*
*注意:TI-RTOS 示例将 USCIB0配置为 SPI 或 I2C。 因此、
*在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
*应用程序。 修改此文件中的引脚多路复用设置并解析
*运行应用程序前发生冲突。
*

/* SPI CLK */
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN2);
/* MOSI/SIMO *
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN0);
/* MISO/SOMI *
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN1);

/* SPI CLK */
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7);
/* MOSI/SIMO *
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN3);
/* MISO/SOMI *
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN4);

spi_init();

我确定 sigle SPI 驱动程序是正确的。但 如何同时使用两个驱动程序?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在您的应用中、您将使用 SPI_open (0、&params) SPI_open (1、&params)来访问 SPI_config[]的相应索引

    uint8_t spiUSCIADMAscratchBuf[4];
    uint8_t spiUSCIBDMAscratchBuf[4];
    
    const SPIUSCIBDMA_HWAttrs spiUSCIBDMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT]={
    {
    baseAddr = USCI_B0_BASE、
    时钟源= USCI_B_SPI_CLOCKSOURCE_SMCLK、
    .bitOrder = USCI_B_SPI_MSB_FIRST、
    scratchBufPtr = spiUSCIBDMAscratchBuf、
    defaultTxBufValue = 0、
    
    /* DMA */
    .dmaBaseAddr = dma_BASE、
    /* Rx 通道*/
    .rxDMAChannelIndex = DMA_CHANGE_2、
    .rxDMASourcedTrigger = DMA_TRIGGERSOURCE_18、
    /* Tx 通道*/
    TxDMAChannelIndex = DMA_CHANGE_0、
    TxDMASourcedTrigger = DMA_TRIGGERSOURCE_19
    }
    };
    
    const SPIUSCIADA_HWAttrs spiUSCIADMAHWAttrs[MSP_EXP430F5529LP_SPICOUNT]={
    {
    baseAddr = USCI_A0_BASE、
    时钟源= USCI_A_SPI_CLOCKSOURCE_SMCLK、
    .bitOrder = USCI_A_SPI_MSB_FIRST、
    scratchBufPtr = spiUSCIADMAscratchBuf、
    defaultTxBufValue = 0、
    
    /* DMA */
    .dmaBaseAddr = dma_BASE、
    /* Rx 通道*/
    .rxDMAChannelIndex = DMA_CHANGE_2、
    .rxDMASourcedTrigger = DMA_TRIGGERSOURCE_16、
    /* Tx 通道*/
    TxDMAChannelIndex = DMA_CHANGE_0、
    TxDMASourcedTrigger = DMA_TRIGGERSOURCE_17
    }
    }; 


    请注意 spiUSCIADMAscratchBuf 和 spiUSCIBDMAscratchBuf 的变化。 根据 SPIUSCI[AB]DMA.h 中的文档:

    /*! 大小为 uint32_t */的暂存缓冲区的地址
    uint8_t *暂存缓冲区;


    Derrick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复!现在我要介绍如何添加2个 spi.change ISR、如下所示:
    void MSP_EXP430F5529LP_isrDMA (UARg 参数)



    SPIUSCIADA_HWAttrs const *hwAttrsA;
    SPIUSCIBDMA_HWAttrs const *hwAttrsB;

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


    //调用 SPI DMA 函数,传递用于 WiFi 的 SPI 句柄
    if (dma_getInterruptStatus (hwAttrsA->txDMAChannelIndex)=dma_int_active||
    DMA_getInterruptStatus (hwAttrsA->rxDMAChannelIndex)=DMA_INT_ACTIVE
    ){
    //dma_clearInterrupt (hwAttrsA->txDMAChannelIndex);
    //dma_clearInterrupt (hwAttrsA->rxDMAChannelIndex);
    //注:打印 CA 不会因为延迟而删除
    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);
    //注:打印 CA 不会因为延迟而删除
    System_printf ("SPIB-SPI_serviceISR-------- \r\n");
    system_flush();
    SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[1]));