Simple driver for the 20-bit ADC MAX1120x from Maxim
Diff: MAX1120x.cpp
- Revision:
- 2:26afdc979a54
- Parent:
- 1:17195d284d76
- Child:
- 3:9bf082d65d25
--- a/MAX1120x.cpp Thu Aug 23 01:01:32 2012 +0000 +++ b/MAX1120x.cpp Fri Oct 12 18:30:48 2012 +0000 @@ -11,17 +11,50 @@ void MAX1120x::do_self_calibration () { + spi->format (8, MAX1120x_SPI_MODE); *cs = 0; - spi->write(START | MODE_ACTION | ACT_SELF_CAL); + spi->write (mode_action(ACT_SELF_CAL)); *cs = 1; - wait_ms(201); + wait_ms(202); +} + +void MAX1120x::calibrate_system_zero () +{ + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_action(ACT_SYS_OFF_CAL)); + *cs = 1; + wait_ms(102); } -void MAX1120x::set_control_1 (char ctrl1) +void MAX1120x::calibrate_system_gain () { + spi->format (8, MAX1120x_SPI_MODE); *cs = 0; - spi->write(START | MODE_REGISTER | REG_DO_WRITE | REG_CTRL1); - spi->write(ctrl1); + spi->write (mode_action(ACT_SYS_GAN_CAL)); + *cs = 1; + wait_ms(102); +} + +char MAX1120x::get_status () +{ + char value; + + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_register_read(REG_STAT1)); + value = (char) spi->write(0); + *cs = 1; + + return value; +} + +void MAX1120x::set_control_1 (char ctrl) +{ + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_register_write(REG_CTRL1)); + spi->write (ctrl); *cs = 1; } @@ -29,19 +62,21 @@ { char value; + spi->format (8, MAX1120x_SPI_MODE); *cs = 0; - spi->write(START | MODE_REGISTER | REG_DO_READ | REG_CTRL1); + spi->write (mode_register_read(REG_CTRL1)); value = (char) spi->write(0); *cs = 1; return value; } -void MAX1120x::set_control_2 (char ctrl1) +void MAX1120x::set_control_2 (char ctrl) { + spi->format (8, MAX1120x_SPI_MODE); *cs = 0; - spi->write(START | MODE_REGISTER | REG_DO_WRITE | REG_CTRL2); - spi->write(ctrl1); + spi->write (mode_register_write(REG_CTRL2)); + spi->write (ctrl); *cs = 1; } @@ -49,8 +84,31 @@ { char value; + spi->format (8, MAX1120x_SPI_MODE); *cs = 0; - spi->write(START | MODE_REGISTER | REG_DO_READ | REG_CTRL2); + spi->write (mode_register_read(REG_CTRL2)); + value = (char) spi->write(0); + *cs = 1; + + return value; +} + +void MAX1120x::set_control_3 (char ctrl) +{ + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_register_write(REG_CTRL3)); + spi->write (ctrl); + *cs = 1; +} + +char MAX1120x::get_control_3 () +{ + char value; + + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_register_read(REG_CTRL3)); value = (char) spi->write(0); *cs = 1; @@ -59,21 +117,46 @@ uint MAX1120x::get_single_sample () { - char bytes[4]; - unsigned int *sample; + UI32toC_t sample; + + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_action(ACT_CONV_1SPS)); + *cs = 1; + + wait_ms(1); *cs = 0; - spi->write(START | MODE_ACTION | ACT_CONV_1SPS); - - while (*rdy_dout) {}; - - spi->write(START | MODE_REGISTER | REG_DO_READ | REG_DATA); - bytes[2] = (char) spi->write(0); - bytes[1] = (char) spi->write(0); - bytes[0] = (char) spi->write(0); + while (*rdy_dout) {}; + spi->write (mode_register_read(REG_DATA)); + sample.bytes[2] = (char) spi->write(0); + sample.bytes[1] = (char) spi->write(0); + sample.bytes[0] = (char) spi->write(0); *cs = 1; - bytes[3] = 0; + sample.bytes[3] = 0; + + return sample.value; +} - sample = (unsigned int *)bytes; - return *sample; +uint MAX1120x::get_cal_register (char register_add) +{ + UI32toC_t data; + + spi->format (8, MAX1120x_SPI_MODE); + *cs = 0; + spi->write (mode_register_read(register_add)); + data.bytes[2] = (char) spi->write(0); + data.bytes[1] = (char) spi->write(0); + data.bytes[0] = (char) spi->write(0); + *cs = 1; + data.bytes[3] = 0; + + return data.value; } + +void MAX1120x::init_singlecycle_unipolar_nosyscal () +{ + set_control_1 (CTRL1_SCYCLE | CTRL1_SIGBUF | CTRL1_REFBUF | CTRL1_UNIP_BIP); + set_control_3 (CTRL3_NOSYSG | CTRL3_NOSYSO ); + do_self_calibration (); +}