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.

[参考译文] MSP430F5659:如何使用 DMA 将数据传输到20位地址

Guru**** 2511415 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1059841/msp430f5659-how-to-transfer-data-to-a-20-bit-address-using-dma

器件型号:MSP430F5659

各位专家、您好!

您能告诉我如何使用 MSP430F5x 上的 DMA 将数据传输到20位地址吗?

我能够向 DMAxSA 和 DMAxDA 写入0x14000和0x14020、但数据传输不正确。

[查看详细信息]
我在以下环境中进行了一些与原始线程相关的实验。

图形 1 2. 3.
.c __data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t) 0x14000);
__data20_write_long ((uintptr_t)&DMA0DA、(uintptr_t) 0x14020);
__data20_write_long ((unsigned long)&DMA0SA、(unsigned long) 0x14000);
__data20_write_long ((unsigned long)&DMA0DA、(unsigned long) 0x14020);
__data16_write_addr ((uintptr_t)&DMA0SA、(uintptr_t) 0x14000);
__data16_write_addr ((uintptr_t)&DMA0DA、(uintptr_t) 0x14020);
.asm MOVX.A #DMA0SA+0、R15
MOV.W #7168、0 (R15)
MOV.W #0、2 (R15)

MOVX.A #DMA0DA+0、R15
MOV.W #7200、0 (R15)
MOV.W #0、2 (R15)
MOVX.A #DMA0SA+0、R15
MOV.W #16384、0 (R15)
MOV.W #1、2 (R15)

MOVX.A #DMA0DA+0、R15
MOV.W #16416、0 (R15)
MOV.W #1、2 (R15)
MOV.W #DMA0SA+0、R15
MOVX.A #0x140000 (R15)

MOV.W #DMA0DA+0、R15
MOVX.A #0x14020、0 (R15)
结果

DMA0SA=0x04000
DMA0DA=0x04020

DMA0SA=0x04000
DMA0DA=0x04020
DMA0SA=0x14000
DMA0DA=0x14020

唯一正确的寄存器设置是 pattern3。 但是、0x14000处的数据不会传输到0x14020。 另外、令人困惑的是、pattern1和2输出"MOVX.A"在.asm 文件中检查时、但在 Disassembly 中检查时、输出变为"MOVA"。

如果您能指出设置或描述中的任何错误、我将不胜感激。

此致、
还不错

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

    对于某些寻址模式、包括您显示的寻址模式、MOVA 编码短于 MOVX.A 当与具有合适操作数的 MOVX.A 操作码一同提供时、汇编器自然选择 MOVA。

    至于0x14000等常量地址、请尝试将其写入0x14000L、这样它们就不会被截断为16位整数。

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

    大家好、David Schultz、

    很抱歉耽误你的回答。 我曾尝试过你对上述计划的建议,但结果是一样的。

    此致、
    还不错

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

    我以前没有注意到、但似乎您正在尝试使用 DMA 写入闪存。 这永远不会奏效。

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

    大家好、David Schultz、

    抱歉。 你是对的。

    我准备了 F5659并使用 DMA 测试了到 RAM 的传输。 它使用以下代码工作正常。

    #include <msp430.h>
    #include <stdint.h>
    
    int main(void)
    {
      WDTCTL = WDTPW|WDTHOLD;                   // Stop WDT
      P1DIR |= 0x01;                            // P1.0 output
    
      //20bit
      __data16_write_addr((uintptr_t) &DMA0SA,(uintptr_t) 0xF0000L);
                                                // Source block address
      __data16_write_addr((uintptr_t) &DMA0DA,(uintptr_t) 0xF0020L);
                                                // Destination single address
    
      DMA0SZ = 16;                              // Block size
      DMA0CTL = DMADT_5|DMASRCINCR_3|DMADSTINCR_3; // Rpt, inc
      DMA0CTL |= DMAEN;                         // Enable DMA0
    
      while(1)
      {
        P1OUT |= 0x01;                          // P1.0 = 1, LED on
        DMA0CTL |= DMAREQ;                      // Trigger block transfer
        P1OUT &= ~0x01;                         // P1.0 = 0, LED off
      }
    }

    请告诉我、在编写过程中是否存在任何致命问题。

    感谢您的支持。

    此致、
    还不错

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

    你(们)好

    您的问题似乎已经解决了吗?

    谢谢!

    此致

    Johnson