您好、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;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////