一,PS到PL的数据传输流程:
1,传输过程
(1)、向PL端查询剩余数据存储长度(以byte为单位);
(2)、通过写寄存器设置PL端DMA数据传输开始地址;
(3)、通过写寄存器设置PL端DMA数据传输长度(以byte为单位);
(4)、通过写寄存器启动PL端DMA传输;
(5)、通过读寄存器查询PL端DMA是否完成数据传输;
在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是否完成数据传输;
数据传输长度有数值限制,假如待传输数据长度为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));
}