王工您好:
我们现在用SCI3做串口收发,两个570芯片使用sci3进行通信,并使用DMA功能。
配置如下:

初始化代码:
void dma_init()
{
/*Assign DMA Request SCI3 Receive to Channel 1*/(将DMA请求SCI3接收分配给信道1*/)
dmaReqAssign(DMA_CH1, DMA_SCI3_RX);
sciRxData = SCI3_RX_ADDR;
/*为通道1*/配置控制数据包
G_dmaCTRLPKT2.Sadd = sciRxData;/*源地址*/
G_dmaCTRPKT2.DADD =(UINT32_t) RX_DATA;/*目标地址ss */
G_dmaCTRLPKT2.CHCTRL = 0;/*信道控制*/
g_dmaCTRLPKT2.FRCNT = 5;/*帧数*/
G_dmaCTRLPKT2.ELCNT = 1;/*元素计数*/
g_dmaCTRLPKT2.ELDOFFSET =0;/*元素目标偏移*/
G_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移*/
g_dmaCTRLPKT2.FRDOFFSET =0;/*帧目标偏移*/
g_dmaCTRLPKT2.FRSOFFSET =0;/*帧目标偏移*/
G_dmaCTRLPKT2.PORTAGN = PORTB_READ_Porta_WRITE;
G_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT;/*读取大小*/
g_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT;/* WRITE SIZE */
g_dmaCTRLPkt2.tType = frame_transfer;/* transfer type */
G_dmaCTRLPKT2.ADDMORD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/* autoinit */
/*设置通道0和1*/的控制数据包
dmaSetCtrlPacket(DMA_CH1, g_dmaCTRLPKT2);
/*将DMA通道0和1设置为在硬件请求时触发*/
dmaSetChEnable(DMA_CH1, DMA_HW);
/*启用DMA*/
dmaEnable();
/*启用SCI3接收DMA请求*/
sciREG3->SEINT || SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
}
接收函数为:
void sci_rcvData()
{
memset(pRcvData,0,size);
#IF 1.
while ((sciREG3->FLR和0x4U)== 0x4U)
{
}
#endif
/*- Disable所有中断*/
sciREG3->CLEARINT = SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
memcpy (pRcvData,RX_data,size);
dbgPrintf ("CPU:%d DMA recv:%d %d %d %d %d\r\n",CPU_id,pRcvData[0],pRcvData[1],pRcvData[2],pRcvData[2],pRcvData[3],pRcvData[4]);
/*-清除BTC标志*/
dmaREG->BTCFLAG |= 1U << DMA_CH1;
/*-设置通道1的控制pkt */
dmaRAMREG->PCP[DMA_CH1].ITCOUNT =((UINT32_t) 5<16U)| 1U;
/*-设置通道1使能*/
dmaSetChEnable(DMA_CH1, DMA_HW);
/*-使能SCI3接收DMA请求*/
sciREG3->SEINT || SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
}
周期执行下列代码:
对于(i=0;i<5;i++)
{
数据[I]++;
IF (data[i]=200)
Data[i]=0;
}
sciSend (sciREG3,5,data);
sci_rcvData();
但是两个cpu接收的数据都不对,打印如下,请王工给看一下我哪里弄错了,谢谢。



