工具与软件:
您好!
我正在处理一个需要在2个器件之间进行通信的应用。 我目前正在使用 SCI 和 DMA 测试消息传输。
我有不同的消息 msg1大小15、msg2大小14和 msg3大小13。 我配置了3个 DMA 数据包、如下所示:
g_dmaCTRL g_dmaCTRLPKT1;
/*配置通道0的控制包*/
g_dmaCTRLPKT1.Sadd =(uint32_t) msg1;/*源地址*/
G_dmaCTRLPKT1.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT1.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT1.FRCNT = 15;/*帧计数*/
g_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.PORTAGN = 4;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT1.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH0、31);
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);
g_dmaCTRL g_dmaCTRLPKT2;
/*为通道1*/配置控制数据包
g_dmaCTRLPKT2.Sadd =(uint32_t) msg2;/*源地址*/
g_dmaCTRLPKT2.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT2.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT2.FRCNT = 14;/*帧计数*/
g_dmaCTRLPKT2.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT2.ELDOFFSET = 0;/*元素目标偏移*/
g_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT2.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT2.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT2.PORTASGN=4;
G_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT2.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT2.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT2.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH1、31);
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT2);
g_dmaCTRL g_dmaCTRLPKT3;
/*为通道1*/配置控制数据包
g_dmaCTRLPKT3.Sadd =(uint32_t) msg3;/*源地址*/
G_dmaCTRLPKT3.DADD =(uint32_t)((uint8*)&(sciREG->TD)+3);/*目标地址*/
G_dmaCTRLPKT3.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT3.FRCNT = 13;/*帧计数*/
g_dmaCTRLPKT3.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT3.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT3.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT3.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT3.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT3.PORTASGN=4;
G_dmaCTRLPKT3.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT3.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT3.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT3.ADDMODERD = ADDR_INC1;/*地址模式读取*/
G_dmaCTRLPKT3.ADDMODEWR = ADDR_FIXED;/*地址模式写入*/
G_dmaCTRLPKT3.AUTOINIT = AUTOINIT_OFF;/* autoinit */
dmaReqAssign (DMA_CH2、31);
dmaSetCtrlPacket (DMA_CH2、g_dmaCTRLPKT3);
在我的主,我做所有必要的初始化,然后:
sciREG->SETINT =(1<<16)|(1<<8);//设置 TX DMA 和设置 TX int
然后、在我的循环中我使用 带有延迟的 dmaSetChEnable (DMA_CH0、DMA_HW)、dmaSetChEnable (DMA_CH1、DMA_HW)和 dmaSetChEnable (DMA_CH2、DMA_HW)、但使用 hterm 接收到的第一条消息是正确的我得到15个字节、第二条消息是错误的、除了第二个字节完全丢失之外、所有14个字节中有13个字节。
对于0xB7、0X56、0XAA、0xBB、0xCC、0xDD、0xEE、0xFF、 0x11、0x22、0x33、0x44、0x55、 0x66 I 获取 0xB7、0XAA、0xBB、0xCC、0xDD、0xEE、0xFF、 0x11、0x22、0x33、0x44、0x55、 0x66。
对于第三条消息、我得到的错误与第二条消息相同、13个字节中的12个字节均正确、但第二个字节完全缺失除外。
当我只发送第1条、第2条或第3条消息时、我没有错误、但是每当通道之间的 DMA 切换时、第一条消息是正确的、但其余消息由 hterm 接收、没有第二个字节。
为什么? 我是否缺少配置步骤?
提前感谢您的帮助。







