void CaenVmeRead(int32_t BHandle, man_par_t *man) { uint32_t i,old_data=0 ; CVErrorCodes ret,old_ret=cvSuccess; if(man->dtsize == cvD64) { con_printf(" Can't execute a D64 Read Cycle"); return ; } if(man->ncyc == 0) // Infinite Loop con_printf_xy(X_COMM,Y_COMM+2," Running ... Press any key to stop."); for (i=0; ((man->ncyc==0) || (i<man->ncyc)) && !con_kbhit(); i++) { ret = CAENVME_ReadCycle(BHandle,man->addr,&man->data,man->am,man->dtsize); if((i==0) || (ret != old_ret)) { gotoxy(X_COMM,Y_COMM) ; switch (ret) { case cvSuccess : con_printf(" Cycle(s) completed normally\n"); if((i==0) || (old_data != man->data)) { if( man->dtsize == cvD32 ) con_printf(" Data Read : %08X",man->data); if( man->dtsize == cvD16 ) con_printf(" Data Read : %04X",man->data & 0xffff); if( man->dtsize == cvD8 ) con_printf(" Data Read : %02X",man->data & 0xff); } break ; case cvBusError : con_printf(" Bus Error !!!"); break ; case cvCommError : con_printf(" Communication Error !!!"); break ; default : con_printf(" Unknown Error !!!"); break ; } } old_data = man->data; old_ret = ret; if(man->autoinc) { man->addr += man->dtsize; // Increment address (+1 or +2 or +4) con_printf_xy(X_ADDR,Y_ADDR,"%08X]",man->addr); // Update the screen } } if(man->ncyc == 0) clear_line(Y_COMM+2); }
// Read T5 Register @ BA + 0x16 (T5 = Clock to Convert Delay) // t5 = 40 + T5*20 ns , 2<=T5<=511 CVErrorCodes V551_Sequencer::ReadT5Register (unsigned int &T5) { uint16_t pattern = 0; CVErrorCodes droopy = CAENVME_ReadCycle (controllerHandle, baseAddress + 0x16, &pattern, cvA32_U_DATA, cvD16); if (droopy != cvSuccess) return droopy; T5 = pattern & 0x1FF; return droopy; }
// Read Number of channels @ BA + 0xC CVErrorCodes V551_Sequencer::ReadNumberOfChannels (unsigned int &numberOfChannels) { uint16_t pattern = 0; CVErrorCodes droopy = CAENVME_ReadCycle (controllerHandle, baseAddress + 0xC, &pattern, cvA32_U_DATA, cvD16); if (droopy != cvSuccess) return droopy; numberOfChannels = pattern & 0x7FF; //0x7FF = (dec) 2047 = (bin) 11111111111 return droopy; }
// Read T2 Register @ BA + 0x10 (T2 = Hold to Sequence Delay) // t2 = 130 + T2*20 (+/-) 10 ns , 10<=T2<=511 CVErrorCodes V551_Sequencer::ReadT2Register (unsigned int &T2) { uint16_t pattern = 0; CVErrorCodes droopy = CAENVME_ReadCycle (controllerHandle, baseAddress + 0x10, &pattern, cvA32_U_DATA, cvD16); if (droopy != cvSuccess) return droopy; T2 = pattern & 0x1FF; // 0x1FF = (dec) 511 = (bin) 111111111 return droopy; }
CAENVME_API parse_and_call_CAENVME_ReadCycle( char* arguments ){ // parse string, call CAENVMElib function CAENVME_API caen_api_return_value; uint32_t address; // uint16_t value; char bytes_to_read[2]; // 16 bits // printf("Got arguments:\n%s\n", arguments); sscanf (arguments, "%x", &address); printf("Reading address: %x\n", address); caen_api_return_value = CAENVME_ReadCycle( bridge_handler, address, bytes_to_read, cvA32_U_DATA, cvD16 ); printf("Read value: %02x%02x\n", bytes_to_read[1], bytes_to_read[0]); return caen_api_return_value; }
// Read Test Register @ BA+0xA CVErrorCodes V551_Sequencer::ReadTestRegister (bool & testMode, bool & clockLevel, bool & shiftInLevel, bool & testPulseLevel) { uint16_t pattern = 0; CVErrorCodes droopy = CAENVME_ReadCycle (controllerHandle, baseAddress + 0xA, &pattern, cvA32_U_DATA, cvD16); if (droopy != cvSuccess) return droopy; testMode = pattern & 0x1; clockLevel = pattern & 0x2; shiftInLevel = pattern & 0x4; testPulseLevel = pattern & 0x8; return droopy; }
// Read Status Register @ BA+0x8 CVErrorCodes V551_Sequencer::ReadStatusRegister (bool & internalDelay, bool & veto, bool & autoTrigger, bool & dataReady, bool & busy, bool & activeSequence) { uint16_t pattern = 0; //initialize 16bit pattern by filling it with zeros and get the pattern from... CVErrorCodes droopy = CAENVME_ReadCycle (controllerHandle, baseAddress + 0x8, &pattern, cvA32_U_DATA, cvD16); if (droopy != cvSuccess) return droopy; //Now check with bitwise "AND" if each bit is set: internalDelay = pattern & 0x1; //checks LSB veto = pattern & 0x2; autoTrigger = pattern & 0x4; dataReady = pattern & 0x8; busy = pattern & 0x10; activeSequence = pattern & 0x20; return droopy; }
int CAEN_V814::Init() { int status=0; ostringstream s; s << "[CAEN_V814]::[INFO]::++++++ CAEN V814 INIT ++++++"; Log(s.str(),1); if (handle_<0) return ERR_CONF_NOT_FOUND; if (!IsConfigured()) return ERR_CONF_NOT_FOUND; //Read Version to check connection WORD data=0; status |= CAENVME_ReadCycle(handle_,configuration_.baseAddress+CAEN_V814_VERSION_ADD,&data,CAEN_V814_ADDRESSMODE,CAEN_V814_DATAWIDTH); if (status) { s.str(""); s << "[CAEN_V814]::[ERROR]::Cannot open V814 board @0x" << std::hex << configuration_.baseAddress << std::dec << " " << status; Log(s.str(),1); return ERR_OPEN; } int version = (data&0xF000)>>12; int serial = (data&0x0FFF); s.str(""); s << "[CAEN_V814]::[INFO]::Open V814 board @0x" << std::hex << configuration_.baseAddress << std::dec << " Version " << version << " S/N " << serial; Log(s.str(),1); status |= SetPatternInhibit(); #ifdef CAEN_V814_VERBOSE s.str(""); s << "[CAEN_V814]::[INFO]::Pattern Mask has been set to " << configuration_.patternMask; Log(s.str(),1); #endif status |= SetThreshold(-1); #ifdef CAEN_V814_VERBOSE s.str(""); s << "[CAEN_V814]::[INFO]::All Thresholds have been set"; Log(s.str(),1); #endif for (unsigned i=0;i<CAEN_V814_CHANNELS;++i) if (configuration_.chThreshold[i]>0) { status |= SetThreshold(i); #ifdef CAEN_V814_VERBOSE s.str(""); s << "[CAEN_V814]::[INFO]::Set specific threshold for Ch" <<i << " to 0x" << configuration_.chThreshold[i]; Log(s.str(),1); #endif } status|=SetMajorityThreshold(); // single 0x6 double 0x13 triple 0x1F #ifdef CAEN_V814_VERBOSE s.str(""); s << "[CAEN_V814]::[INFO]::Majority Threshold has been set to 0x" << configuration_.majorityThreshold; Log(s.str(),1); #endif status|=SetOutputWidth(); #ifdef CAEN_V814_VERBOSE s.str(""); s << "[CAEN_V814]::[INFO]::Output Width has been set to 0x" << configuration_.outputWidth; Log(s.str(),1); #endif if (status) { s.str(""); s << "[CAEN_V814]::[ERROR]::Cannot config V814 @0x" << std::hex << configuration_.baseAddress << std::dec; Log(s.str(),1); return ERR_OPEN; } s.str(""); s << "[CAEN_V814]::[INFO]::++++++ CAEN V814 CONFIGURED ++++++"; Log(s.str(),1); return 0; }
int bs_read(void) { int data; CAENVME_ReadCycle(BHandle, BASEADDR + 0x108, &data, cvA32_U_DATA, cvD16); return(data); }
// Read Version and Serial number of Module @ BA + FE CVErrorCodes V551_Sequencer::ReadModuleVersionSerial (uint16_t & moduleVersionSerial) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFE, &moduleVersionSerial, cvA32_U_DATA, cvD16); }
// Read Manufacturer's Specs of Module @ BA + FC CVErrorCodes V551_Sequencer::ReadModuleManufacturerSpecs (uint16_t & moduleManufacturerSpecs) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFC, &moduleManufacturerSpecs, cvA32_U_DATA, cvD16); }
// Read Fixed Code of Module @ BA + 0xFA CVErrorCodes V551_Sequencer::ReadModuleFixedCode (uint16_t & moduleFixedCode) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFA, &moduleFixedCode, cvA32_U_DATA, cvD16); }
CVErrorCodes read_from_v6521m(uint32_t vme_addr){ CVDataWidth data_size = cvD16; CVAddressModifier addr_mode = cvA32_U_DATA; vme_addr = vme_addr + V6521M_BASE_ADDRESS; return CAENVME_ReadCycle(handle, vme_addr, &hv_data, addr_mode, data_size); }
// Read Version and Serial number of Module @ BA + FE CVErrorCodes V462_GateGenerator::ReadModuleVersionSerial (uint16_t &moduleVersionSerial) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFE, &moduleVersionSerial, cvA24_U_DATA, cvD16); }
// Read Manufacturer's Specs of Module @ BA + FC CVErrorCodes V462_GateGenerator::ReadModuleManufacturerSpecs (uint16_t &moduleManufacturerSpecs) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFC, &moduleManufacturerSpecs, cvA24_U_DATA, cvD16); }
// Read Fixed Code of Module @ BA + 0xFA CVErrorCodes V462_GateGenerator::ReadModuleFixedCode (uint16_t &moduleFixedCode) { return CAENVME_ReadCycle (controllerHandle, baseAddress + 0xFA, &moduleFixedCode, cvA24_U_DATA, cvD16); }