PS透过bram 向PL传递 0-9的数据,
PL进行数据处理后( 在此为了简化,就将所取得的数据 + 100 返回) 透过dma 传回PS
项目代码
https://download.csdn.net/download/howard789/13693535
项目设计图
main函数
/*
* Empty C++ Application
*/
#include "xil_printf.h"
#include "sleep.h"
#include "bram_rd.h"
#include "xbram.h"
#include "xaxidma.h"
#include "xparameters.h"
#define BRAM_RD_BASE_ADDR XPAR_BRAM_RD_0_S00_AXI_BASEADDR
#define START_MASK BRAM_RD_S00_AXI_SLV_REG0_OFFSET// 0
#define ADDR_MASK BRAM_RD_S00_AXI_SLV_REG1_OFFSET// 4
#define LEN_MASK BRAM_RD_S00_AXI_SLV_REG2_OFFSET //8
#define BRAM_BASE_ADDR XPAR_BRAM_0_BASEADDR
#define START_ADDR 0
#define DATA_BYTE 4
#define DMA_DEV_ID XPAR_AXIDMA_0_DEVICE_ID
#define DDR_BASE_ADDR XPAR_PS7_DDR_0_S_AXI_BASEADDR
#define RX_BUFFER_BASE (DDR_BASE_ADDR + 0x00300000)
int init_num=999999;
XAxiDma AxiDma;
static u8 *RxBufferPtr;
int data_byte=4; //32位的数据,4个字节
void test_dma_poll(int num){
int data_size=1; // 1个32位的数据
//写入bram
XBram_WriteReg(BRAM_BASE_ADDR,START_ADDR*DATA_BYTE,num);
//通知pl读取bram数据
BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,ADDR_MASK,START_ADDR*DATA_BYTE);
BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,LEN_MASK,data_size*DATA_BYTE);
BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,START_MASK,1);
BRAM_RD_mWriteReg(BRAM_RD_BASE_ADDR,START_MASK,0);
//DEVICE_TO_DMA
int Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,
data_size*data_byte, XAXIDMA_DEVICE_TO_DMA);
if (Status != XST_SUCCESS) {
xil_printf("device_to_dma fail, Status:%d\n",Status);
}
Xil_DCacheInvalidateRange((UINTPTR)RX_BUFFER_BASE, data_size*data_byte);
//读取PL传回来的数据
int response=Xil_In32(RX_BUFFER_BASE);
if(response != init_num){
xil_printf("response:%d\n",response);
}
}
void exchange_by_POLL(void){
//初始化
// api_init_dma(0);
Xil_Out32(RX_BUFFER_BASE,init_num);
xil_printf("init num:%d\n",Xil_In32(RX_BUFFER_BASE));
int num;
for(int i=1;i<100;i++){
num=i/10;
test_dma_poll(num);
}
}
int main()
{
xil_printf("starting... \n");
//初始化 dma 使用poll模式
XAxiDma_Config *CfgPtr;
int Status;
RxBufferPtr = (u8 *)RX_BUFFER_BASE;
/* Initialize the XAxiDma device.
*/
CfgPtr = XAxiDma_LookupConfig(DMA_DEV_ID);
if (!CfgPtr) {
xil_printf("No config found for %d\r\n", DMA_DEV_ID);
return XST_FAILURE;
}
Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
if (Status != XST_SUCCESS) {
xil_printf("Initialization failed %d\r\n", Status);
return XST_FAILURE;
}
if(XAxiDma_HasSg(&AxiDma)){
xil_printf("Device configured as SG mode \r\n");
return XST_FAILURE;
}
/* Disable interrupts, we use polling mode
*/
XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
XAXIDMA_DEVICE_TO_DMA);
XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
XAXIDMA_DMA_TO_DEVICE);
//初始化接收数据的内存
Xil_Out32(RX_BUFFER_BASE,init_num);
xil_printf("init num:%d\n",Xil_In32(RX_BUFFER_BASE));
//PS透过bram 传入0-9的数据, PL进行数据处理 (+100)后, 透过dma传回PS端,PS打印
for(int i=1;i<100;i++){
int num=i/10;
test_dma_poll(num);
}
xil_printf("ending... \n");
return 0;
}
运行结果
starting...
init num:999999
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:100
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:101
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:102
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:103
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:104
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:105
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:106
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:107
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:108
response:109
response:109
response:109
response:109
response:109
response:109
response:109
response:109
response:109
ending...