📄 pci550x_adc_dma.c
字号:
if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_CLOCK_SOURCE"); exit(1); } else { printf("Internal Pacer Clock Source selected\n"); } /* set the PACER CLOCK RATE */ if (F) { rc = ioctl(fd, PCI550X_IOCT_ADC_FPCEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_FPCEN"); exit(1); } rc = ioctl(fd, PCI550X_IOCS_ADC_FAST_CLOCK_RATE, &ndelay); if(rc == -1) { perror("ioctl " "PCI550X_IOCS_ADC_FAST_CLOCK_RATE"); exit(1); } else { printf("Pacer clock(0.25 usecs): %lu\n", ndelay); } } else { rc = ioctl(fd, PCI550X_IOCT_ADC_FPCEN, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_FPCEN"); exit(1); } rc = ioctl(fd, PCI550X_IOCS_ADC_PACER_CLOCK_RATE, &udelay); if(rc == -1) { perror("ioctl " "PCI550X_IOCS_ADC_PACER_CLOCK_RATE"); exit(1); } else { printf("ADC Pacer clock(usecs): %lu\n", udelay); } } } /* select packed/unpacked data mode */ rc = ioctl(fd, PCI550X_IOCT_ADC_PDM, packed); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_PDM"); free(buf); exit(1); } else { if (packed) printf("PDM enabled\n"); else printf("PDM disabled\n"); } /* About Trigger Mode */ if (A) { rc = ioctl(fd, PCI550X_IOCS_ADC_CCOUNT, (int *)&ccount); if (rc == -1) { perror("ioctl PCI550X_IOCS_ADC_CCOUNT"); exit(1); } rc = ioctl(fd, PCI550X_IOCT_ADC_ATEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_ATEN"); exit(1); } else { printf("About Trigger Mode CCOUNT = %d\n", ccount); } } else { rc = ioctl(fd, PCI550X_IOCT_ADC_ATEN, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_ATEN"); exit(1); } else printf("About Trigger Mode disabled\n"); } /* ADC FIFO Enable */ rc = ioctl(fd, PCI550X_IOCT_AD_STATUS_FFEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_AD_STATUS_FFEN"); free(buf); exit(1); } else { printf("ADC FIFO enabled\n"); } /* select gate source for the onboard pacer clock */ if (g | G | t | T) { rc = ioctl(fd, PCI550X_IOCT_ADC_CGSL, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_CGSL"); exit(1); } else printf("ADC external "); if (g | G ) { rc = ioctl(fd, PCI550X_IOCT_ADC_TGSL, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGSL"); exit(1); } else printf("level "); if (G) { rc = ioctl(fd, PCI550X_IOCT_ADC_TGPL, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGPL"); exit(1); } else printf("(high) gate enabled\n"); g = PCI550X_DISABLE; } else { rc = ioctl(fd, PCI550X_IOCT_ADC_TGPL, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGPL"); exit(1); } else printf("(low) gate enabled\n"); G = PCI550X_DISABLE; } t = T = PCI550X_DISABLE; } else { rc = ioctl(fd, PCI550X_IOCT_ADC_TGSL, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGSL"); exit(1); } else printf("edge "); g = G = PCI550X_DISABLE; if (T) { rc = ioctl(fd, PCI550X_IOCT_ADC_TGPL, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGPL"); exit(1); } else printf("(rising) trigger enabled\n"); t = PCI550X_DISABLE; } else { rc = ioctl(fd, PCI550X_IOCT_ADC_TGPL, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGPL"); exit(1); } else printf("(falling) trigger enabled\n"); T = PCI550X_DISABLE; } } } else { rc = ioctl(fd, PCI550X_IOCT_ADC_CGSL, PCI550X_DISABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_CGSL"); exit(1); } else printf("ADC Internal Software Gate enabled\n"); } /* Set DMA Buffer Size */ rc = ioctl(fd, PCI550X_IOCT_ADC_DMA_BYTES, buf_size); if(rc == -1) { perror("ioctl PCI550X_IOCT_DMA_BYTES"); free(buf); exit(1); } else { printf("DMA Buffer Size: %d bytes\n", buf_size); } /* ADC DMA Enable */ rc = ioctl(fd, PCI550X_IOCT_ADC_DMAEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_DMAEN"); free(buf); exit(1); } else { printf("DMA enabled\n"); } /* ADC gate enable */ if (g | G | t | T) { rc = ioctl(fd, PCI550X_IOCT_ADC_TGEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_TGEN"); exit(1); } else { printf("ADC external gate enabled\n"); } } else { rc = ioctl(fd, PCI550X_IOCT_ADC_CGEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_CGEN"); exit(1); } else { printf("ADC Pacer Clock gated on\n"); } } /* ADC Convert Enable */ rc = ioctl(fd, PCI550X_IOCT_ADC_CVEN, PCI550X_ENABLE); if(rc == -1) { perror("ioctl PCI550X_IOCT_ADC_CVEN"); free(buf); exit(1); } else { printf("ADC Conversions enabled\n"); } /* install the signal handler */ signal(SIGINT, &sighandler); /* blocking read */ while (1) { bytes = read(fd, (void *)buf, buf_size); if (bytes == 0) { printf("ADC EOF\n"); free(buf); exit(0); } else if (bytes == -1) { perror("pci550x read"); rc = ioctl(fd, PCI550X_IOCQ_ADC_STATUS); if (rc == -1) { perror("ioctl PCI550X_IOCQ_ADC_STATUS"); free(buf); exit(1); } else { printf("ADC status 0x%x:", rc); if (rc & AD_STATUS_MERR1) printf("merr1\n"); else if (rc & AD_STATUS_MERR0) printf("merr0\n"); else if (rc & AD_STATUS_FOVR) printf("fifo overflow\n"); else if (rc & AD_STATUS_FUNDR) printf("fifo underflow\n"); else if (rc & AD_STATUS_CERR) printf("clocking error\n"); else if (rc & AD_STATUS_BERR) printf("burst error\n"); else if (rc & AD_STATUS_CCTC) printf("About Trigger: %d\n", ccount); else printf("ADC DMA process error\n"); } free(buf); exit(1); } /* brief display */ if (brief) { if (packed && bipolar) printf("%c:%s:%s ADC reads %d bytes, " "(P,B) %d sample values\n", sentinal[mm++], device, brd_names[brd_type], buf_size, buf_size >> 1); else if (packed & (!bipolar) ) printf("%c:%s:%s ADC reads %d bytes, " "(P,U) %d sample values\n", sentinal[mm++], device, brd_names[brd_type], buf_size, buf_size >> 1); else if (bipolar) printf("%c:%s:%s ADC reads %d bytes, " "(U,B) %d sample values\n", sentinal[mm++], device, brd_names[brd_type], buf_size, buf_size >> 2); else printf("%c:%s:%s ADC reads %d bytes, " "(U,U) %d sample values\n", sentinal[mm++], device, brd_names[brd_type], buf_size, buf_size >> 2); mm %= sizeof(sentinal); } else { for (i = j = 0; i < samples; i++, j+=2, j %= samples) { dma.raw_data = buf[i]; if (packed && bipolar) printf("%s:%s ADC Channel 0x%04hx " "(P,B):" "0x%04hx; %f Volts\n" "%s:%s ADC Channel 0x%04hx " "(P,B):" "0x%04hx; %f Volts\n", device, brd_names[brd_type], dl_ccram.ccram[j], dma.data_bp[0], dma.data_bp[0] * art[brd_type].bp_res[gain], device, brd_names[brd_type], dl_ccram.ccram[(j+1) % samples], dma.data_bp[1], dma.data_bp[1] * art[brd_type].bp_res[gain]); else if (packed && (!bipolar)) printf("%s:%s ADC Channel 0x%04hx " "(P,U):" "0x%04hx; %f Volts\n" "%s:%s ADC Channel 0x%04hx " "(P,U):" "0x%04hx; %f Volts\n", device, brd_names[brd_type], dl_ccram.ccram[i], dma.data_up[0], dma.data_up[0] * art[brd_type].up_res[gain], device, brd_names[brd_type], dl_ccram.ccram[(i+1) % samples], dma.data_up[1], dma.data_up[1] * art[brd_type].up_res[gain]); else if (bipolar) printf("%s:%s ADC Channel 0x%04hx " "(U,B):" "0x%04hx; " " %f Volts\n", device, brd_names[brd_type], dma.data_bp[1], dma.data_bp[0], dma.data_bp[0] * art[brd_type].bp_res[gain]); else printf("%s:%s ADC Channel 0x%04hx " " (U,U):" "0x%04hx; " "%f Volts\n", device, brd_names[brd_type], dma.data_up[1], dma.data_up[0], dma.data_up[0] * art[brd_type].up_res[gain]); } } } close(fd); return(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -