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.

[参考译文] RM48L952:带有 DMA 的 SCI 传输

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/991374/rm48l952-sci-transmission-with-dma

你好!

我计划在 SPI、sci、scilin 使用 DMA 来节省 CPU 资源。 作为起点、我目前正在使用通过 DMA 进行的 sci 传输。

DMA 块的结构是1帧和8个元素、因此 DMA 应该以 sci 的形式发送8个字节。 源是 uint8_t 数组、具有16个元素("0"至"f")。

DMA 应发送'01234567'。

#include "sys_common.h"

/* USER CODE BEGIN (1) */
#include "sys_dma.h"
#include "sci.h"
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
void setDmaPacket(g_dmaCTRL *packet);
void setDmaSciReceive(g_dmaCTRL *packet);
void setDmaSciTransmit(g_dmaCTRL *packet);

uint8_t p[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    g_dmaCTRL dmaPacket = {0};
    uint32_t dmaReqlineSciRx = 30;
    uint32_t dmaReqlineSciTx = 31;

    _enable_interrupt_();
    sciInit();
    sciSend(sciREG, 6, "init\r\n");

    setDmaPacket(&dmaPacket);
    setDmaSciTransmit(&dmaPacket);
    dmaEnable();
    dmaReqAssign(DMA_CH0, dmaReqlineSciTx);
    dmaSetCtrlPacket(DMA_CH0, dmaPacket);
    dmaSetChEnable(DMA_CH0, DMA_HW);
    dmaEnableInterrupt(DMA_CH0, HBC);
    dmaEnableInterrupt(DMA_CH0, BTC);
    sciREG->SETINT |= (1 << 16);

    while(1)
    {
    }
/* USER CODE END */
}


/* USER CODE BEGIN (4) */
void setDmaSciTransmit(g_dmaCTRL *packet)
{
    packet->SADD = (uint32_t)p;
    packet->DADD = (uint32_t)(&(sciREG->TD));
}

void setDmaSciReceive(g_dmaCTRL *packet)
{
    packet->SADD = (uint32_t)(&(sciREG->RD));
    packet->DADD = (uint32_t)p;
}

void setDmaPacket(g_dmaCTRL *packet)
{
    packet->CHCTRL = 0;
    packet->ELCNT = 8;
    packet->ELDOFFSET = 0;
    packet->ELSOFFSET = 1;
    packet->FRDOFFSET = 0;
    packet->FRSOFFSET = 0;
    packet->FRCNT = 1;
    packet->PORTASGN = 4;
    packet->RDSIZE = ACCESS_8_BIT;
    packet->WRSIZE = ACCESS_8_BIT;
    packet->TTYPE = BLOCK_TRANSFER;
    packet->ADDMODERD = ADDR_INC1;
    packet->ADDMODEWR = ADDR_FIXED;
    packet->AUTOINIT = AUTOINIT_OFF;
}

void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel)
{
/*  enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (54) */
    switch(inttype)
    {
    case HBC:
        sciSend(sciREG, 12, "half block\r\n");
        break;
    case BTC:
        sciSend(sciREG, 12, "block done\r\n");
        break;
    }


终端的预期结果为:

初始化
0123Half block
4567块完成
0~7的位置可能会有所不同。

实际结果为:

初始化
7Half Block
块完成
只有最后一个元素7通过 sci 发送。 当我将第8个元素7更改为不同的值时、结果会相应地发生变化、因此 DMA 正在读取某个内容、但无法正确读取。

问题可能出在哪呢?

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

    Yejung、您好!

    请参阅此应用手册、其中总结了设置 DMA 以便在 SCI 和 SRAM 中的缓冲区之间进行数据传输的步骤。

    www.ti.com/.../spna213.pdf

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

    您好、Wang、

    事实证明,问题是我对元素、框架和块的误解。 将元件数更改为1并增加帧数是有效的。