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.

[参考译文] TMS570LC4357:通过 DMA 的 SCI 一次只传输一个字节

Guru**** 2477065 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1011519/tms570lc4357-sci-via-dma-only-transmits-one-byte-at-a-time

器件型号:TMS570LC4357

您好!

我使用 DMA 从连接到 SCI3的外部器件获取数据。 根据我的理解(并根据尼斯示例 https://www.ti.com/lit/an/spna213/spna213.pdf)、DMA "一次从数据 RAM 读取32位、从而使地址递增"。 尽管如此、我的分址地址中的数据始终是3个字节的0和1个字节的(正确)数据。

例如、如果外部器件发送0x3A45B、则分页地址为{0x0、0x0、0x0、0x3、 0x0、 0x0、0x0、0xA、 0x0、0x0、 0x0、0x4、0x0、0x0、0x0、 0x5、0x0、0x0、0x0、0xB};

我尝试使用参数 aroung、主要是读写大小和偏移量、但我无法使它传输全部32位的实际数据。

DMA 是否有办法从 SCI 发送所有32位数据?

我的设置:

#define FRAME_TRANSFER 5

dmaCTRLPKT_RX.SADD = (uintptr_t) &(sciREG3->RD); /* source address */
dmaCTRLPKT_RX.DADD = (uintptr_t) shared_mem_p; /* destination address in shared RAM */
dmaCTRLPKT_RX.ELCNT = 1; /* element count */

dmaCTRLPKT_RX.CHCTRL = 0; /* (channel control) bufferId */
dmaCTRLPKT_RX.FRCNT = FRAME_LENGHT; /* frame count */
dmaCTRLPKT_RX.ELDOFFSET = 0; /* element destination offset */
dmaCTRLPKT_RX.ELSOFFSET = 0;
dmaCTRLPKT_RX.FRDOFFSET = 0; /* frame destination offset */
dmaCTRLPKT_RX.FRSOFFSET = 0; /* frame source offset */

dmaCTRLPKT_RX.PORTASGN = PORTB_READ_PORTA_WRITE;
dmaCTRLPKT_RX.RDSIZE = ACCESS_32_BIT;
dmaCTRLPKT_RX.WRSIZE = ACCESS_32_BIT;
dmaCTRLPKT_RX.TTYPE = FRAME_TRANSFER; /* transfer type */
dmaCTRLPKT_RX.ADDMODERD = ADDR_FIXED; /* address mode read */
dmaCTRLPKT_RX.ADDMODEWR = ADDR_INC1; /* address mode write */
dmaCTRLPKT_RX .AUTOINIT = AUTOINIT_OFF; /* autoinit

谢谢、
Arturo。

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

    您好、Arturo、

    根据您的代码、不使用多缓冲模式、因此 DMA 请求是按字节生成的。  

    如果发送器发送0x03、 0xA4和0x5B、SCI 接收器应逐字节(0x03、0xA4和0x5B)在 RX 寄存器中获得相同的数据。 但 DMA 代码将读取整个 RX 寄存器、目的数据应为0x00000003、0x000000A4和0x0000005B。

    如果发送器发送0x3、0xA、0x4、...0xB、则目的地址中的数据为0x0000003、0x0000000A、...0x0000000B。  

    对于 SCI DMA、如果 不使用多缓冲模式、我建议为 R/W 侧使用1个字节、而不是32位。

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

    QJ、

    感谢您的快速响应。 我的例子不是很好,但你完全明白了我的观点。

    似乎多缓冲器模式只适用于 SCI/LIN 接口(即 SCI1和 SCI2)、您是否可以确认在 SCI3和 SCI4中无法使用多缓冲器模式?

    此致、
    Arturo。

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

    您好、Arturo、

    你是对的。 SCI3和 SCI4不支持多缓冲模式。

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

    QJ、

    出于某种原因、我无法回答您的以下问题。 感谢您的澄清。

    回到问题、我尝试在读取和写入访问中使用一个字节而不是32位、即.e:

        dmaCTRLPKT_RX.RDSIZE = ACCESS_8_BIT;
        dmaCTRLPKT_RX.WRSIZE = ACCESS_8_BIT;

    我仍然获得 DMA 中断、但现在数据始终为零;在配置中是否需要更改其他内容才能使用1字节访问?

    此致、
    Arturo。

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

    您好!

    TMS570LC43x 是一款大端字节序器件。 SCIRD 寄存器中数据字段的地址偏移量为0x37 (0x34 + 3)、而不是0x34。

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

    这是一种魅力。 谢谢。