您好!
我们正在尝试检查 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);
}