Subversion Repositories f9daq

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
62 f9daq 1
 
2
#include <stdio.h>
3
#include "VmUsbStack_cvi.h"
4
 
5
#define MAXSTACKSIZE 1000
6
long fStack[MAXSTACKSIZE];
7
 
8
 
9
void VmUsbStackInit(){
10
        fStack[0]=1;
11
        fStack[1]=0;
12
}
13
 
14
void VmUsbStackClear(){
15
        VmUsbStackInit();
16
}
17
 
18
int VmUsbStackGet(int maxn, int *stack){
19
  int i;
20
  for (i=0;i< fStack[0]+1;i++){
21
                        if (i<maxn) stack[i]=fStack[i]; else return -1;
22
  }
23
  return fStack[0];
24
}
25
 
26
 
27
void VmUsbStackAppend(int cmd, int addr ){
28
  int i= fStack[0]+1;
29
  fStack[i]   = (cmd & 0xFFFF);
30
  fStack[i+1] = (cmd >> 16);
31
  fStack[i+2] = addr&0xFFFF;
32
  fStack[i+3] = (addr >> 16)& 0xFFFF;
33
  fStack[0]+=4;
34
}
35
 
36
void VmUsbStackAppendData(int cmd, int addr , int data){
37
  int i=0;
38
  VmUsbStackAppend( cmd, addr );
39
  i = fStack[0]+1;
40
  fStack[i]  =  data & 0xFFFF;
41
  fStack[i+1] = (data >> 16)&0xFFFF;
42
  fStack[0]+=2;
43
}
44
 
45
void VmUsbStackConditionalRead(int adr_mod,int d16d32, int addr, int bmask){
46
        VmUsbStackAppend(CMD_READ| CMD_HD | adr_mod ,addr);
47
        VmUsbStackAppendData(CMD_READ| CMD_HD | CMD_HM |adr_mod, d16d32 |addr,bmask);
48
}
49
 
50
void VmUsbStackMultiRead(int adr_mod,int d16d32, int baseaddr, int n, int increment){
51
        int i;
52
        for (i=0;i<n;i++) VmUsbStackAppend( adr_mod | CMD_READ, d16d32 +baseaddr + i*increment);
53
}
54
void VmUsbStackMultiWrite(int adr_mod,int d16d32,int baseaddr, int n, int increment, int data){
55
        int i;
56
        for (i=0;i<n;i++)  VmUsbStackAppendData( adr_mod | CMD_WRITE,d16d32 + baseaddr+i*increment, data);
57
}
58
 
59
void VmUsbStackPrint(){
60
   int i;
61
   for (i=0; i < fStack[0]+1;i++) printf("0x%04x\n",fStack[i]);
62
   printf("size of stack %d __________________________________\n",fStack[0]+1);
63
}
64
 
65
#ifdef MAIN
66
#include "CAENV965_DEF.h"
67
#include <utility.h> 
68
#define CAEN_V965    0x340000
69
 
70
int main(){
71
 
72
int st[1000];
73
int nb, i;
74
// INIT stackdata
75
int geo=1,fPedestal=255;
76
VmUsbStackInit();
77
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_CRN, 0x0);
78
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_GEO, geo);
79
VmUsbStackMultiWrite( CMD_A24, CMD_D32, CAEN_V965 + CAENV965_THM, 32, 0x02,0x0); // threshold/kill for 32 channels, 2*i addr increment
80
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_BS1, 0x80 ); // soft reset
81
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_BC1, 0x80 ); // soft reset
82
VmUsbStackWriteA24D32( CAEN_V965 + CAENV965_PED, fPedestal ); // pedestal
83
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x5000);
84
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x4);  // clear module
85
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BC2,0x4);
86
VmUsbStackPrint();
87
 
88
// READOUT stackdata
89
VmUsbStackInit();
90
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BS2,0x4);  // clear module
91
VmUsbStackWriteA24D32(CAEN_V965 + CAENV965_BC2,0x4);  
92
VmUsbStackConditionalRead(CMD_A24, CMD_D32,CAEN_V965 + CAENV965_SR1,0x1);        // TRG wait : loop until bit 0 is on
93
VmUsbStackConditionalRead(CMD_A24, CMD_D32,CAEN_V965 + CAENV965_OB ,0x4000000) ; // loop until bit 26 is on, read data 
94
VmUsbStackMarker(0xFAFB);
95
VmUsbStackPrint();
96
 
97
 
98
 nb= VmUsbStackGet(1000,st);
99
 for (i=0;i<nb;i++) if (st[i]!=fStack[i]) printf("error i=%d 0x%04x 0x%04x \n",i,st[i],fStack[i] );
100
Delay(10);
101
 return 0;
102
}
103
#endif