ZYNQ DMA实现PS与PL间数据传输通信

时间:2024-03-21 22:59:07

一,PS到PL的数据传输流程:

1,传输过程

(1)、向PL端查询剩余数据存储长度(以byte为单位);

(2)、通过写寄存器设置PL端DMA数据传输开始地址;

(3)、通过写寄存器设置PL端DMA数据传输长度(以byte为单位);

(4)、通过写寄存器启动PL端DMA传输;

(5)、通过读寄存器查询PL端DMA是否完成数据传输;

ZYNQ DMA实现PS与PL间数据传输通信

在SDK PS端代码:

PS(ARM)端驱动代码如下:

#define WRITE_SPACE_REG 0x84000004

#define ps2pl_SA 0x84000008

#define ps2pl_LENGTH  0x8400000C

#define ps2pl_START 0x84000010

#define ps2pl_FINISHED 0x84000014

 

data_space = Xil_In32(WRITE_SPACE_REG);

void init_axi_dma_simple_write(u32 num)

{

Xil_Out32(ps2pl_SA,(unsigned int )recvram);

Xil_Out32(ps2pl_LENGTH,(0x80000000+num));

Xil_Out32(ps2pl_START,0x00000001);

while(!(Xil_In32(ps2pl_FINISHED)&0x00000001));

}

二,PL到PS的数据传输流程:

1,PL到PS的数据传输相对复杂,vivado自带DMA测试发现有时不太正常,按照vivado自带DMA接口协议重新写了模块:

(1)、通过读寄存器查询待传输数据长度(以byte为单位);

(2)、通过写寄存器设置PL端DMA数据传输开始地址;

(3)、通过写寄存器设置数据传输长度(以byte为单位);

(4)、通过写寄存器启动数据传输;

(5)、通过读寄存器查询PL端DMA是否完成数据传输;

ZYNQ DMA实现PS与PL间数据传输通信

数据传输长度有数值限制,假如待传输数据长度为8byte的整数倍,则每次的数据传输长度也必须为8byte的整数倍。

假如待传输数据长度不是8byte的整数倍,以15byte为例,只能以下面两种方式读取:

1、第一次读取8byte,第二次读取7byte;

2、一次读取15byte。为了简化这种限制,可以使每次的待传输数据长度小于PS端的缓存,这样可以一次读取所有待传输的数据,也就是第二种读取方式。

在SDK  PS 端代码如下:

#define READ_NUM_REG 0x84000044

#define pl2ps_DA 0x84000048

#define pl2ps_LENGTH 0x8400004C

#define pl2ps_START 0x84000050

#define pl2ps_FINISHED 0x84000054

 

data_return = Xil_In32(READ_NUM_REG);

 

void init_axi_dma_simple_read(u32 num)

{

Xil_Out32(pl2ps_DA,(unsigned int )recvram);

Xil_Out32(pl2ps_LENGTH,(0x80000000+num));

Xil_Out32(pl2ps_START,0x00000001);

while(!(Xil_In32(pl2ps_FINISHED)&0x00000001));

}