我的主函数是这样写的,两个buffer接收FPGA发过来的数据(0-32766),每个buffer大小是1024,UPID1的参数是:
#define upp_line_size (1024)
#define upp_line_count (1)
我想实现连续接收FPGA发过来的数据的功能,即upp_buffer_ping接收0-1023,upp_buffer_pong接收1024-2047。
但是事实上,两个buffer接收的都是0-1023。想了好久也没想明白原因。谁能告诉我这是为什么?我要想连续接收FPGA发过来的数据该怎么做?
/*启动UPP DMA传输*/
UARTPuts("ping\n",-2);
upp_reg_hdl->UPID0 = (Uint32)upp_buffer_ping;
upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(upp_buffer_ping[0]);
upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(upp_buffer_ping[0]);
upp_reg_hdl->UPID0 = (Uint32)upp_buffer_pong;
upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(upp_buffer_pong[0]);
upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(upp_buffer_pong[0]);
UARTPuts("printf data.\r\n", -2);
for(j=0; j<upp_frame_size; )
{
for(k=0; k<5; k++)
{
UARTprintf("upp_buffer_ping[%d]=%d ",j, upp_buffer_ping[j]);
j++;
}
UARTPuts("\n",-2);
}
for(j=0; j<upp_frame_size; )
{
for(k=0; k<5; k++)
{
UARTprintf("upp_buffer_pong[%d]=%d ",j, upp_buffer_pong[j]);
j++;
}
UARTPuts("\n",-2);
}
Tony Tang:
仔细看样例代码,两个配置之间加pend位检测,不然不就覆盖了吗。
yan wang4:
回复 Tony Tang:
pend位一直是低电平。。。。
yan wang4:
回复 Tony Tang:
覆盖了是什么意思?是第二个配置把第一个覆盖了吗?
Tony Tang:
回复 yan wang4:
是的,两个配置之间一定要加pend检测:
Each DMA channel allows a second descriptor to be queued while the previously programmed DMAtransfer is still running. The UPxS2.PEND bit reports whether a new set of DMA parameters may bewritten to the DMA descriptor registers. Each DMA channel can have at most one active transfer and onequeued transfer. This allows each I/O channel to perform uninterrupted, consecutive transactions acrossDMA transfer boundaries.
yan wang4:
回复 Tony Tang:
我也看到了这一段文字,但是我的pend位在程序运行期间一直是0,检测不起作用啊
Tony Tang:
回复 yan wang4:
为什么不先加上测试一下再说呢?
yan wang4:
回复 Tony Tang:
你好Tony Tang,
我将pend位检测的程序加上测试了多次,正如我前面所说,这个循环没有起到作用,两个buffer的数据还是和之前一样。
第一次DMA执行完执行该循环,后进入中断服务函数,然后在执行第二个DMA,然后再执行一次中断服务函数。
另外我发现寄存器UPPCR中的DB位在执行完第一次DMA后一直是1。
TI中文支持网
