【Xilinx】基于DMA的adc读取

硬件环境:ZYNQ7000

软件环境:petalinux2018.2

                  xilinx_vivado_sdk2018.2

学习例程:

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_CAPTURELEN     1920          //数据长度
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 START  failed: %s\n", strerror(errno));
        return -1;
    }
    return 0;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值