工具/软件:Code Composer Studio
您好!
我们正在尝试使用 TMS570LC43x Hercules 开发套件(HDK)检查 DMA 功能。
使用硬件触发器的 MibSPI 和 SCI DMA 传输正在工作。 但使用软件触发器的 DMA 传输不起作用。
我们需要验证软件触发 DMA 和 DMA 链接功能。
我们用于测试该功能的代码已附加。
请帮帮我。
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.
工具/软件:Code Composer Studio
您好!
我们正在尝试使用 TMS570LC43x Hercules 开发套件(HDK)检查 DMA 功能。
使用硬件触发器的 MibSPI 和 SCI DMA 传输正在工作。 但使用软件触发器的 DMA 传输不起作用。
我们需要验证软件触发 DMA 和 DMA 链接功能。
我们用于测试该功能的代码已附加。
请帮帮我。
您好、Wang、
感谢您的回复。 我们将 PORTASGN 更新为0x2、但仍然不会发生 DMA 传输。
我要附加更新的代码和 DMA 寄存器值。
您是否有任何示例代码来检查 DMA 链接功能? 我们主要尝试测试 DMA 链功能。
谢谢。
你好 Bijo、
以下代码经过测试、没有任何问题。
int main (空)
{
/*用户代码开始(3)*/
uint32 src0[transfer_size]={0x11111111、0x22222222、0x333333、0x444444、0x555555、 0x66666666、0x77777777、0x8888888888};
uint32 src1[transfer_size]={0x99999999、0xaaaaaaaaaa、0xbbbbbbbb、0xcccccc、0xdddddddd、 0xeeeeee、0xffffffff、0x12345678};
uint32 src2[transfer_size]={0x11223344、0x55667788、0x99aabbcc、0xddeeff00、0x12345678、 0x13579bdf、0x2468ace0、0x87654321};
uint32 dest0[transfer_size]={0};
uint32 dest1[transfer_size]={0};
uint32 dest2[transfer_size]={0};
/*启用 IRQ 中断*/
_enable_IRQ ();
dmaEnable();
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src0;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest0;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH1 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src1;//源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest1;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = DMA_CH2 + 1;/*通道控制*
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT);
/*-配置 DMA 控制数据包*/
G_dmaCTRLPKT.Sadd =(uint32_t) src2;/*源地址*
G_dmaCTRLPKT.DADD =(uint32_t) dest2;/*目标地址;TG0的起始地址*/
G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);
dmaSetChEnable (DMA_CH0、DMA_SW);//启用 DMA 通道*
dmaSetChEnable (DMA_CH1、DMA_HW);
dmaSetChEnable (DMA_CH2、DMA_HW);
while ((dmaREG->HWCHENAS & 0x07)!= 0x0);
while (1);/*循环永远*/
/*用户代码结束*/
返回0;
}