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:TMS570LC4357

Guru**** 2477065 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/695812/tms570lc4357-tms570lc4357

器件型号:TMS570LC4357

您好!

我们正在尝试检查 TMS570LC4357的链式 DMA 功能。
目前、我们用于 TMS570LC43x Hercules 开发套件(HDK)。

两个 DMA 通道、通道0和通道1被配置为写入 SCI Tx 数据寄存器(SCI->TD)。
dmachannel0由 dmaSetChEnable()触发。 它链接到 dmachannel1。

我希望 sci-TD 寄存器具有使用 dmachannel1写入的值。

这种理解是否正确?

在运行此命令时,DMA 挂起寄存器的值为1,这意味着 dmachannel1不会被执行。
sci->TD 寄存器中的值为0且不更新。

我写入 SCI->TD 寄存器只是为了检查 DMA 是否正常工作、而不是检查任何 SCI 功能。

源代码如下所示。 请帮帮我。

int main (空)

uint32 pendstatus、sciregvalue;
_enable_interrupt_();

gioEnableNotification (gioPORTA、7U);
/**初始化所有驱动程序*/
Driver_Init();

dmaEnable();

dmaSetCtrlPacket (dma_CH0、g_dmaCTRLPKT0);

dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT1);

dmaSetChEnable (DMA_CH0、DMA_SW);

pendstatus = dmaREG->pend;//检查挂起通道
sciregvalue = sciREG1->td;


while (1);

谢谢

/*用户代码开始(4)*/
空 DmaInit (空)

uint8 testdata1、testdata2;
testdata1 = 0x11;
testdata2 = 0x22;
G_dmaCTRLPKT0.Sadd =(uint32)&testdata1;//源地址*/
G_dmaCTRLPKT0.DADD =(uint32_t)(&(sciREG1->TD);/*目标地址*/
G_dmaCTRLPKT0.CHCTRL =(uint32)(1U +1U)<<16U;/*通道控制*
G_dmaCTRLPKT0.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT0.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT0.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT0.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT0.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT0.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT0.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKT0.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT0.WRSIZE = ACCESS_8_BIT;/*写入大小*
G_dmaCTRLPKT0.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE */
G_dmaCTRLPKT0.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT0.ADDMODEWR = ADDR_FIXED;/*地址模式写入*
G_dmaCTRLPKT0.AUTOINIT = AUTOINIT_OFF;/*自动初始化*

G_dmaCTRLPKT1.Sadd =(uint32)&testdata2;/*源地址*/
G_dmaCTRLPKT1.DADD =(uint32_t)(&(sciREG1->TD);/*目标地址*
G_dmaCTRLPKT1.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT1.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 4;/*元素目标偏移量*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*
G_dmaCTRLPKT1.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;/*地址模式写入*
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

空 Driver_Init (空)

/**初始化端口*/
gioInit (gioPORTA);
/**初始化 I2C */
i2cInit (i2cREG1、I2CDriver1);
/** EVM 中内部连接 LED 板的初始化*/
init();
/**初始化 DMA */
DmaInit();
/**初始化 UART */
sciInit (sciREG1,&sciDriver1);

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

    是的、您的理解是正确的。 通道链可用于触发另一个 DMA 通道。
    为什么要将4用作控制数据包1 (通道1)的元素目标偏移量? testData1是否传输到 sci->td?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wang、

    testData1不会传输到 sci->td。 DMA 挂起寄存器显示 dmachannel0正暂挂。

    元件目的计数不使用、因为我已经在 ADDR_FIXED 模式中配置了。 将更新此内容。

    您能不能帮助您了解为何即使是第一次也不会发生 DMA 传输。

    谢谢

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

    e2e.ti.com/.../6443.SCI1_5F00_DMA.txt

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

    附加 SCI1和 DMA 寄存器值以供参考。

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

    调用 DMA 传输但不提供服务的原因可能是什么。 每次我尝试 DMA 传输时、PEND 寄存器都会被置位。
    请帮帮我。

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

    CHCTRL 寄存器中的链位是下一个要触发的通道。 您不需要左移该数字、因为它被移入:

    dmaSetCtrlPacket (...)