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:SCI 使用 DMA 问题发送不同长度的数据包

Guru**** 2469020 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1053320/tms570lc4357-sci-sends-packets-of-different-lengths-using-dma-issue

器件型号:TMS570LC4357

大家好、

SCI 和 DMA 现在可以多次传输固定长度数据。 但是、客户并不总是能够使用串行端口发送固定长度的数据、有时是10字节数据、有时是20字节数据。

客户希望了解如何配置 DMA、以便能够传输不同长度的数据。

固定长度数据可通过以下程序和结果多次发送:

#include"HL_sci.h"
#include"HL_REG_sci.h"
#include "HL_REG_DMA.h"
#include "HL_SYS_DMA.h"
G_dmaCTRL g_dmaCTRLPKT_SCI1_TX;
uint8 SCI1_TX_DATA[40]={0};
空 SCI_DMA_Init (空)

dmaReqAssign (DMA_CH19、DMA_REQ29);
G_dmaCTRLPKT_SCI1_TX.Sadd =(uint32)(SCI1_TX_DATA);
G_dmaCTRLPKT_SCI1_TX.DADD =((uint32_t)(&(sciREG1->TD))+3);
G_dmaCTRLPKT_SCI1_TX.CHCTTRL = 0;
G_dmaCTRLPKT_SCI1_TX.FRCNT = 10;
G_dmaCTRLPKT_SCI1_TX.ELCNT = 1;
G_dmaCTRLPKT_SCI1_TX.ELDOFFSET = 0;
G_dmaCTRLPKT_SCI1_TX.ELSOFFSET = 0;
G_dmaCTRLPKT_SCI1_TX.FRDOFFSET = 0;
G_dmaCTRLPKT_SCI1_TX.FRSOFFSET = 0;
G_dmaCTRLPKT_SCI1_TX.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKT_SCI1_TX.RDSIZE = ACCESS_8_BIT;
G_dmaCTRLPKT_SCI1_TX.WRSIZE = ACCESS_8_BIT;
G_dmaCTRLPKT_SCI1_TX.tType = FRAME_TRANSFSION;
G_dmaCTRLPKT_SCI1_TX.ADDMODERD = ADDR_INC1;
G_dmaCTRLPKT_SCI1_TX.ADDMODEWR = ADDR_FIXED;
G_dmaCTRLPKT_SCI1_TX.AUTOINIT = AUTOINIT_OFF;
dmaSetCtrlPacket (dma_CH19、g_dmaCTRLPKT_SCI1_TX);
dmaSetChEnable (DMA_CH19、DMA_HW);
sciREG1->SETINT |=(1<<16U);

void SCI_DMA_SEND (uint8长度)

// dmaRAMREG->PCP[DMA_CH19].ITCOUNT =(0x00000001 |长度<16);
dmaSetChEnable (DMA_CH19、DMA_HW);

uint32 timel=50000;
int USER_MAIN (空)

uint8 i=0;
sciInit();
dmaEnable();

对于(i=0;i<40;i++)

SCI1_TX_DATA[I]=I;

SCI_DMA_Init();

while (1)

while (time--);
timmen=50000;
SCI_DMA_SEND (20);

发送不同长度的数据失败、只有第一次成功。 该方案作了以下改动和结果:

void SCI_DMA_SEND (uint8长度)

dmaRAMREG->PCP[DMA_CH19].ITCOUNT =(0x00000001 |长度<16);
dmaSetChEnable (DMA_CH19、DMA_HW);

您可以帮助检查此问题吗? 谢谢。

此致、

樱桃

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

    您好、Cherry、

    MibSPI DMA 需要重新配置:

    mibspiREG1->DMACTRL[0]|=(3 << 20)|(2 << 16);
    mibspiREG1->DMACTRL[0]|= 0x8000C000;

    和  

    启用传输组:

    mibspiREG1->TGCTRL[0]|= 0x80000000U;

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

    您好!

    感谢您的回复。

    客户想知道  、当他使用 SCI 时、为什么可以配置 Mispi。

    谢谢、此致、

    樱桃

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

    您好!

    我是否可以知道有关附加问题的任何更新?

    谢谢、此致、

    樱桃

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

    sciREG1->CLEARINT |= SCI_SET_TX_DMA;

    G_dmaCTRLPKT.FRCNT = size/2;      -->新的 FRCNT
    G_dmaCTRLPKT.ELCNT = 1;
    dmaRAMREG->PCP[0].ITCOUNT =(g_dmaCTRLPKT.FRCNT <<16U)| g_dmaCTRLPKT.ELCNT;

    /*将 DMA 通道0和1设置为在硬件请求时触发*/
    dmaSetChEnable (DMA_CH0、DMA_HW);

    sciREG1->SETINT |= SCI_SET_TX_DMA;  

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

    1、清除 SCI TX DMA 位  

    2.重新配置帧计数和元素计数

    3.设置硬件通道使能位

    4.设置 SCI TX DMA 位 ti 触发传输