diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 495c5723a..294268d4a 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -504,7 +504,6 @@ void setupDetector() { LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, DAC_MAX_MV); //has to be before setvchip LTC2620_Disable(); LTC2620_Configure(); - //FIXME: // switch off dacs (power regulators most likely only sets to minimum (if power enable on)) FILE_LOG(logINFOBLUE, ("Powering down all dacs\n")); { @@ -1111,7 +1110,7 @@ int getVchip() { return dacValues[D_PWR_CHIP]; int voltage = -1; // dac to voltage - ConvertToDifferentRange(LTC2620_MIN_VAL, LTC2620_MAX_VAL, VCHIP_MIN_MV, VCHIP_MAX_MV, + ConvertToDifferentRange(LTC2620_MAX_VAL, LTC2620_MIN_VAL, VCHIP_MIN_MV, VCHIP_MAX_MV, dacValues[D_PWR_CHIP], &voltage); return voltage; } @@ -1126,13 +1125,13 @@ void setVchip(int val) { // validate & convert it to dac if (val != LTC2620_PWR_DOWN_VAL) { // convert voltage to dac - if (ConvertToDifferentRange(VCHIP_MIN_MV, VCHIP_MAX_MV, LTC2620_MIN_VAL, LTC2620_MAX_VAL, + if (ConvertToDifferentRange(VCHIP_MIN_MV, VCHIP_MAX_MV, LTC2620_MAX_VAL, LTC2620_MIN_VAL, //min val is max V val, &dacval) == FAIL) { FILE_LOG(logERROR, ("\tVChip %d mV invalid. Is not between %d and %d mV\n", val, VCHIP_MIN_MV, VCHIP_MAX_MV)); return; } } - + FILE_LOG(logINFO, ("Setting Vchip (DAC %d): %d dac (%d mV)\n",D_PWR_CHIP, dacval, val)); // set setDAC(D_PWR_CHIP, dacval, 0); } @@ -1153,18 +1152,15 @@ int getVChipToSet(enum DACINDEX ind, int val) { for (ipwr = 0; ipwr < NPWR -1; ++ipwr) { // get the dac values for each adc - int dacVal = dacValues[getDACIndexFromADCIndex(ipwr)]; + int dacmV = getPower(getDACIndexFromADCIndex(ipwr)); // if current index, replace with value to be set - if (ipwr == adcIndex) - dacVal = val; - - // if power enable off for that adc, dont take the value - if (!(bus_r(POWER_REG) & (1 << (POWER_ENBL_VLTG_RGLTR_OFST + ipwr)))) - dacVal = 0; + if (ipwr == adcIndex) { + dacmV = val; + } // update max - max = (dacVal > max) ? dacVal : max; + max = (dacmV > max) ? dacmV : max; } // increment to get vchip value @@ -1173,6 +1169,11 @@ int getVChipToSet(enum DACINDEX ind, int val) { // validate with vchip minimum value if (max < VCHIP_MIN_MV) max = VCHIP_MIN_MV; + // with correct calulations, vchip val should never be greater than vchipmax + if (max > VCHIP_MAX_MV) { + FILE_LOG(logERROR, ("Vchip value to set %d is beyond its maximum (WEIRD)\n", max)); + return -1; + } return max; } @@ -1213,7 +1214,7 @@ int getADCIndexFromDACIndex(enum DACINDEX ind) { } int isPowerValid(int val) { - if (val < POWER_RGLTR_MIN || val > POWER_RGLTR_MAX) { + if (val != 0 && (val < POWER_RGLTR_MIN || val > POWER_RGLTR_MAX)) { return 0; } return 1; @@ -1257,7 +1258,7 @@ int getPower(enum DACINDEX ind) { // convert dac to voltage int retval = -1; - ConvertToDifferentRange(LTC2620_MIN_VAL, LTC2620_MAX_VAL, POWER_RGLTR_MIN, (getVchip() - VCHIP_POWER_INCRMNT), + ConvertToDifferentRange(LTC2620_MAX_VAL, LTC2620_MIN_VAL, POWER_RGLTR_MIN, POWER_RGLTR_MAX, dacValues[ind], &retval); return retval; } @@ -1285,11 +1286,15 @@ void setPower(enum DACINDEX ind, int val) { // get vchip to set vchip (calculated now before switching off power enable) int vchip = getVChipToSet(ind, val); + // index problem of vchip calculation problem + if (vchip == -1) + return; // Switch off power enable bus_w(addr, bus_r(addr) & ~(mask)); // power down dac + FILE_LOG(logINFO, ("Powering off P%d (DAC %d)\n", adcIndex, ind)); setDAC(ind, LTC2620_PWR_DOWN_VAL, 0); // set vchip @@ -1299,11 +1304,15 @@ void setPower(enum DACINDEX ind, int val) { return; } - // convert it to dac + //(power off is anyway done with power enable) + if (val == 0) + val = LTC2620_PWR_DOWN_VAL; + + // convert it to dac (power off is anyway done with power enable) if (val != LTC2620_PWR_DOWN_VAL) { int dacval = -1; // convert voltage to dac - if (ConvertToDifferentRange(POWER_RGLTR_MIN, vchip - VCHIP_POWER_INCRMNT, LTC2620_MIN_VAL, LTC2620_MAX_VAL, + if (ConvertToDifferentRange(POWER_RGLTR_MIN, POWER_RGLTR_MAX, LTC2620_MAX_VAL, LTC2620_MIN_VAL, val, &dacval) == FAIL) { FILE_LOG(logERROR, ("\tPower index %d of value %d mV invalid. Is not between %d and %d mV\n", ind, val, POWER_RGLTR_MIN, vchip - VCHIP_POWER_INCRMNT)); @@ -1311,6 +1320,7 @@ void setPower(enum DACINDEX ind, int val) { } // set and power on/ update dac + FILE_LOG(logINFO, ("Setting P%d (DAC %d): %d dac (%d mV)\n", adcIndex, ind, dacval, val)); setDAC(ind, dacval, 0); // to be sure of valid conversion diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index a6fe1710f..88393e1a4 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -66,13 +66,13 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, #define DEFAULT_DBIT_CLK (200) #define HIGHVOLTAGE_MIN (60) -#define HIGHVOLTAGE_MAX (200) +#define HIGHVOLTAGE_MAX (200) // min dac val #define DAC_MIN_MV (0) #define DAC_MAX_MV (2500) -#define VCHIP_MAX_MV (2700) #define VCHIP_MIN_MV (1700) -#define POWER_RGLTR_MAX (2500) +#define VCHIP_MAX_MV (2700) // min dac val #define POWER_RGLTR_MIN (600) +#define POWER_RGLTR_MAX (2500) // min dac val #define VCHIP_POWER_INCRMNT (200) /* Defines in the Firmware */ diff --git a/slsDetectorServers/slsDetectorServer/LTC2620.h b/slsDetectorServers/slsDetectorServer/LTC2620.h index 0ce1f26bb..560f6e724 100755 --- a/slsDetectorServers/slsDetectorServer/LTC2620.h +++ b/slsDetectorServers/slsDetectorServer/LTC2620.h @@ -106,11 +106,12 @@ int LTC2620_DacToVoltage(int dacval, int* voltage) { * @param dacaddr dac channel number in chip */ void LTC2620_SetSingle(int cmd, int data, int dacaddr) { - FILE_LOG(logDEBUG1, ("dac addr:%d, dac value:%d, cmd:%d\n", dacaddr, data, cmd)); + FILE_LOG(logDEBUG1, ("(Single) dac addr:%d, dac value:%d, cmd:%d\n", dacaddr, data, cmd)); uint32_t codata = (((data << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK) | ((dacaddr << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) | cmd); + FILE_LOG(logDEBUG1, ("codata: 0x%x\n", codata)); serializeToSPI (LTC2620_Reg, codata, LTC2620_CsMask, LTC2620_NUMBITS, LTC2620_ClkMask, LTC2620_DigMask, LTC2620_DigOffset); @@ -142,13 +143,14 @@ void LTC2620_SetDaisy(int cmd, int data, int dacaddr, int chipIndex) { uint32_t valw = 0; int ichip = 0; - FILE_LOG(logDEBUG1, ("desired chip index:%d, nchip:%d, dac ch:%d, val:%d, cmd:0x%x \n", + FILE_LOG(logDEBUG1, ("(Daisy) desired chip index:%d, nchip:%d, dac ch:%d, val:%d, cmd:0x%x \n", chipIndex, nchip, dacaddr, data, cmd)); // data to be bit banged uint32_t codata = (((data << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK) | ((dacaddr << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) | cmd); + FILE_LOG(logDEBUG1, ("codata: 0x%x\n", codata)); // select all chips (ctb daisy chain; others 1 chip) FILE_LOG(logDEBUG1, ("Selecting LTC2620\n")); @@ -165,8 +167,8 @@ void LTC2620_SetDaisy(int cmd, int data, int dacaddr, int chipIndex) { // send to one chip, nothing to others else { - // send nothing to preceding ichips (daisy chain) (if any chips in front of desired chip) - for (ichip = 0; ichip < chipIndex; ++ichip) { + // send nothing to subsequent ichips (daisy chain) (if any chips after desired chip) + for (ichip = chipIndex + 1; ichip < nchip; ++ichip) { FILE_LOG(logDEBUG1, ("Send nothing to ichip %d\n", ichip)); LTC2620_SendDaisyData(&valw, LTC2620_DAC_CMD_NO_OPRTN_VAL); } @@ -175,9 +177,8 @@ void LTC2620_SetDaisy(int cmd, int data, int dacaddr, int chipIndex) { FILE_LOG(logDEBUG1, ("Send data (0x%x) to ichip %d\n", codata, chipIndex)); LTC2620_SendDaisyData(&valw, codata); - // send nothing to subsequent ichips (daisy chain) (if any chips after desired chip) - int ichip = 0; - for (ichip = chipIndex + 1; ichip < nchip; ++ichip) { + // send nothing to preceding ichips (daisy chain) (if any chips in front of desired chip) + for (ichip = 0; ichip < chipIndex; ++ichip) { FILE_LOG(logDEBUG1, ("Send nothing to ichip %d\n", ichip)); LTC2620_SendDaisyData(&valw, LTC2620_DAC_CMD_NO_OPRTN_VAL); } @@ -264,7 +265,7 @@ void LTC2620_SetDAC (int dacnum, int data) { * @returns OK or FAIL for success of operation */ int LTC2620_SetDACValue (int dacnum, int val, int mV, int* dacval) { - FILE_LOG(logDEBUG1, ("dacnum:%d, val:%d, mV:%d\n", dacnum, val, mV)); + FILE_LOG(logDEBUG1, ("dacnum:%d, val:%d, ismV:%d\n", dacnum, val, mV)); // validate index if (dacnum < 0 || dacnum >= LTC2620_Ndac) { FILE_LOG(logERROR, ("Dac index %d is out of bounds (0 to %d)\n", dacnum, LTC2620_Ndac - 1)); @@ -279,9 +280,15 @@ int LTC2620_SetDACValue (int dacnum, int val, int mV, int* dacval) { *dacval = val; int dacmV = val; int ret = OK; + int ndacsonly = LTC2620_Ndac; +#ifdef CHIPTESTBOARDD + ndacsonly = NDAC_ONLY; +#endif if (mV) { ret = LTC2620_VoltageToDac(val, dacval); - } else if (val >= 0) { // do not convert power down dac val + } else if (val >= 0 && dacnum <= ndacsonly) { + // do not convert power down dac val + //(if not ndacsonly (pwr/vchip): dont need to print mV value as it will be wrong (wrong limits)) ret = LTC2620_DacToVoltage(val, &dacmV); } @@ -293,7 +300,9 @@ int LTC2620_SetDACValue (int dacnum, int val, int mV, int* dacval) { // set if ( (*dacval >= 0) || (*dacval == LTC2620_PWR_DOWN_VAL)) { +#ifndef CHIPTESTBOARDD FILE_LOG(logINFO, ("Setting DAC %d: %d dac (%d mV)\n",dacnum, *dacval, dacmV)); +#endif LTC2620_SetDAC(dacnum, *dacval); } return OK; diff --git a/slsDetectorServers/slsDetectorServer/commonServerFunctions.h b/slsDetectorServers/slsDetectorServer/commonServerFunctions.h index e4df41c77..a69aad8a7 100755 --- a/slsDetectorServers/slsDetectorServer/commonServerFunctions.h +++ b/slsDetectorServers/slsDetectorServer/commonServerFunctions.h @@ -3,51 +3,70 @@ #include "blackfin.h" void SPIChipSelect (uint32_t* valw, uint32_t addr, uint32_t csmask, uint32_t clkmask, uint32_t digoutmask) { + FILE_LOG(logDEBUG2, ("SPI chip select. valw:0x%08x addr:0x%x csmask:0x%x, clkmask:0x%x digmask:0x%x\n", + *valw, addr, csmask, clkmask, digoutmask)); // start point (*valw) = ((bus_r(addr) | csmask | clkmask) &(~digoutmask)); bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("startpoint. valw:0x%08x\n", *valw)); // chip sel bar down (*valw) &= ~csmask; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("chip sel bar down. valw:0x%08x\n", *valw)); } void SPIChipDeselect (uint32_t* valw, uint32_t addr, uint32_t csmask, uint32_t clkmask) { + FILE_LOG(logDEBUG2, ("SPI chip deselect. valw:0x%08x addr:0x%x csmask:0x%x, clkmask:0x%x\n", + *valw, addr, csmask, clkmask)); + // chip sel bar up (*valw) |= csmask; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("chip sel bar up. valw:0x%08x\n", *valw)); //clk down (*valw) &= ~clkmask; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("clk down. valw:0x%08x\n", *valw)); // stop point = start point of course (*valw) |= csmask; bus_w (addr, (*valw)); //FIXME: for ctb slow adcs, might need to set it to low again + FILE_LOG(logDEBUG2, ("stop point. valw:0x%08x\n", *valw)); } void sendDataToSPI (uint32_t* valw, uint32_t addr, uint32_t val, int numbitstosend, uint32_t clkmask, uint32_t digoutmask, int digofset) { + FILE_LOG(logDEBUG2, ("SPI send data. valw:0x%08x addr:0x%x val:0x%x, numbitstosend:%d, clkmask:0x%x digmask:0x%x digofst:%d\n", + *valw, addr, val, numbitstosend, clkmask, digoutmask, digofset)); + int i = 0; for (i = 0; i < numbitstosend; ++i) { // clk down (*valw) &= ~clkmask; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("clk down. valw:0x%08x\n", *valw)); // write data (i) (*valw) = (((*valw) & ~digoutmask) + // unset bit (((val >> (numbitstosend - 1 - i)) & 0x1) << digofset)); // each bit from val starting from msb bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("write data %d. valw:0x%08x\n", i, *valw)); // clk up (*valw) |= clkmask ; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("clk up. valw:0x%08x\n", *valw)); } } uint32_t receiveDataFromSPI (uint32_t* valw, uint32_t addr, int numbitstoreceive, uint32_t clkmask, uint32_t readaddr) { + FILE_LOG(logDEBUG2, ("SPI send data. valw:0x%08x addr:0x%x numbitstoreceive:%d, clkmask:0x%x readaddr:0x%x \n", + *valw, addr, numbitstoreceive, clkmask, readaddr)); + uint32_t retval = 0; int i = 0; for (i = 0; i < numbitstoreceive; ++i) { @@ -55,22 +74,25 @@ uint32_t receiveDataFromSPI (uint32_t* valw, uint32_t addr, int numbitstoreceive // clk down (*valw) &= ~clkmask; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("clk down. valw:0x%08x\n", *valw)); // read data (i) retval |= ((bus_r(readaddr) & 0x1) << (numbitstoreceive - 1 - i)); + FILE_LOG(logDEBUG2, ("read data %d. retval:0x%08x\n", i, retval)); // clk up (*valw) |= clkmask ; bus_w (addr, (*valw)); + FILE_LOG(logDEBUG2, ("clk up. valw:0x%08x\n", *valw)); } return retval; } void serializeToSPI(uint32_t addr, uint32_t val, uint32_t csmask, int numbitstosend, uint32_t clkmask, uint32_t digoutmask, int digofset) { if (numbitstosend == 16) { - FILE_LOG(logDEBUG1, ("Writing to SPI Register: 0x%04x\n", val)); + FILE_LOG(logDEBUG2, ("Writing to SPI Register: 0x%04x\n", val)); } else { - FILE_LOG(logDEBUG1, ("Writing to SPI Register: 0x%08x\n", val)); + FILE_LOG(logDEBUG2, ("Writing to SPI Register: 0x%08x\n", val)); } uint32_t valw; @@ -92,9 +114,9 @@ uint32_t serializeFromSPI(uint32_t addr, uint32_t csmask, int numbitstoreceive, SPIChipDeselect(&valw, addr, csmask, clkmask); if (numbitstoreceive == 16) { - FILE_LOG(logDEBUG1, ("Read From SPI Register: 0x%04x\n", retval)); + FILE_LOG(logDEBUG2, ("Read From SPI Register: 0x%04x\n", retval)); } else { - FILE_LOG(logDEBUG1, ("Read From SPI Register: 0x%08x\n", retval)); + FILE_LOG(logDEBUG2, ("Read From SPI Register: 0x%08x\n", retval)); } return retval; } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index a5ab7719f..f4d27580c 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -909,7 +909,7 @@ int set_dac(int file_des) { FILE_LOG(logERROR,(mess)); } } - FILE_LOG(logDEBUG1, ("Dac (%d): %d %s\n", serverDacIndex, retval, (mV ? "mV" : "dac units"))); + FILE_LOG(logDEBUG1, ("Dac (%d): %d %s\n\n", serverDacIndex, retval, (mV ? "mV" : "dac units"))); break; } }