|
发表于 2011-11-29 09:33:33
|
显示全部楼层
回复【164楼】dr2001
-----------------------------------------------------------------------
回复【164楼】dr2001
-----------------------------------------------------------------------
问各位一个问题:
本工程的思路是:在UART的二个socket,CY_U3P_LPP_SOCKET_UART_PROD和CY_U3P_LPP_SOCKET_UART_CONS,通过CY_U3P_DMA_TYPE_MANUAL_OUT和CY_U3P_DMA_TYPE_MANUAL_IN的模式使数据正常的传输,但是已经修改过多次也试验过多次,本工程还是没有正常的跑起来,请高手们指点下迷津。
以下是程序的重点部分:
第一部分,进程事件处理部分
void
UartThread_Entry(uint32_t input)
{
CyU3PDmaBuffer_t FX3UartDmaBuffer,UartOutBuffer;
CyU3PReturnStatus_t apiRetstatus;
//Initialize the UART Example application
CyFxUartAppInt();
//CyU3PMemSet(FX3UartDmaBuffer.buffer,0x32,CY_FX_UART_DMA_BUF_SIZE);
for(;;)
{
if(CyU3PSemaphoreGet(&UartDmaSemaphore,CYU3P_WAIT_FOREVER)== 0 )
{
//CyU3PMemSet(FX3UartDmaBuffer.buffer,3,CY_FX_UART_DMA_BUF_SIZE);
if (CyU3PDmaChannelGetBuffer (&UartDmaChHandleIn, &FX3UartDmaBuffer,CYU3P_NO_WAIT) == CY_U3P_SUCCESS)
{
if(CyU3PDmaChannelGetBuffer (&UartDmaChHandleOut, &UartOutBuffer,CYU3P_WAIT_FOREVER) == CY_U3P_SUCCESS)
{
CyU3PMemCopy (UartOutBuffer.buffer, FX3UartDmaBuffer.buffer, FX3UartDmaBuffer.count);
apiRetstatus=CyU3PDmaChannelCommitBuffer(&UartDmaChHandleOut,FX3UartDmaBuffer.count,0);
if(apiRetstatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetstatus);
}
}
}
apiRetstatus = CyU3PDmaChannelDiscardBuffer (&UartDmaChHandleIn);
if(apiRetstatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetstatus);
}
CyU3PThreadSleep(100);
}
}
};
第二部分:二个DMA通道的初始化部分
//configure DMA channel Manual In
dmacfg.size = CY_FX_UART_DMA_BUF_SIZE;
dmacfg.count = 2;
dmacfg.consHeader = 0;
dmacfg.prodFooter = 0;
dmacfg.prodHeader = 0;
dmacfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
dmacfg.consSckId = CY_U3P_CPU_SOCKET_CONS;//ENGRESS
//dmacfg.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;//ENGRESS
//dmacfg.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;//INGRESS
dmacfg.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;//INGRESS
dmacfg.notification = CY_U3P_DMA_CB_PROD_EVENT;
dmacfg.cb = CyFxUartDmaCallback;
//dmacfg.cb = NULL;
dmacfg.prodAvailCount= 0;
//Manual Channel
//apiRetstatus = CyU3PDmaChannelCreate(&UartDmaChHandle,CY_U3P_DMA_TYPE_MANUAL,&dmacfg);
//Manual out Channel
apiRetstatus = CyU3PDmaChannelCreate(&UartDmaChHandleIn,CY_U3P_DMA_TYPE_MANUAL_IN,&dmacfg);
//
if(apiRetstatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetstatus);
}
//configure DMA channel Manual Out
//dmacfg.size = CY_FX_UART_DMA_BUF_SIZE;
dmacfg.count = 2;
dmacfg.consHeader = 0;
dmacfg.prodFooter = 0;
dmacfg.prodHeader = 0;
dmacfg.dmaMode = CY_U3P_DMA_MODE_BYTE;
dmacfg.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;//ENGRESS
//dmacfg.consSckId = CY_U3P_LPP_SOCKET_UART_CONS;//ENGRESS
//dmacfg.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;//INGRESS
dmacfg.prodSckId = CY_U3P_CPU_SOCKET_PROD;
//dmacfg.notification = CY_U3P_DMA_CB_PROD_EVENT;
//dmacfg.cb = CyFxUartDmaCallback;
dmacfg.cb = NULL;
dmacfg.prodAvailCount= 0;
//Manual Channel
//apiRetstatus = CyU3PDmaChannelCreate(&UartDmaChHandle,CY_U3P_DMA_TYPE_MANUAL,&dmacfg);
//Manual out Channel
apiRetstatus = CyU3PDmaChannelCreate(&UartDmaChHandleOut,CY_U3P_DMA_TYPE_MANUAL_OUT,&dmacfg);
//
if(apiRetstatus != CY_U3P_SUCCESS)
{
CyFxAppErrorHandler(apiRetstatus);
}
请高手们务必指点下。
在挂上整个工程的文件:
点击此处下载 ourdev_699996RCKO4X.rar(文件大小:560K) (原文件名:FX3UartDmaMode.rar) |
|