Difference between revisions of "CAEN V1495 IO"

From New IAC Wiki
Jump to navigation Jump to search
Line 228: Line 228:
  
  
 +
The Makefile
 +
 +
<pre>
 +
CCPPC=ccppc
 +
INCLUDES=-fno-builtin -fno-for-scope -fstrength-reduce -mlongcall -mcpu=604 -DCP
 +
U=PPC604 -DVXWORKS -D_GNU_TOOL -DVXWORKSPPC -I/usr/local/coda/2.5/common/include
 +
/ -I../h -c
 +
all:
 +
        $(CCPPC) $(INCLUDES) -o minits.o minits.c
 +
</pre>
  
  

Revision as of 23:21, 20 May 2013

Manual

Media:CAEN_V1495_Manual_Rev6.pdf

Readout code

V1

The ZIP file below contains the HDL source code to download into the V1495

http://www.physics.isu.edu/~tforest/DAQ/GEMReadout_V1495Source_Rev1_0.zip

The ZIP file below contains the ROC library

http://www.physics.isu.edu/~tforest/DAQ/GEMReadout_VxWorkxSource_11_26_2008.zip


ROC lib

compile library

To compile the ROC library I executed the following command within the subdirectory containing the v1495.c file

ccppc  -fno-builtin -fno-for-scope -fstrength-reduce -mlongcall -mcpu=604 -DCPU=PPC604 -DVXWORKS -D_GNU_TOOL -DVXWORKSPPC -I/usr/local/coda/2.5/common/include/ -I../h -c -o v1495Lib.o -i v1495.c


load library onto the ROC

I then copies the library v1495Lib.o into my ROC library subdirectory which is where the ROC is pooing at boot up

/home/daq/CODA/ROClibs/libs

I loaded the library by hand by typing the following at the ROC console

-> ld < v1495Lib.o
value = 268430512 = 0xfffecb0

Setting address

The address pins on this module are not labeled so I adopted the convention of numbering them from left to right as I look from the front pannel.

400 px

Address
Pin Setting
SW 3 0
SW 4 8
SW 7 1
SW 8 1


probing memory

I set the switches as follows


   sw3  sw4  sw7  sw8
    0    8    1    1


And the following is a printout of my board:
(0x80118000 - A32    0x90118000 - A24)


-> m 0x80118000
80118000:  0000-
80118002:  0000-
80118004:  0000-
80118006:  00dd-
80118008:  001f-
8011800a:  ffff-
8011800c:  0002-
8011800e:  0001-
80118010:  00ff-
80118012:  0001-
80118014:  00ff-
80118016:  0001-
80118018:  0000-
8011801a:  ffff-.

value = 1 = 0x1
-> m 0x90118000
90118000:  0000-
90118002:  0000-
90118004:  0000-
90118006:  00dd-
90118008:  001f-
9011800a:  ffff-
9011800c:  0002-
9011800e:  0001-
90118010:  00ff-
90118012:  0001-
90118014:  00ff-
90118016:  0001-
90118018:  0000-
9011801a:  ffff-.

value = 1 = 0x1
->

v1495test function

The v1495 library has the function below which when

//v1495test()                                                                                                                     
int
v1495test(unsigned int baseaddr)
{
  // the address location below starts at the USER FPGA access location which is                                                  
  //0x8000 lower in memory than the dial switches for the module address location.                                                

  // if SW3=0 SW4=8 SW7=1 SW8=1 => 0x80118000 is the 32 bit address and 0x90118000 is the 24 bit adresss                          

  // then try v1495test(0x80110000)                                                                                               
  volatile V1495 *v1495 = (V1495 *) baseaddr;
  unsigned short *data16 = (unsigned short *)&(v1495->control);

  printf("Control      [0x%08x] = 0x%04x\n",&(v1495->control),v1495->control);
  printf("firmwareRev  [0x%08x] = 0x%04x\n",&(v1495->firmwareRev),v1495->firmwareRev);
  printf("selflashVME  [0x%08x] = 0x%04x\n",&(v1495->selflashVME),v1495->selflashVME);
  printf("flashVME     [0x%08x] = 0x%04x\n",&(v1495->flashVME),v1495->flashVME);
  printf("selflashUSER [0x%08x] = 0x%04x\n",&(v1495->selflashUSER),v1495->selflashUSER);
  printf("flashUSER    [0x%08x] = 0x%04x\n",&(v1495->flashUSER),v1495->flashUSER);
  printf("configROM    [0x%08x] = 0x%04x\n",&(v1495->configROM[0]),v1495->configROM[0]);

  return(0);
}

example

