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.

[参考译文] TMS570LS3134:当启用另一个通道上的请求时、DMA SCI TX 释放第二个字节

Guru**** 2506825 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1426902/tms570ls3134-dma-sci-tx-loosing-2nd-byte-when-enabling-request-on-another-chanel

器件型号:TMS570LS3134

工具与软件:

您好!

我正在处理一个需要在2个器件之间进行通信的应用。 我目前正在使用 SCI 和 DMA 测试消息传输。

我有不同的消息 msg1大小15、msg2大小14和 msg3大小13。 我配置了3个 DMA 数据包、如下所示:

g_dmaCTRL g_dmaCTRLPKT1;
/*配置通道0的控制包*/
g_dmaCTRLPKT1.Sadd =(uint32_t) msg1;/*源地址*/
G_dmaCTRLPKT1.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT1.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT1.FRCNT = 15;/*帧计数*/
g_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.PORTAGN = 4;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT1.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH0、31);
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);

g_dmaCTRL g_dmaCTRLPKT2;
/*为通道1*/配置控制数据包
g_dmaCTRLPKT2.Sadd =(uint32_t) msg2;/*源地址*/
g_dmaCTRLPKT2.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT2.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT2.FRCNT = 14;/*帧计数*/
g_dmaCTRLPKT2.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT2.ELDOFFSET = 0;/*元素目标偏移*/
g_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT2.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT2.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT2.PORTASGN=4;
G_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT2.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT2.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT2.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH1、31);
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT2);

g_dmaCTRL g_dmaCTRLPKT3;
/*为通道1*/配置控制数据包
g_dmaCTRLPKT3.Sadd =(uint32_t) msg3;/*源地址*/
G_dmaCTRLPKT3.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT3.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT3.FRCNT = 13;/*帧计数*/
g_dmaCTRLPKT3.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT3.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT3.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT3.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT3.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT3.PORTASGN=4;
G_dmaCTRLPKT3.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT3.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT3.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT3.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT3.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT3.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH2、31);
dmaSetCtrlPacket (DMA_CH2、g_dmaCTRLPKT3);

在我的主,我做所有必要的初始化,然后:

sciREG->SETINT =(1<<16)|(1<<8);//设置 TX DMA 和设置 TX int

然后、在我的循环中我使用 带有延迟的 dmaSetChEnable (DMA_CH0、DMA_HW)、dmaSetChEnable (DMA_CH1、DMA_HW)和 dmaSetChEnable (DMA_CH2、DMA_HW)、但使用 hterm 接收到的第一条消息是正确的我得到15个字节、第二条消息是错误的、除了第二个字节完全丢失之外、所有14个字节中有13个字节。

对于0xB7、0X56、0XAA、0xBB、0xCC、0xDD、0xEE、0xFF、 0x11、0x22、0x33、0x44、0x55、 0x66 I 获取 0xB7、0XAA、0xBB、0xCC、0xDD、0xEE、0xFF、 0x11、0x22、0x33、0x44、0x55、 0x66。

对于第三条消息、我得到的错误与第二条消息相同、13个字节中的12个字节均正确、但第二个字节完全缺失除外。  

当我只发送第1条、第2条或第3条消息时、我没有错误、但是每当通道之间的 DMA 切换时、第一条消息是正确的、但其余消息由 hterm 接收、没有第二个字节。  

为什么? 我是否缺少配置步骤?

提前感谢您的帮助。  

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

    尊敬的 Ahmet:

    我看不到共享代码的任何配置错误。

    我能在我结束时将整个项目完成验证和快速调试吗? 如果可能、压缩整个工程并将其附加。

    ——
    谢谢、此致、
    Jagadish。

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

    很遗憾、我无法直接发送 zip 文件、但我可以为您提供有关我的项目的信息。

    我启用的驱动器是 RTI、GIO、SCI 和 HET1。 在引脚多路复用器中、针对 N2和 W3激活选项1。 SCI 波特率230400 1stop 位。 我的 PLL 配置为160 MHz。

    在我的源文件中、我只对3条消息进行之前给出的配置  

    uint8 msg1[15]={0xD6、0x81、0x0F、0x57、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B、0x0E};
    uint8 msg2[14]={0xB7、0x60、0x0F、0x67、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B};
    uint8 msg3[13]={0xC6、0x56、0x0F、0x77、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A};

    在我的 while 循环中、我只 对3个通道使用 dmaSetChEnable 函数、调用每个函数之间有延迟。

    这是否足以让您复制工程并查看自己是否遇到同样的问题? 如果需要、我可以尝试提供更多信息。

    感谢你的帮助。

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

    尊敬的 Ahmet:

    我能够重现您的问题、最后我可以看到您所讨论的问题。

    下面是我结尾处的输出:

    我可以看到您在这里提到的缺少第二个字节。

    此外、我又进行了一次测试、并找到了问题的根本原因:

    实际上、在通道0完成其到 SCI 的传输后、SCI 还从通道0传输数据后、SCI 中的 TX 寄存器会变空。 因此、它将立即为 DMA 生成 TX 空触发、DMA 将设置通道0的相应通道的挂起位(因为通道1尚未初始化)。

    这就是问题所在、通道2不知道从 SCI 接收到的触发器。

    您可以看到以下图片、以便更好地理解:

    正如您所看到的、在我启用 DMA 通道1之前、所有三个通道挂起位都被设置了(设置了3个通道、因为我们在初始化时为所有三个通道分配了相同的触发器、但在最终启用的任何通道"dmaSetChEnable"将传输数据):

    大家可以看到、一旦我启用了 DMA 通道1、其挂起位就已清除

    此时它并不用于调用 SETINT、因为 SCI 在第一次传输结束后已经发送了 DMA 空中断。 所以、您可以看到通道1的挂起位仍然为零。

    因此、要纠正该问题、我们需要清除之前活动信道的暂挂信道:

    为此、我要更改控制数据包:

    如果我尝试更改控制数据包、然后将按如下方式清除和设置 SCI 上的 DMA TX INT

    如果我执行此操作、则会清除先前启用的通道的挂起中断。

    这里是修改后的输出:

    以下是修改后的代码:

    e2e.ti.com/.../SCI_5F00_DMA_5F00_TEST_5F00_LS3137.zip

    我想再向您建议一件事、实际上对于该要求、我们不需要三个通道、而只能使用如下所示的单通道:

    在第一次传输之后、只需尝试使用 msg2更改第一个通道的源地址、如上图所示。

    在此之后再次等待传输完成。 这种方法也应该起作用。 尝试实施它并为其他两个通道删除代码。

    ——
    谢谢、此致、
    Jagadish。