⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm6430-dma.c

📁 rt 6430 采集卡 linux下驱动源代码
💻 C
字号:
/*	FILE NAME: dm6430-dma.c	FILE DESCRIPTION: DMA (Direct Memory Access) sample program.		This program uses DMA transfers to acquire data.	PROJECT NAME: Linux DM6430 Driver, Library, and Example Programs	PROJECT VERSION: (Defined in README.TXT)	Copyright 2004 RTD Embedded Technologies, Inc.  All Rights Reserved.*/#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/poll.h>#include <unistd.h>#include <dm6430lib.h>char *program_name_p;static voidusage(void) {    fprintf(	stderr,	"\n"        "Usage: %s MINOR_NUMBER"        "\n",	program_name_p    );    exit(EXIT_FAILURE);}static voidverify_success(int status, const char *message_p) {    if (status == -1) {	perror(message_p);	exit(EXIT_FAILURE);    }}static intisstdindata(int timeout) {    struct pollfd	in = {0, POLLIN | POLLERR | POLLPRI, 0};    int			num_fds;    while (((num_fds = poll(&in, 1, timeout)) == -1) && (errno == EINTR))	;    return ((num_fds == 1) && (in.revents & (POLLIN | POLLPRI)));}#define DMA_BUF_SIZE5	0x2000			// The used size of the DMA buffer#define DMA_CHAN5	DM6430HR_DMA1		// DMA channel#define ADCHANNEL5	DM6430HR_AIN1		// A/D channel#define GAIN5		DM6430HR_GAINx1		// Gain#define SE_DIFF5	DM6430HR_SE_SE		// Single ended.#define RATE5		100000			// Sampling rate#define	AD_SLOPE5	(65536.0/20.0)		// Number Bits divided by AD Rangeintmain(int argument_count, char **arguments_p_p) {    double		Actual_PACER_RATE;    int			descriptor;    int			status;    short		dmabuf[DMA_BUF_SIZE5 / 2];    unsigned int	minor_number;    program_name_p = arguments_p_p[0];    if (argument_count != 2) {	fprintf(stderr, "Invalid number of options given.\n");	usage();    }    if (sscanf(arguments_p_p[1], "%u", &minor_number) == 0) {	fprintf(stderr, "Invalid device minor number.\n");	usage();    }    descriptor = OpenBoard6430(minor_number);    verify_success(descriptor, "OpenBoard6430() FAILED");    memset(dmabuf, 0, DMA_BUF_SIZE5);    status = InstallDMA6430(descriptor, DMA_CHAN5);    verify_success(status, "InstallDMA6430() FAILED");          status = InitBoard6430(descriptor);    verify_success(status, "InitBoard6430() FAILED");    status = SetPacerClock6430(descriptor, RATE5, &Actual_PACER_RATE);    verify_success(status, "SetPacerClock6430() FAILED");     status = SetChannelGain6430(descriptor, ADCHANNEL5, GAIN5, SE_DIFF5);    verify_success(status, "SetChannelGain6430() FAILED");    status = SetStartTrigger6430(descriptor, DM6430HR_START_TRIG_SOFTWARE);    verify_success(status, "SetStartTrigger6430() FAILED");    status = SetStopTrigger6430(descriptor, DM6430HR_STOP_TRIG_SOFTWARE);    verify_success(status, "SetStopTrigger6430() FAILED");     status = SetConversionSelect6430(descriptor, DM6430HR_CONV_PACER_CLOCK);    verify_success(status, "SetConversionSelect6430() FAILED");    fprintf(	stdout,	"Channel %d sampled at %d Hz.\nThe DMA buffer size is %d bytes\n",	ADCHANNEL5 + 1,	RATE5,	DMA_BUF_SIZE5    );    while (!isstdindata(200)) {	int	done_flag;	int	sample;	size_t	transfer_size;	status = ClearADFIFO6430(descriptor);	verify_success(status, "ClearADFIFO6430() FAILED");	status = StartDMA6430(descriptor, DMA_CHAN5, DMA_BUF_SIZE5);	verify_success(status, "StartDMA6430() FAILED");	status = StartConversion6430(descriptor);	verify_success(status, "StartConversion6430() FAILED");	status = IsADDMADone6430(descriptor, &done_flag);	verify_success(status, "IsADDMADone6430() FAILED");    	do {	    status = IsADDMADone6430(descriptor, &done_flag);	    verify_success(status, "IsADDMADone6430() FAILED");	} while (!done_flag);	status = StopDMA6430(descriptor, DMA_CHAN5);	verify_success(status, "StopDMA6430() FAILED");	status = ClearADDMADone6430(descriptor);	verify_success(status, "ClearADDMADone6430() FAILED");	status = GetDmaData6430(	    descriptor,	    dmabuf,	    DMA_CHAN5,	    DMA_BUF_SIZE5,	    0,	    &transfer_size	);	verify_success(status, "GetDmaData6430() FAILED");		// Display first couple of samples to see what is going on	for (sample = 0 ; sample < 10; sample++)	    fprintf(	    stdout,	    "Channel %d = %+5.2lf mV\n",	    ADCHANNEL5 + 1,	    ((double) dmabuf[sample]) / AD_SLOPE5	);	fprintf(stdout, "\n");    }    status = StopDMA6430(descriptor, DMA_CHAN5);    verify_success(status, "StopDMA6430() FAILED");    status = DeInstallDMA6430(descriptor, DMA_CHAN5);    verify_success(status, "DeInstallDMA6430() FAILED");    exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -