【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_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读取】
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长