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.

[参考译文] MSP430F5529:如何在 TI-RTOS 上使用 DMA 配置 SPI

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1181757/msp430f5529-how-to-config-spi-using-dma-on-ti-rtos

器件型号:MSP430F5529

大家好、

我有一些问题:

我的项目在 TI-RTOS 系统上运行。 我使用 DMA 函数设置 SPI、但在我的代码执行到 SPI_TRANSF()后、它将保持在这里。 不继续执行。 有人能告诉我如何解决这个问题吗?

在.cfg 中:

var hwiParams = new halHwi.Params();
/*用于 SPIUSCI 驱动程序的 DMA Hwi *
hwiParams.arg = 0;
halHwi.create (50、"&MSP_EXP430F5529LP_isrDMA"、hwiParams);

--------------------------------------------

在 MSP_EXP430F5529LP.c 中:

void MSP_EXP430F5529LP_isrDMA (UARg 参数)

/*调用 SPI DMA 函数、传递用于 WiFi 的 SPI 句柄*/
SPI_serviceISR ((SPI_Handle)&(SPI_CONFIG[0]));

/*
*========================================= SPI ========================================================
*
/*放入子段以允许 TI 链接器正确删除项目*/
#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
#pragma DATA_SECTION (spiUSCIBDMAHWAttrs、".const:spiUSCIBDMAHWAttrs")
#endif

#include
#include

SPIUSCIBDMA_Object spiUSCIBDMAObjects[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_1、
.rxDMASourcedTrigger = DMA_TRIGGERSOURCE_18、
/* Tx 通道*/
TxDMAChannelIndex = DMA_CHANGE_0、
TxDMASourcedTrigger = DMA_TRIGGERSOURCE_19

};

CONST SPI_Config SPI_CONFIG[]={

.fxnTablePtr =&SPIUSCIBDMA_fxnTable、
.object =&spiUSCIBDMAObjects[0]、
hwAttrs =&spiUSCIBDMAHWAttrs[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_init();

--------------------------------------------

在 main.c 中:

空 SPI_MASTER_taskFxn (UARg arg0、UARg arg1)

SPI_Handle SPI_MASTER;
SPI_Params SPI_MASTER_Params;
/*创建 I2C 以供使用*/
SPI_PARAMS_INIT (&SPI_MASTER_PARAMS);
SPI_MASTER_PARAMS.transferMode = SPI_MODE_CALLACK;
SPI_MASTER_PARAMS.MODE = SPI_MASTER;
SPI_MASTER_PARAMS.bitrate = 1000000、
SPI_MASTER_PARAMS.dataSize = 8;
//spi_master_Params.frameFormat = SPI_POL0_PHA0;
SPI_MASTER = SPI_OPEN (Board_SPI0、&SPI_MASTER_PARAMS);
if (SPI_MASTER =NULL) System_abort ("初始化 SPI\n"时出错);
否则为 System_printf ("SPI 已初始化!\n");
system_flush();

uint8_t txBuffer[16]={0xAA、0xAA、0xAA、0xAA、0xAA、 0xAA、0xAA、0xAA、
0xAA、0xAA、0xAA、0xAA、0xAA、 0xAA、0xAA、0xAA};
SPI_Transaction spiTransaction;
spiTransaction.txBuf = txBuffer;
spiTransaction.rxBuf =空;
spiTransaction.count = 16;

while (1){
if (SPI_transfer (SPI_master、&spiTransaction)== NULL) System_printf ("SPI_transfer error\n");
否则 System_printf ("SPI_transfer sulation!\n");
system_flush();

2.当我设置 SPI_MASTER_PARAMS.bitrate = 1000000时、我可以测量 大约1MHz 的 SPI CLK。

但当我设置 为3000000时、它将变为4MHz。 TI-RTOS 系统上的限制是否为1MHz?

谢谢。

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

    你(们)好。

    1.您是否在 SPI_TRANSF()中设置了任何无限循环? 条件判断不合适时、可能是停止。

    2.我建议您检查 UCB0CTL1寄存器的第6-7位以获取源时钟、然后您可以计算时钟频率、如下图所示:

    此致

    SAL

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

    您好 Sal、

    1.我发现如果我设置 SPI_MASTER_PARAMS.transferMode = SPI_MODE_BLOCKING、这是可以的。

    但设置 SPI_MODE_CALLACK  将保持在这里。 不继续执行。

    2.我的时钟设置:  MCLK = 8192000 、ACLK = 32768 、SMCLK = 8192000。

      SMCLK 用作 SPI 时钟。 (.clockSource = USCI_B_SPI_CLOCKSOURCE_SMCLK)

      DCO FLL 和 ACLK 为基准= REFO。

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

    你(们)好。

    由于 缺少函数内部详细信息、我建议您:

    SPI 外设中没有"阻塞或回调"模式、因此这是 TI-RTOS 上的自定义功能、因此我建议您找到这两种模式的定义并检查不同模式下的行为。 根据模式名称、我想回调模式将等待接收数据、因此它将留在此处。  

    由于 SPI 时钟大约为8MHz、因此它不 能被3MHz 均匀分频、因此这不是您的预期。 请检查如何使用"SPI_MASTER_PARAMS.bitrate"、我认为它将进行类似于"(int) 8MHz/3MHz=2"的除法、然后设置  UCBRx =2、因此实际频率大约为4MHz。

    此致

    SAL

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

    您好 Sal、

    感谢您的教学。 现在、我了解为什么 SPI_MASTER_PARAMS.bitrate set 3000000将成为4MHz、而不是3MHz。
    在 TI-RTOS 系统上、SMCLK 是否可以更改为24MHz? 它会影响系统上的任务?

    谢谢。

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

    你(们)好。

    当然、MCLK/SMCLK 的最大频率为25MHz。

    我不熟悉 RTOS 系统、在我看来 、它主要包括 乘法任务的执行方法。 因此、改进的 CPU 时钟 将提高系统性能、 然后  任务的时间成本将降低。 您应该检查每个任务的时间成本、并在必要时进行评估。

    有关时钟设置、请参阅使用指南的第5.2.6节。

    以下是一般说明:

    例如、设置 FLLN=22、FFD=32、那么 DCOCLKDIV 大约为24MHz。

    此致

    SAL