📄 dm6430-dma.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 + -