ctb server: fixed dacs, power regulators and vchip

This commit is contained in:
2019-02-15 17:08:49 +01:00
parent 4a8a72c447
commit c93f88b7e5
5 changed files with 74 additions and 33 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}
}