-> v1495test(0x80110000);                                                       
Control      [0x80118000] = 0x0000                                              
firmwareRev  [0x8011800c] = 0x0003                                              
selflashVME  [0x8011800e] = 0x0001                                              
flashVME     [0x80118010] = 0x00ff                                              
selflashUSER [0x80118012] = 0x0001                                              
flashUSER    [0x80118014] = 0x00ff                                              
configROM    [0x80118100] = 0x0065                                              
value = 0 = 0x0                                                                 

Download Firmware

To download the firmware to the USER FPGA area you need to pass the address which is 0x8000 below what the dial setting are

for example the dial settings are

Address
Pin Setting
SW 3 0
SW 4 8
SW 7 1
SW 8 1

Instead of the address of the control register (which corresponds to the dial settings) You need to pass the memory address of the USER FPGA access which is 0x8000 lower in memory

for example

v1495firmware(0x80110000,"GEMReadout.rbf",0,0)

and NOT v1495firmware(0x80118000,"GEMReadout.rbf",0,0)


it took about 10 minutes to download


-> v1495firmware(0x80110000,"GEMReadout.rbf",0,0);                              
                                                                                
********************************************************                        
* CAEN SpA - Front-End Division                        *                        
* ---------------------------------------------------- *                        
* Firmware Upgrade of the V1495                        *                        
* Version 1.1 (27/07/06)                               *                        
*   Sergey Boyarinov: CLAS version 23-Apr-2007         *                        
********************************************************                        
                                                                                
Updating firmware of the FPGA USER with the file GEMReadout.rbf                 
End of file: bp=33 bcnt=177705                                                  
                                                                                
Firmware loaded successfully. Written 177705 bytes                              
                                                                                
Reloading user FPGA firmware...done!                                            

Using as a Trigger Supervisor

Subdirectories

in /home/daq/CODA/ROClibs/MiniTS

minits.c

in /home/daq/CODA/ROClibs/libs

V1495MiniTS.rbf V1495VME_rev_1.1.rbf

Load firmware

From the VXworks prompt load the firmware with the commands

v1495firmware(0xfa510000,"V1495MiniTS.rbf",0,0)

v1495firmware(0xfa510000,"V1495VME_rev_1.1.rbf",0,1)


Compile the MiniTS library

The Makefile

CCPPC=ccppc
INCLUDES=-fno-builtin -fno-for-scope -fstrength-reduce -mlongcall -mcpu=604 -DCP
U=PPC604 -DVXWORKS -D_GNU_TOOL -DVXWORKSPPC -I/usr/local/coda/2.5/common/include
/ -I../h -c
all:
        $(CCPPC) $(INCLUDES) -o minits.o minits.c


Makefile

 VxWorks makefile for minits.c (run 'make minits.o' to build...you may have to modify the makefile for the machine your building this on)

minits.c

 Example usage for VxWorks using interrupts.
 Alternatively you can run this in polling mode by:
    1) calling MiniTSPollTrig() repeatedly to see if a trigger has been generated
    2) when MiniTSPollTrig() = 1 readout your DAQ modules, then call MiniTSAck() to acknowledge trigger so another can be generated

V1495MiniTS.rbf

 This is the USER FPGA code I put together for you. Be sure to load this to the USER space and not the VME one!

V1495VME_rev_1.1.rbf

 This is the VME FPGA code from CAEN (32bit mode with interrupt support). Be sure to load this to the VME space.


After you load the "V1495VME_rev_1.1.rbf" VME FPGA and "V1495MiniTS.rbf" USER FPGA reboot your crate and check the following: 1) v1495 offset 0x800C contains the firmware revision of the VME FPGA and should be 1.1. You must do a 16bit read to check this. (if not make sure your STD/BKP jumper on the V1495 is set to the position you loaded the VME FPGA firmware to)

2) run 'MiniTS_Init <a24_addr>', where <a24_addr> should be the hexadecimal A24 address of your board. This function will verify that the USER FPGA is loaded.

Here's an example of what I get when I run this:

Command: -> MiniTS_Init 0x530000

Output: MiniTS_Init() started...

 MiniTS A24 VME Address 0x00530000 mapped to CPU Address 0x90530000
 MiniTS Id register = 0x4D495453

disconnecting vector 224 MiniTSId = 0x4D495453 FirmwareRev = 0x00010000 BoardId = 0x00000000 TriggerEn = 0x00000000 IntEn = 0x00000000 TriggerCnt = 0x00000000 TriggerStatus = 0x00000000 MiniTSSetupInt() MiniTSEnableTrig() Ready... TS_Interrupt received (1)... TS_Interrupt received (2)... TS_Interrupt received (3)... TS_Interrupt received (4)...



VME_modules Go back