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 Tx 数据重新配置 DMA 控制数据包

Guru**** 2614265 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/772625/tms570lc4357-dma-control-packet-reconfiguration-for-variable-length-sci-tx-data

器件型号:TMS570LC4357

您好、Miroslav、

!! 感谢您的支持:-)!!

我将使用 DMA 通过 SCI1进行数据传输。 使用 DMA 在 SCI 上发送的缓冲区具有可变长度。

每次我收到块传输完成中断(BTC)后、我将复制 SharedRAM 位置中的新数据、并通过传递缓冲区长度来调用以下函数。   

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void dma_modify_and_send (uint16 packet_size)

sciInit();

while (((sciREG1->FLR & SCI_TX_INT)== 0U)||((sciREG1->FLR & 0x4)== 0x4))

}/*等待*/

dmaEnableInterrupt (DMA_CH0、BTC、DMA_INTA);

/*将 DMA 请求 SCI3发送到通道0*/
dmaReqAssign (DMA_CH0、DMA_SCI1_TX);

/*将 DMA 请求 SCI4接收分配给通道1*/
sciTxData = SCI1_TX_ADDR;


/*为通道0*/配置控制包
G_dmaCTRLPKT1.Sadd =(uint32_t) TX_DATA;/*源地址*
G_dmaCTRLPKT1.DADD = sciTxData;/*目标地址*
G_dmaCTRLPKT1.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT1.FRCNT = packet_size;/*帧计数*/
G_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移量*
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_TRANSFSION;/* TRANSFSION TYPE *
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化*


/*为通道0和1设置控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);

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

/*启用 DMA*/
dmaEnable();

/*启用 SCI3发送和 SCI4接收 DMA 请求*/
sciREG1->SETINT |= SCI_SET_TX_DMA;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

现在我有两个问题:

1)我是否每次都需要调用 sciInit()? 如果您的答案为否,DMA 将不会发送后续复制的缓冲区,如果没有调用 sciInit()函数,则停止工作;函数是否有针对该 bb 的任何解决方案,因为我们不应该重新初始化 sciInit();  

2) 2)每次配置新控制数据包时、我是否需要使用以下完整代码。 我应该重新配置的最小裸代码是什么?

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

dmaEnableInterrupt (DMA_CH0、BTC、DMA_INTA);

/*将 DMA 请求 SCI3发送到通道0*/
dmaReqAssign (DMA_CH0、DMA_SCI1_TX);

/*将 DMA 请求 SCI4接收分配给通道1*/
sciTxData = SCI1_TX_ADDR;


/*为通道0*/配置控制包
G_dmaCTRLPKT1.Sadd =(uint32_t) TX_DATA;/*源地址*
G_dmaCTRLPKT1.DADD = sciTxData;/*目标地址*
G_dmaCTRLPKT1.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT1.FRCNT = packet_size;/*帧计数*/
G_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移量*
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_TRANSFSION;/* TRANSFSION TYPE *
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*  
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化*


/*为通道0和1设置控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);

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

/*启用 DMA*/
dmaEnable();

/*启用 SCI3发送和 SCI4接收 DMA 请求*/
sciREG1->SETINT |= SCI_SET_TX_DMA;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

    我很抱歉耽误你的答复。 在上面发布的代码中、您不会为 RX 定义应该被修复的地址模式。 我看不到重新初始化 SCI 模块以启动另一个 DMA 传输的原因。

    第一次为事务选择 DMA 通道时、会发生以下过程:
    主控制数据包首先由 DMA 状态机读取。
    对通道进行仲裁后、当前源地址、目标地址和传输计数将被复制到各自的工作映像中。
    3.当 DMA 再次为通道提供服务时,状态机将读取主控制包和工作控制包,以继续 DMA 传输,直到整个块传输结束。

    当再次请求同一通道时、状态机将再次启动、只读取主控制数据包、然后继续执行上述相同的过程。

    注意:如果通道处于挂起状态、改变通道控制包的内容将清除相应的挂起位。 如果活动通道的控制数据包发生更改、则该通道将立即在仲裁边界处停止。 当同一通道再次被触发时、它将从新的控制数据包信息开始。