基于EDMA可以实现pingpong缓存,从而实现ADC的连续不断的采样。但主要用于ADC采样的uPP接口使用的是专用的DMA控制器,而不是EDMA。由此得一个问题,使用uPP接口是否可实现ADC连续不断的采样?
Tony Tang:
uPP的DMA也可以实现两套参数交替传数据。通过pend位判断何时可以写入下一帧参数。所以是可以实现连续采样的。
yan wang4:
回复 Tony Tang:
你好Tony Tang,
你说的这个我不知道该怎样实现,能不能给个程序参考一下?或者加我QQ:1005938597
yan wang4:
你好Oscar Ou,
我最近也在做这方面的东西,请问你这个问题解决了吗?可不可以请教你一下,麻烦加我QQ:1005938597
Tony Tang:
回复 yan wang4:
附件里的upp例程里有。
for(i = 1; i < 1464843; i++) { UPP->UPQD0 = (uint32_t)&xmit_buffer;//add next DMA transfer UPP->UPQD1 = 0x00010080; //1 lines 128 bytes per line UPP->UPQD2 = 0x00000080; //no offset between lines
while(UPQS2r->bits.PEND == 1){}; }
yan wang4:
回复 Tony Tang:
谢谢!
yan wang4:
回复 Tony Tang:
你好Tony Tang ,
我的程序是这样写的:
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]);
UARTPuts("pong\n",-2); 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]);
我是想让这两个buffer连续接收FPGA端发送的数据(目前数据是自己造的,0-32766,循环发送),即upp_buffer_ping接收0-1023,upp_buffer_pong可以继续接收后面的数据1024-2048。但实际上,两个buffer都是接收的0-1023,这是什么原因呢?
Tony Tang:
回复 yan wang4:
两个配置中间加检查pend位:
while(UPQS2r->bits.PEND == 1){};
yan wang4:
回复 Tony Tang:
您好,很高兴您能够回复我。
我单步运行程序来观察过寄存器UPIS2中的PEND位,一直是低电平,所以这个循环语句对程序是不起作用的。
yan wang4:
回复 Tony Tang:
您好,在我的整个程序运行过程中,UPIS2的值一直是0x00000080,问题是不是出在这里?
zhichang qiu:
回复 yan wang4:
您好,请问你懂的问题解决了吗