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.

[参考译文] MSP432E401Y:无法将 SSI1与 UDMA 通道10与放大器11配合使用

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/792575/msp432e401y-unable-to-use-ssi1-with-udma-channels-10-11

器件型号:MSP432E401Y

我们的应用将 SSI1与(MSP432E SLSDKv2.40.00.11) SDSPI 驱动器配合使用、以访问 SD 卡。 我们发现、当我们指定 uDMA 通道10和11时、该驱动程序不起作用、但它可以与 uDMA 通道24和25配合使用。 我确认所有 uDMA 通道都设置为默认优先级。

TRM 和 TI 驱动程序头文件建议 SSI1支持两个通道对。 这是已知的硬件限制吗?我们是否可以在驱动程序初始化中遗漏一个步骤?

此配置工作正常:

CONST SPIMSP432E4DMA_HWAttrs spiMSP432E4DMAHWAttrs[MSP_EXP432E401Y_SPICOUNT]={

baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
defaultTxBufValue =(~0)、
.rxDmaChannel = UDMA_CH24_SSI1RX、
TxDmaChannel = UDMA_CH25_SSI1TX、
.minDmaTransferSize = 10、
clkPinMask = SPIMSP432E4_PB5_SSI1CLK、
.fsPinMask = SPIMSP432E4_PB4_SSI1FSS、
.xdata0 PinMask = SPIMSP432E4_PE4_SSI1XDAT0、
.xdata1引脚掩码= SPIMSP432E4_PE5_SSI1XDAT1
};

此配置不起作用:

CONST SPIMSP432E4DMA_HWAttrs spiMSP432E4DMAHWAttrs[MSP_EXP432E401Y_SPICOUNT]={

baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
defaultTxBufValue =(~0)、
.rxDmaChannel = UDMA_CH10_SSI1RX、
TxDmaChannel = UDMA_CH11_SSI1TX、
.minDmaTransferSize = 10、
clkPinMask = SPIMSP432E4_PB5_SSI1CLK、
.fsPinMask = SPIMSP432E4_PB4_SSI1FSS、
.xdata0 PinMask = SPIMSP432E4_PE4_SSI1XDAT0、
.xdata1引脚掩码= SPIMSP432E4_PE5_SSI1XDAT1
};

摘自 MSP432E TRM:

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

    我在 TRM 第602页上找到了以下内容、这些内容似乎与我们的问题相关、但我不确定如何执行建议的通道映射。 默认情况下、UDMA 通道24和25配置为 SSI1、因此、如果我们要将通道10和11用于 SSI1、则需要将通道24和25 "重新映射"到不同的编码。 请建议如何使用 TI 驱动程序来映射未使用的 DMA 通道(24和25至不同的编码)。

    "注意: 如果一个外设映射到两个不同的通道、则应用程序应执行这两个操作

    使用该外设的默认映射、或将默认映射更改为其他源。 原因

    例如、如果启用了 UART1通道8和9以供使用、则即使通道22和23也是如此

    禁用时、必须将它们映射到软件或其他外设(如果可用)。"

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

    如果电路板文件中使用了正确的 DMA 通道配置、则 SD SPI TI 驱动程序应自动处理到正确 DMA 通道的映射、根据您的首次发布、情况似乎是这样。

    要进行确认、您可以检查 DMACHMAPn 寄存器的值、以验证编码是否与您在原始帖子中附加的"UDMA 通道分配表"表中显示的值匹配。

    由于我们要查看通道10和通道11、因此要查找的寄存器是 DMACHMAP1 (@ 0x400F.F514)。 位8:11用于通道10、位12:15用于通道11。

    编辑:在检查 DMACHMAPn 寄存器时、请确认没有其他 DMA 通道正在使用相关外设(SSI1)。

    谢谢、
    SAI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SAI、我确认当我为 SSI1指定通道10和11时、驱动程序会在 DMACHMAP1中对正确的编码进行编程。 但是、驱动程序不会更改通道24和25的编码值、因此相应的 DMACHMAPx 位保持为默认值0、这也会将它们映射到 SSI1。 当两组通道都映射到 SSI1时、驱动程序在 ISR 中挂起。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据 TRM、如果将两个通道分配给同一外设、则将使用具有最高优先级的通道。 如果两个通道具有相同的优先级、DMA 通道优先置位(DMAPRIOSET)寄存器、那么编号较小的通道将首先被服务。

    这意味着、如果 DMAPRIOSET 寄存器中的位10、11、24和25被置位或复位、通道10和11的优先级将高于通道24和25。 您能否查看 DMAPRIOSET 寄存器以查看哪个通道组具有优先级?

    谢谢、

    SAI

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

    SAI、

    我选中了、并且 DMA 优先级都处于其默认值、DMAPRIOSET = 0。 我已经捕获了所有的 DMA 寄存器、用于故障和通过情况、因此您可以查看。

    当我使用以下配置(通道10和11)时:

    {
    baseAddr = SSI1_base、
    .intNum = INT_SSI1、
    .intPriority =(~0)、
    defaultTxBufValue =(~0)、
    rxDmaChannel = uDMA_CH10_SSI1RX,/* uDMA_CH24_SSI1RX,*/
    txDmaChannel = UDMA_CH11_SSI1TX、/* UDMA_CH25_SSI1TX、*
    .minDmaTransferSize = 10、
    clkPinMask = SPIMSP432E4_PB5_SSI1CLK、
    .fsPinMask = SPIMSP432E4_PB4_SSI1FSS、
    .xdata0 PinMask = SPIMSP432E4_PE4_SSI1XDAT0、
    .xdata1 PinMask = SPIMSP432E4_PE5_SSI1XDAT1
    } 

    驱动程序在 ISR 中挂起、DMA 寄存器如下所示:

    当我使用以下配置(通道24和25)时:

    {
    baseAddr = SSI1_base、
    .intNum = INT_SSI1、
    .intPriority =(~0)、
    defaultTxBufValue =(~0)、
    rxDmaChannel = uDMA_CH24_SSI1RX,/* uDMA_CH10_SSI1RX,*/
    txDmaChannel = UDMA_CH25_SSI1TX、/* UDMA_CH11_SSI1TX、*
    .minDmaTransferSize = 10、
    clkPinMask = SPIMSP432E4_PB5_SSI1CLK、
    .fsPinMask = SPIMSP432E4_PB4_SSI1FSS、
    .xdata0 PinMask = SPIMSP432E4_PE4_SSI1XDAT0、
    .xdata1 PinMask = SPIMSP432E4_PE5_SSI1XDAT1
    } 

    该示例运行至完成并正确访问 SD 卡。 如果 我在中间 BP 处停止、DMA 寄存器如下所示:

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

    [引用 user="rperezti">但是、驱动程序不会更改通道24和25的编码值、因此相应的 DMACHMAPx 位保持其默认值0、这也会将其映射到 SSI1。 当两组通道都映射到 SSI1时、驱动程序在 ISR 中挂起。

    这似乎是问题所在。 如果我将通道24和25的编码(在调试期间使用 CCS 的寄存器窗口)更改为非零值、则该示例有效。

    我们正在着手修复即将发布的版本中的驱动程序。

    谢谢、

    SAI

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