diff --git a/Console/Transmitter/m4iset_8ch.c b/Console/Transmitter/m4iset_8ch.c index 320ba882ca1d2e258c77b161fc93de43cce0c3a4..c2bbe38c93bc1e31529cd5f5af05624fd5b5ce2b 100644 --- a/Console/Transmitter/m4iset_8ch.c +++ b/Console/Transmitter/m4iset_8ch.c @@ -8,20 +8,16 @@ void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize) { - - drv_handle hDrv; - drv_handle hDrv1; - drv_handle hSync; + drv_handle hDrv; //The instance of the first card + drv_handle hDrv1; //The instance of the second card + drv_handle hSync; //The instance of the star-hub char szErrorText[ERRORTEXTLEN]; int32 lCardType; int32 allchan; int32 ausgabe; int64 lSamplerate; - uint32 dwXMode; -// hDrv = spcm_hOpen ("/dev/spcm0"); -// hDrv1 = spcm_hOpen ("/dev/spcm1"); hDrv = spcm_hOpen ("/dev/spcm1"); hDrv1 = spcm_hOpen ("/dev/spcm2"); @@ -47,11 +43,11 @@ void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize) spcm_dwSetParam_i32 (hDrv1, SPC_CLOCKMODE, SPC_CM_INTPLL); -// spcm_dwSetParam_i64 (hDrv1, SPC_SAMPLERATE,625000000); +// spcm_dwSetParam_i64 (hDrv1, SPC_SAMPLERATE,625000000); // The sampling rate can be changed to 625 MHz. //Please see the paper why 400 MHz is used. spcm_dwSetParam_i64 (hDrv1, SPC_SAMPLERATE,400000000); spcm_dwSetParam_i32 (hDrv1, SPC_CLOCKOUT, 1); // enable clock output -// spcm_dwSetParam_i32 (hDrv, SPC_CLOCKMODE, SPC_CM_INTPLL); + // spcm_dwSetParam_i64 (hDrv, SPC_SAMPLERATE,625000000); spcm_dwSetParam_i64 (hDrv, SPC_SAMPLERATE,400000000); // spcm_dwSetParam_i32 (hDrv, SPC_CLOCKOUT, 1); // enable clock output @@ -60,44 +56,15 @@ void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize) spcm_dwSetParam_i32 (hDrv, SPCM_X2_MODE, SPCM_XMODE_TRIGOUT); spcm_dwSetParam_i32 (hDrv1, SPCM_X2_MODE, SPCM_XMODE_TRIGOUT); - - -// spcm_dwSetParam_i32 (hDrv1, SPCM_X2_MODE, SPCM_XMODE_CONTOUTMARK); - - -// spcm_dwGetParam_i32 (hDrv1, SPCM_X1_AVAILMODES, &ausgabe); -// printf ("available modes = %d\n", ausgabe); - spcm_dwGetParam_i64 (hDrv1, SPC_SAMPLERATE, &lSamplerate); printf ("Sample rate = %d\n", lSamplerate); -// printf ("first sample = %d\n", pvData[0]); -// printf ("first sample = %d\n", pvData1[0]); - - -// dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH1 | SPCM_XMODE_DIGOUTSRC_BIT15); -// spcm_dwSetParam_i32 (hDrv1, SPCM_X1_MODE, dwXMode); -// spcm_dwGetParam_i32 (hDrv1, SPCM_X1_MODE, &ausgabe); -// printf ("actual X0 mode = %d\n", ausgabe); - - - - - spcm_dwSetParam_i32 (hDrv, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3); - - -// dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH0 | SPCM_XMODE_DIGOUTSRC_BIT15); -// spcm_dwSetParam_i32 (hDrv, SPCM_X0_MODE, dwXMode); -// spcm_dwGetParam_i32 (hDrv, SPCM_X0_MODE, &ausgabe); -// printf ("actual X0 mode = %d\n", ausgabe); - - - + spcm_dwSetParam_i32 (hDrv, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3); //Enable all channels spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT0, 1); - spcm_dwSetParam_i32 (hDrv, SPC_AMP0, 1000); - spcm_dwSetParam_i32 (hDrv, SPC_FILTER0, 0); + spcm_dwSetParam_i32 (hDrv, SPC_AMP0, 1000); //Full dynamic range of amplitude + spcm_dwSetParam_i32 (hDrv, SPC_FILTER0, 0); //No filter is used spcm_dwSetParam_i32 (hDrv, SPC_ENABLEOUT1, 1); spcm_dwSetParam_i32 (hDrv, SPC_AMP1, 1000); @@ -111,19 +78,7 @@ void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize) spcm_dwSetParam_i32 (hDrv, SPC_AMP3, 1000); spcm_dwSetParam_i32 (hDrv, SPC_FILTER3, 0); - - - - spcm_dwSetParam_i32 (hDrv1, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3); - - -// dwXMode = (SPCM_XMODE_DIGOUT | SPCM_XMODE_DIGOUTSRC_CH0 | SPCM_XMODE_DIGOUTSRC_BIT15); -// spcm_dwSetParam_i32 (hDrv1, SPCM_X0_MODE, dwXMode); -// spcm_dwGetParam_i32 (hDrv1, SPCM_X0_MODE, &ausgabe); -// printf ("actual X0 mode = %d\n", ausgabe); - - - + spcm_dwSetParam_i32 (hDrv1, SPC_CHENABLE, CHANNEL0|CHANNEL1|CHANNEL2|CHANNEL3); //Enable channels for the other card spcm_dwSetParam_i32 (hDrv1, SPC_ENABLEOUT0, 1); spcm_dwSetParam_i32 (hDrv1, SPC_AMP0, 1000); @@ -141,54 +96,27 @@ void m4iset_(int16 *pvData, int16 *pvData1, int32 *lMemsize) spcm_dwSetParam_i32 (hDrv1, SPC_AMP3, 1000); spcm_dwSetParam_i32 (hDrv1, SPC_FILTER3, 0); - - - - - - -// spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_CARD_WRITESETUP); -// spcm_dwSetParam_i32 (hDrv1, SPC_M2CMD, M2CMD_CARD_WRITESETUP); - - - - -// spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 0); -// spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 1); -// spcm_dwSetParam_i32 (hDrv, SPCM_XX_ASYNCIO, 0); - - - spcm_dwSetParam_i32 (hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLE); - spcm_dwSetParam_i32 (hDrv, SPC_MEMSIZE, *lMemsize); - spcm_dwSetParam_i32 (hDrv, SPC_LOOPS, 1); //60000 + spcm_dwSetParam_i32 (hDrv, SPC_CARDMODE, SPC_REP_STD_SINGLE); //Single mode is used. Refer to the other modes in manufacturer's documentation (i.e. sequence mode) + spcm_dwSetParam_i32 (hDrv, SPC_MEMSIZE, *lMemsize); // Set the memory block size + spcm_dwSetParam_i32 (hDrv, SPC_LOOPS, 1); // Only a single pulse is transmitted. The number can be increased further - spcm_dwSetParam_i32 (hDrv1, SPC_CARDMODE, SPC_REP_STD_SINGLE); + spcm_dwSetParam_i32 (hDrv1, SPC_CARDMODE, SPC_REP_STD_SINGLE); //Repeat it for the second card spcm_dwSetParam_i32 (hDrv1, SPC_MEMSIZE, *lMemsize); spcm_dwSetParam_i32 (hDrv1, SPC_LOOPS, 1); - - - - spcm_dwDefTransfer_i64 (hDrv, SPCM_BUF_DATA, SPCM_DIR_PCTOCARD, 0, pvData, 0, 8* *lMemsize); + spcm_dwDefTransfer_i64 (hDrv, SPCM_BUF_DATA, SPCM_DIR_PCTOCARD, 0, pvData, 0, 8* *lMemsize); //Here we get the pulse data from the fortran code to write into the device memory. spcm_dwDefTransfer_i64 (hDrv1, SPCM_BUF_DATA, SPCM_DIR_PCTOCARD, 0, pvData1, 0, 8* *lMemsize); + spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA); //Device handles the rest but we need to tell the DMA operation. Please check documentation for the details. + spcm_dwSetParam_i32 (hDrv1, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA); + spcm_dwSetParam_i32 (hSync, SPC_M2CMD, M2CMD_CARD_START | M2CMD_CARD_FORCETRIGGER | M2CMD_CARD_WAITREADY); //The cards start with a software trigger. - - spcm_dwSetParam_i32 (hDrv, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA); - spcm_dwSetParam_i32 (hDrv1, SPC_M2CMD, M2CMD_DATA_STARTDMA | M2CMD_DATA_WAITDMA); - - - spcm_dwSetParam_i32 (hSync, SPC_M2CMD, M2CMD_CARD_START | M2CMD_CARD_FORCETRIGGER | M2CMD_CARD_WAITREADY); - - - - - if (spcm_dwGetErrorInfo_i32(hDrv,NULL,NULL,szErrorText) != ERR_OK) + if (spcm_dwGetErrorInfo_i32(hDrv,NULL,NULL,szErrorText) != ERR_OK) //Check if there is any error issued by the card {printf(szErrorText); spcm_vClose (hDrv); } - - spcm_vClose (hDrv); + //Close the cards + spcm_vClose (hDrv); spcm_vClose (hDrv1); spcm_vClose (hSync);