diff --git a/Software/ADC/m4iset_extrig_rms.c b/Software/ADC/m4iset_extrig_rms.c new file mode 100644 index 0000000000000000000000000000000000000000..93559b0c097f028b61fb0c99027ee7f8b9e93bb0 --- /dev/null +++ b/Software/ADC/m4iset_extrig_rms.c @@ -0,0 +1,76 @@ +#include "../../c_header/dlltyp.h" +#include "../../c_header/regs.h" +#include "../../c_header/spcm_drv.h" +#include "../../c_header/spcerr.h" + +#include <stdio.h> + + +void m4iset_(int16 *pvData, int32 *lMemsize, int32 *posttr) + { + drv_handle hDrv; + char szErrorText[ERRORTEXTLEN]; + int32 lCardType; + int32 allchan; + int32 ausgabe; + + hDrv = spcm_hOpen ("/dev/spcm0"); + if (!hDrv) + { + printf("Error M4i-driver\n"); + spcm_vClose (hDrv); + } + + + spcm_dwGetParam_i32 (hDrv, SPC_PCITYP, &lCardType); + + spcm_dwSetParam_i32 (hDrv, SPC_CHENABLE, CHANNEL0); //Enable the channels that is going to be used. Channels can be added such as CHANNEL0 | CHANNEL1 etc. + + //ADC Specific Settings. Perform this for every channel that is used + spcm_dwSetParam_i32 (hDrv, SPC_PATH0, 0); + spcm_dwSetParam_i32 (hDrv, SPC_AMP0, 500); // ADC dynamic range is adjusted to 500mV. Max is 1000 + spcm_dwSetParam_i32 (hDrv, SPC_50OHM0, 1); + spcm_dwSetParam_i32 (hDrv, SPC_ACDC0, 0); + spcm_dwSetParam_i32 (hDrv, SPC_FILTER0, 1); + + + spcm_dwSetParam_i32 (hDrv, SPC_CARDMODE, SPC_REC_STD_SINGLE); //One time acquisition + spcm_dwSetParam_i32 (hDrv, SPC_MEMSIZE, *lMemsize); //Memory settings + spcm_dwSetParam_i32 (hDrv, SPC_POSTTRIGGER, *posttr); //See documentation for post trigger settings + + spcm_dwSetParam_i32 (hDrv, SPC_CLOCKMODE, SPC_CM_INTPLL); + spcm_dwSetParam_i32 (hDrv, SPC_SAMPLERATE, 500000000); //ADC sampling rate is adjusted to 500 MHz + spcm_dwSetParam_i32 (hDrv, SPC_CLOCKOUT, 1); + + // Device accpets tirgger from EXT1 input. Please see documentation for more details. + spcm_dwSetParam_i32 (hDrv, SPC_TRIG_ORMASK, SPC_TMASK_EXT1); + spcm_dwSetParam_i32 (hDrv, SPC_TRIG_EXT1_LEVEL0, 1000); + spcm_dwSetParam_i32 (hDrv, SPC_TRIG_EXT1_MODE, SPC_TM_POS); + + //Transfer the settings to the card + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_WRITESETUP); + + //Start cards and wait for the trigger + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_START | M2CMD_CARD_ENABLETRIGGER); + //There is a 10 second timeout. If no trigger is detected card will start automatically + spcm_dwSetParam_i32 (hDrv, SPC_TIMEOUT, 10000); + + if (spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_WAITTRIGGER) == ERR_TIMEOUT) + { + printf ("trigger forced !\n"); + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_FORCETRIGGER); + } + spcm_dwSetParam_i32 (hDrv, SPC_TIMEOUT, 0); + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_WAITREADY); + //Wait for the card to complete its operation. Then, Transfer the data to the PC + + spcm_dwDefTransfer_i64 (hDrv, SPCM_BUF_DATA, SPCM_DIR_CARDTOPC, 0, pvData, 0, 2* *lMemsize); + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA); + //Transfer is finished! Close the cards and release the driver + if (spcm_dwGetErrorInfo_i32(hDrv,NULL,NULL,szErrorText) != ERR_OK) + {printf(szErrorText); + spcm_vClose (hDrv); + } + spcm_vClose (hDrv); + } +