mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-12 12:57:13 +02:00
ctb server: fixed dacs, power regulators and vchip
This commit is contained in:
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user