📄 dm6430-stream.c
字号:
/* FILE NAME: dm6430-stream.c FILE DESCRIPTION: Streaming input sample program This program demonstrates using streaming input to read blocks of data from the digital input FIFO. User timer/counter 1 output initiates digital input sampling. Interrupts are generated on digital input FIFO half full. The samples are displayed on the screen. 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 BUF_SIZE6 0x4000 // The size of the buffer#define NUM_OF_SAMPLES6 512 // Number of samples in a buffer#define RATE6 1000 // Clock rate in 'Hz'#define IRQCHANNEL6 DM6430HR_INT1 // interrupt channel#define AD_SLOPE6 (65536.0/20.0) // Number Bits divided by AD Rangeintmain(int argument_count, char **arguments_p_p) { char buffer[NUM_OF_SAMPLES6]; double ActualRate0; double dummy; int descriptor; int status; unsigned long count = 0; 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"); status = InitBoard6430(descriptor); verify_success(status, "InitBoard6430() FAILED"); status = SetUserClock6430( descriptor, DM6430HR_CLK0, 8000000, 20000, &ActualRate0 ); verify_success(status, "SetUserClock6430() FAILED"); status = SetUserClock6430( descriptor, DM6430HR_CLK1, ActualRate0, RATE6, &dummy ); verify_success(status, "SetUserClock6430() FAILED"); status = ConfigDINClock6430(descriptor, DM6430HR_DI_FIFO_CLK_USER_TC1); verify_success(status, "ConfigDINClock6430() FAILED"); status = SetIRQ0Source6430(descriptor, IRQS_DIO_FIFO_HALF_6430); verify_success(status, "SetIRQ0Source6430() FAILED"); fprintf(stdout, "Digital Input Port Bit 0 sampled at %d Hz.\n", RATE6); status = EnableIRQ6430(descriptor, IRQCHANNEL6); verify_success(status, "EnableIRQ6430() FAILED"); status = ClearDINFIFO6430(descriptor); verify_success(status, "ClearDINFIFO6430() FAILED"); status = DINClockEnable6430(descriptor, 1); verify_success(status, "DINClockEnable6430() FAILED"); while (!isstdindata(200)) { int sample; unsigned long irq_counter; status = GetIRQCounter6430(descriptor, IRQCHANNEL6, &irq_counter); verify_success(status, "GetIRQCounter6430() FAILED"); if (count != irq_counter) { count = irq_counter; status = GetAutoincData6430( descriptor, rSTR_DIN_FIFO_6430, DM6430HR_STR_TYPE_BYTE, buffer, sizeof(buffer) ); verify_success(status, "GetAutoincData6430() FAILED"); for (sample = 0; sample < 10; sample++) fprintf( stdout, "DIN FIFO(%d/%d) = 0x%hhx\n", sample + 1, NUM_OF_SAMPLES6, buffer[sample] ); fprintf(stdout, "\n"); status = ClearDINFIFO6430(descriptor); verify_success(status, "ClearDINFIFO6430() FAILED"); } } status = DisableIRQ6430(descriptor, IRQCHANNEL6); verify_success(status, "DisableIRQ6430() FAILED"); status = DoneTimer6430(descriptor); verify_success(status, "DoneTimer6430() FAILED"); exit(EXIT_SUCCESS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -