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

初始化代码:
void dma_init()
{
/*Assign DMA request SCI3 receive to Channel 1*/
dmaReqAssign(DMA_CH1, DMA_SCI3_RX);
sciRxData = SCI3_RX_ADDR;
/*Configure control packet for Channel 1*/
g_dmaCTRLPKT2.SADD = sciRxData; /* source address */
g_dmaCTRLPKT2.DADD = (uint32_t)RX_DATA; /* destination addr ss */
g_dmaCTRLPKT2.CHCTRL = 0; /* channel control */
g_dmaCTRLPKT2.FRCNT = 5; /* frame count */
g_dmaCTRLPKT2.ELCNT = 1; /* element count */
g_dmaCTRLPKT2.ELDOFFSET = 0; /* element destination offset */
g_dmaCTRLPKT2.ELSOFFSET = 0; /* element destination offset */
g_dmaCTRLPKT2.FRDOFFSET = 0; /* frame destination offset */
g_dmaCTRLPKT2.FRSOFFSET = 0; /* frame destination offset */
g_dmaCTRLPKT2.PORTASGN = PORTB_READ_PORTA_WRITE;
g_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT; /* read size */
g_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT; /* write size */
g_dmaCTRLPKT2.TTYPE = FRAME_TRANSFER; /* transfer type */
g_dmaCTRLPKT2.ADDMODERD = ADDR_FIXED; /* address mode read */
g_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1; /* address mode write */
g_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF; /* autoinit */
/*Set control packet for channel 0 and 1*/
dmaSetCtrlPacket(DMA_CH1, g_dmaCTRLPKT2);
/*Set dma channel 0 and 1 to trigger on hardware request*/
dmaSetChEnable(DMA_CH1, DMA_HW);
/*Enable DMA*/
dmaEnable();
/*Enable SCI3 Receive DMA Request*/
sciREG3->SETINT |= 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[3],pRcvData[4]);
/*- 清除BTC flag*/
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->SETINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;
}
周期执行下列代码:
for(i=0;i<5;i++)
{
data[i]++;
if(data[i]==200)
data[i]=0;
}
sciSend(sciREG3,5,data);
sci_rcvData();
但是两个cpu接收的数据都不对,打印如下,请王工给看一下我哪里弄错了,谢谢。



