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.

[参考译文] MSP430F67791A:MSP430Ware 中的 DMA9权变措施

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware

器件型号:MSP430F67791A
主题中讨论的其他器件: MSPWARE

您好!

我们将在 MSP430F67791A 器件上设计电表。

我们必须通过 UART 发送大量数据、但 DMA9问题的存在使得这个过程在 CPU 开销方面并不那么简单。

 SLAZ598U 中提供的 DMA9权变措施并不完全明确。

我们尝试在 MSPWare 中找到一些有关如何实现数据传输的软件示例、以避免出现此问题、但未找到有关此情况的信息。

MSPWare 是否包含   有关 MSP430F67791A 上 DMA9问题的权变措施示例?

您能否 提供有关如何处理此错误的任何代码示例?

谢谢你。

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

    您好、Slava、

    [引用 userid="421586" URL"~/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware "]我们将在 MSP430F67791A 器件上设计一个电表。[/quot]

    很好。 很高兴您使用的是 A 版本、而不是非 A 版本。 有关这些差异的更多详细信息、请参阅 MSP430F67xx 和 MSP430F67xxA 器件之间的差异。 此外、还应考虑在 电表设计中使用电能测量设计中心(EMDC)。

    [引用 userid="421586" URL"~/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware "]

    我们必须通过 UART 发送大量数据、但 DMA9问题的存在使得这个过程在 CPU 开销方面并不那么简单。

     SLAZ598U 中提供的 DMA9权变措施并不完全明确。

    [/报价]

    该权变措施描述了如何使用两个 DMA 通道来缓解勘误问题。 有关更多详细信息、请参阅以下主题帖。

    MSP430FR5739:EXP430FR5739 DMA9勘误表的权变措施

    MSP430F67xx 勘误表 DMA9

    [引用 userid="421586" URL"~/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware "]

    我们尝试在 MSPWare 中找到一些有关如何实现数据传输的软件示例、以避免出现此问题、但未找到有关此情况的信息。

    MSPWare 是否包含   有关 MSP430F67791A 上 DMA9问题的权变措施示例?

    您能否 提供有关如何处理此错误的任何代码示例?

    [/报价]

    我在 TI Resource Explorer 中找不到任何演示 DMA9权变措施的代码示例。 如果某些基于 F6779A 的 TI 参考设计代码使用 DMA (不确定是否有 DMA)、您可能可以在这些代码中找到权变措施。

    听起来 DMA9权变措施是可行的、但由于您在设计早期、因此您可能可以使用不会受到影响的 SPI 或 I2C 等不同接口来解决这一问题。

    设计人员有时遗漏的另一组重要勘误表是 AUXPMM1和 AUXPMM2勘误表。 在使用辅助电源和备用电池时、需要仔细考虑这些问题。 我想强调这些。

    此致、

    James

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

    您好 James、

    我找不到有关如何修复 DMA9的任何代码源。 这是否意味 着没有提供软件示例作为 解决此问题的解决方案、客户必须自行实施和测试这部分代码?

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

    您好、Slava、

    没错。 我确实找到 了一个 DMA UART DriverLib 示例 、它们可以从开始并进行修改。 其他 F5xx/F6xx 代码示例也可能有所帮助。 似乎勘误表只是将一个 DMA 通道与另一个具有较低优先级的 DMA 通道复制在一起。 一旦他们配置了第一个通道、第二个通道就不会太硬。

    此致、

    James

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

    尊敬的 James:

    感谢您提供的源代码示例。 但本示例并未向我们展示如何:

    -为相同的数据传输设置两个不同的 DMA 通道

    -要使用 第二个虚拟 DMA 传输(根据此线程的建议 MSP430FR5739:EXP430FR5739的 DMA9勘误表的权变措施)。

    我提供来自以下客户的初始 DMA 源代码。

    您能否修改此项以 添加所需的代码、使 DMA 在不出现 DMA9问题的情况下正常工作?

    提前感谢您。

    include <stdbool.h>
    #include <stdint.h>
    #include <string.h>
    #include <msp430.h>
    
    //third party
    #include "dma.h"
    #include "usci_a_uart.h"
    
    /*
    
    CHANNEL DMA0                DMA1                DMA2
    0       DMAREQ              DMAREQ              DMAREQ
    1       TA0CCR0 CCIFG       TA0CCR0 CCIFG       TA0CCR0 CCIFG
    2       TA0CCR2 CCIFG       TA0CCR2 CCIFG       TA0CCR2 CCIFG
    3       TA1CCR0 CCIFG       TA1CCR0 CCIFG       TA1CCR0 CCIFG
    4       Reserved            Reserved            Reserved
    5       TA2CCR0 CCIFG       TA2CCR0 CCIFG       TA2CCR0 CCIFG
    6       Reserved            Reserved            Reserved
    7       TA3CCR0 CCIFG       TA3CCR0 CCIFG       TA3CCR0 CCIFG
    8       Reserved            Reserved            Reserved
    9       Reserved            Reserved            Reserved
    10      Reserved            Reserved            Reserved
    11      Reserved            Reserved            Reserved
    12      Reserved            Reserved            Reserved
    13      SD24IFG             SD24IFG             SD24IFG
    14      Reserved            Reserved            Reserved
    15      Reserved            Reserved            Reserved
    16      UCA0RXIFG           UCA0RXIFG           UCA0RXIFG
    17      UCA0TXIFG           UCA0TXIFG           UCA0TXIFG
    18      UCA1RXIFG           UCA1RXIFG           UCA1RXIFG
    19      UCA1TXIFG           UCA1TXIFG           UCA1TXIFG
    20      UCA2RXIFG           UCA2RXIFG           UCA2RXIFG
    21      UCA2TXIFG           UCA2TXIFG           UCA2TXIFG
    22      UCB0RXIFG0          UCB0RXIFG0          UCB0RXIFG0
    23      UCB0TXIFG0          UCB0TXIFG0          UCB0TXIFG0
    24      ADC10IFG0           ADC10IFG0           ADC10IFG0
    25      UCA3RXIFG           UCA3RXIFG           UCA3RXIFG
    26      UCA3TXIFG           UCA3TXIFG           UCA3TXIFG		*****
    27      UCB1RXIFG0          UCB1RXIFG0          UCB1RXIFG0
    28      UCB1TXIFG0          UCB1TXIFG0          UCB1TXIFG0
    29      MPY ready           MPY ready           MPY ready
    30      DMA2IFG             DMA0IFG             DMA1IFG
    31      Reserved            Reserved            Reserved
    */
    
    
    static uint8_t tx_buf[1072];
    
    void SendDataToUCA3(uint8_t *buf, uint16_t count)
    {
        DMA_initParam param;
    //Initialize and Setup DMA Channel 0
        memset(&param, 0, sizeof(DMA_initParam));
        param.channelSelect = DMA_CHANNEL_0;
        param.transferModeSelect = DMA_TRANSFER_BLOCK;
        param.transferSize = count - 1;
        param.triggerSourceSelect = DMA_TRIGGERSOURCE_26;
        param.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE;
        param.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;
        DMA_init(&param);
    //
        memcpy(tx_buf, buf, count);
    //
        DMA_setSrcAddress(DMA_CHANNEL_0, (uint32_t)(&tx_buf[1]), DMA_DIRECTION_INCREMENT);
        DMA_setDstAddress(DMA_CHANNEL_0, (uint32_t)(&UCA3TXBUF),  DMA_DIRECTION_UNCHANGED);
    //    
        DMA_enableInterrupt(DMA_CHANNEL_0);
        DMA_enableTransfers(DMA_CHANNEL_0);
        DMA_startTransfer(DMA_CHANNEL_0);   
        
        UCA3TXBUF = tx_buf[0];
    };
    
    #pragma vector=DMA_VECTOR
    __interrupt void DMA_ISR(void)
    {
      
      switch(__even_in_range(DMAIV, 16))
      {
        case DMAIV_DMA0IFG:
          DMA0CTL = 0;
          break;
        case DMAIV_DMA1IFG:
          DMA1CTL = 0;
          break;
        case DMAIV_DMA2IFG:
          DMA2CTL = 0;
          break;
      };
    };
    

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

    您好、Slava、

    这是一个很好的开始。 根据勘误表中描述的 DMA9权变措施、他们应该能够只复制/粘贴其 DMA 通道0配置代码、然后对其进行调整以将 DMA 通道2配置为使用 与触发源相同的中断标志(例如 DMA_TRIGGERSOURCE_26)。 这应防止在传输过程中丢失任何字节。

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

    大家好、James、同一主题还有另外一个问题。

    客户透露、他 的板上使用 MSP430F67791A Rev.C。

     文档 SLAZ598U–MSP430F67791A 器件勘误表声明、Rev.C 不包含 DMA9错误。

    请确认  、勘误表文档中没有拼写错误、且版本 C 中 不 包含 DMA9错误吗?

    如果勘误文档中没有任何拼写错误、您是否可以检查上面提供的源代码是否有任何错误?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="421586" URL"~/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware/3669104 #3669104"]您能否确认  勘误表文档中没有拼写错误、且修订版 C  不包含 DMA9错误?

    没错。

    [引用 userid="421586" URL"~/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/987303/msp430f67791a-dma9-workaround-in-msp430ware/3669104 #3669104"]如果勘误文档中没有任何拼写错误,是否可以检查上面提供的源代码是否有错误?

    以下是我对代码的反馈:

    • 添加 DMA_clearInterrupt (DMA_CHANNEL);在 DMA_enableInterrupt (DMA_CHANNEL)之前;
    • 删除 DMA_startTransfer (DMA_CHANNEL);将第一个字节写入 TXBUF 应启动传输、因为 DMA 配置为使用 TXIFG 作为触发器。 它们在索引[0]处手动发送第一个字节、因此在 DMA_setSrcAddress 中、它们从索引[1]开始是有意义的。