【Xilinx】基于DMA的adc读取

硬件环境:ZYNQ7000
软件环境:petalinux2018.2
xilinx_vivado_sdk2018.2
学习例程:
【Xilinx】基于DMA的adc读取
文章图片

1、DMA初始化
1)定义变量

//定义ioctrl的命令 #define AXI_ADC_IOCTL_BASE'W' #define AXI_ADC_SET_SAMPLE_NUM_IO(AXI_ADC_IOCTL_BASE, 0) #define AXI_ADC_SET_DMA_LEN_BYTES_IO(AXI_ADC_IOCTL_BASE, 1) #define AXI_ADC_DMA_INIT_IO(AXI_ADC_IOCTL_BASE, 2) #define AXI_ADC_DMA_START_IO(AXI_ADC_IOCTL_BASE, 3) #define AXI_ADC_DMA_DEINIT_IO(AXI_ADC_IOCTL_BASE, 4)#define ADC_CAPTURELEN1920//数据长度 short CH0DmaRxBuffer[ADC_CAPTURELEN]; //数据存放空间 int fd0;//设备文件描述符

2)adc初始化
//操作函数 adc_capture_init(&fd0,"/dev/adc0",ADC_CAPTURELEN,ADC_CAPTURELEN*2); //函数原型 int adc_capture_init(int *fd,char *adc_dev,int adc_sample_num,int dma_len_bytes) { //打开adc设备"/dev/adc0" *fd = open(adc_dev, O_RDONLY); if (*fd < 0) { return -1; } //设置数据长度 if (ioctl(*fd, AXI_ADC_SET_SAMPLE_NUM, adc_sample_num)) { printf("ADC DMA AXI_ADC_SET_SAMPLE_NUM failed: %s\n", strerror(errno)); return -2; } //设置字节长度 if (ioctl(*fd, AXI_ADC_SET_DMA_LEN_BYTES, dma_len_bytes)) { printf("ADC DMA AXI_ADC_SET_DMA_LEN_BYTES failed: %s\n", strerror(errno)); return -2; } //初始化DMA if (ioctl(*fd, AXI_ADC_DMA_INIT)) { printf("ADC DMA INIT failed: %s\n", strerror(errno)); return -2; } return 0; }

DMA定义类型为short,长度为1920,因此字节长度为1920*2
3)adc数据捕获
//操作函数 adc_capture(fd1,ADC_CAPTURELEN,(unsigned char *)CH1DmaRxBuffer); //函数原型 int adc_capture(int fd, int samples_num, unsigned char *buf) { //开始DMA传输 if (ioctl(fd, AXI_ADC_DMA_START) == 0) { //读取samples_num * 2字节的DMA数据 read(fd, buf, samples_num * 2); } else {printf("XADC DMA STARTfailed: %s\n", strerror(errno)); return -1; } return 0; }

【【Xilinx】基于DMA的adc读取】

    推荐阅读