AD5384 DAC.
Fork of AD5384 by
Diff: AD5384.cpp
- Revision:
- 3:0d930c475e72
- Parent:
- 1:d2d6341d3e97
diff -r d2d6341d3e97 -r 0d930c475e72 AD5384.cpp --- a/AD5384.cpp Sun Oct 05 17:10:03 2014 +0000 +++ b/AD5384.cpp Tue Oct 07 21:17:50 2014 +0000 @@ -59,182 +59,155 @@ -AD5384::AD5384(SWSPI *spiinterface ,DigitalOut* chipselect):getVersion( VERSION_AD5384_HDR,AD5384_SRC_VERSION, __TIME__, __DATE__) { - vref=2.5; - spi=spiinterface; - cs=chipselect; - for ( int nc=0 ; nc < nrch; nc++){ - gain[nc]=0x3FFE; - offset[nc]=0x2000; - } - }; +AD5384::AD5384(SWSPI * spiinterface, DigitalOut * chipselect): + getVersion(VERSION_AD5384_HDR, AD5384_SRC_VERSION, __TIME__, __DATE__) +{ + vref = 2.5; + spi = spiinterface; + cs = chipselect; + for (int nc = 0; nc < nrch; nc++) { + gain[nc] = 0x3FFE; + offset[nc] = 0x2000; + } +}; - u16 AD5384::calculate_dac_setting(u8 nr, float vout ) { +u16 AD5384::calculate_dac_setting(u8 nr, float vout) { //Vout = 2 * Vref * x2 / 2^n => x2 = Vout * 2^14 /(2 * Vref) // x2 is loaded to the DAC string // x1 is the 14 bit DAC wordt written to the DAC input register - if( nr >39 ) return 0; - float x2= vout * p2_14 /(2 *vref); + if (nr > 39) return 0; + float x2 = vout * p2_14 / (2 * vref); // x2 = [(gain+2)/2^n * x1] + offset-2^13 // x1 = 2^14/(gain+2) * [ x2 - offset+2^13 ] - u16 x1 = p2_14/(gain[nr]+1) *( x2- offset[nr]+p2_13); - x1= 0x3FFF & x1; - dac[nr]=x1 ; - return x1; - }; - + u16 x1 = p2_14 / (gain[nr] + 1) * (x2 - offset[nr] + p2_13); + x1 = 0x3FFF & x1; + dac[nr] = x1; + return x1; +}; -u32 AD5384::format_word(u8 mode,u8 ch,u8 rw,u16 data) { - // not clear what is the MSB bit ,set it to zero - u32 shift = (u32) rw&1; - u32 word= shift << 22; - - shift= (u32)(ch &0x1F); - shift = shift << 16; - word = word | shift; - - shift= (u32)(mode & 0x3); - shift = shift << 14; - word = word | shift; - - word = word | (data & 0x3FFF); - - return word; +u32 AD5384::format_word(u8 mode, u8 ch, u8 rw, u16 data) { + // not clear what is the MSB bit ,set it to zero + u32 shift = (u32) rw & 1; + u32 word = shift << 22; + shift = (u32) (ch & 0x1F); + shift = shift << 16; + word = word | shift; + shift = (u32) (mode & 0x3); + shift = shift << 14; + word = word | shift; + word = word | (data & 0x3FFF); + return word; } - -void AD5384::set_spi_mode(){ - spi->format(24,1); + +void AD5384::set_spi_mode() { + spi->format(24, 1); spi->frequency(10000000); } - u16 AD5384::set_volt(u8 ch, float vout ){ - volt[ch]=vout; - u16 dacin=calculate_dac_setting(ch, vout ); + u16 AD5384::set_volt(u8 ch, float vout) { + volt[ch] = vout; + u16 dacin = calculate_dac_setting(ch, vout); set_spi_mode(); - u32 data=format_word(M_DATA_R,ch,0,dacin); + u32 data = format_word(M_DATA_R, ch, 0, dacin); cs->write(C_ACTIVE); spi->write(data); cs->write(C_DEACTIVE); return dacin; } -void AD5384::init1(){ - u16 ctrlreg=0; - ctrlreg = (INT_REF_2500 | REF_SRC_INT ) & TOGGLE_DISABLE; - set_reg(M_SPEC_R,CTRL_REG_ADDR,ctrlreg); - +void AD5384::init1() { + u16 ctrlreg = 0; + ctrlreg = (INT_REF_2500 | REF_SRC_INT ) & TOGGLE_DISABLE; + set_reg(M_SPEC_R, CTRL_REG_ADDR, ctrlreg); } -void AD5384::init2(){ - u16 ctrlreg=0; - // implecite INT_REF_1250 - ctrlreg = REF_SRC_INT & TOGGLE_DISABLE; - set_reg(M_SPEC_R,CTRL_REG_ADDR,ctrlreg); - +void AD5384::init2() { + u16 ctrlreg = 0; + // implecite INT_REF_1250 + ctrlreg = REF_SRC_INT & TOGGLE_DISABLE; + set_reg(M_SPEC_R, CTRL_REG_ADDR, ctrlreg); } - - -u32 AD5384::soft_clr(){ - return set_reg(M_SPEC_R,0x02,0x2000); +u32 AD5384::soft_clr() { + return set_reg(M_SPEC_R, 0x02, 0x2000); } - -u32 AD5384::soft_rst(){ - return set_reg(M_SPEC_R,0x0F,0x211F); +u32 AD5384::soft_rst() { + return set_reg(M_SPEC_R, 0x0F, 0x211F); } - -u32 AD5384::clear_code(){ - return set_reg(M_SPEC_R,0x01,0x2000); - } +u32 AD5384::clear_code() { + return set_reg(M_SPEC_R, 0x01, 0x2000); +} -u16 AD5384::set_gain(u8 ch, u16 gain ){ - set_reg(M_GAIN_R,ch,gain); - return gain; +u16 AD5384::set_gain(u8 ch, u16 gain) { + set_reg(M_GAIN_R, ch, gain); + return gain; } -u16 AD5384::set_offset(u8 ch, u16 gain ){ - set_reg(M_OFFS_R,ch,gain); - return gain; -} - - -u16 AD5384::set_dac(u8 ch, u16 dac ){ - set_reg(M_DATA_R,ch,dac); - return dac; +u16 AD5384::set_offset(u8 ch, u16 gain){ + set_reg(M_OFFS_R, ch, gain); + return gain; } +u16 AD5384::set_dac(u8 ch, u16 dac){ + set_reg(M_DATA_R, ch, dac); + return dac; +} - +u32 AD5384::set_reg(u8 mode, u8 ch, u16 value){ + set_spi_mode(); + value = value & 0x3FFF; + u32 data = format_word(mode, ch, 0, value); + cs->write(C_ACTIVE); + spi->write(data); + cs->write(C_DEACTIVE); + return data; +} - u32 AD5384::set_reg(u8 mode,u8 ch, u16 value ){ - set_spi_mode(); - value=value & 0x3FFF; - u32 data=format_word(mode,ch,0,value); - cs->write(C_ACTIVE); - spi->write(data); - cs->write(C_DEACTIVE); - return data; - } - - u16 AD5384::get_reg(u8 mode, u8 ch ){ - set_spi_mode(); - u32 data=format_word(mode,ch,1,0); - cs->write(C_ACTIVE); - spi->write(data); - cs->write(C_DEACTIVE); - wait( .00001); - cs->write(C_ACTIVE); - data=spi->write(NOP_INST); - cs->write(C_DEACTIVE); - return (u16) data; +u16 AD5384::get_reg(u8 mode, u8 ch ){ + set_spi_mode(); + u32 data = format_word(mode, ch, 1, 0); + cs->write(C_ACTIVE); + spi->write(data); + cs->write(C_DEACTIVE); + wait(0.00001); + cs->write(C_ACTIVE); + data=spi->write(NOP_INST); + cs->write(C_DEACTIVE); + return (u16) data; } - u16 AD5384::get_gain(u8 ch ){ - return get_reg(M_GAIN_R,ch); - +u16 AD5384::get_gain(u8 ch) { + return get_reg(M_GAIN_R, ch); } -u16 AD5384::get_dac(u8 ch){ - return get_reg(M_DATA_R,ch); - +u16 AD5384::get_dac(u8 ch) { + return get_reg(M_DATA_R, ch); } - - - - - u16 AD5384::get_offset(u8 ch ){ - return get_reg(M_OFFS_R,ch); - + +u16 AD5384::get_offset(u8 ch) { + return get_reg(M_OFFS_R, ch); } u32 AD5384::get_ctrl(){ - return get_reg(M_SPEC_R, 0x0C); } - - - u16 AD5384::get_ch_out_reg(u8 ch) { - u32 data=format_word(M_DATA_R,ch,1,0); - cs->write(C_ACTIVE); - spi->write(data); - cs->write(C_DEACTIVE); - wait( .00001); - cs->write(C_ACTIVE); - data=spi->write(NOP_INST); - cs->write(C_DEACTIVE); - return (u16) data; + u32 data=format_word(M_DATA_R,ch,1,0); + cs->write(C_ACTIVE); + spi->write(data); + cs->write(C_DEACTIVE); + wait(0.00001); + cs->write(C_ACTIVE); + data = spi->write(NOP_INST); + cs->write(C_DEACTIVE); + return (u16) data; } - - - - -#include "sscm_comm.h" +#include "sscm_comm.h" // Weird place for an include /* u16 AD5384::get_src_version_nr(){