Simple driver for the 20-bit ADC MAX1120x from Maxim
MAX1120x.cpp
- Committer:
- macgyveremir
- Date:
- 2012-10-23
- Revision:
- 3:9bf082d65d25
- Parent:
- 2:26afdc979a54
File content as of revision 3:9bf082d65d25:
#include "MAX1120x.h" MAX1120x::MAX1120x (SPI *spi_itf, DigitalIn *miso, DigitalOut *cs_pin) { spi = spi_itf; cs = cs_pin; rdy_dout = miso; *cs = 1; // Assert CS high } void MAX1120x::do_self_calibration () { spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; spi->write (mode_action(ACT_SELF_CAL)); *cs = 1; wait_ms (202); } void MAX1120x::calibrate_system_zero () { spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; spi->write (mode_action(ACT_SYS_OFF_CAL)); *cs = 1; wait_ms(102); } void MAX1120x::calibrate_system_gain () { spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; 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); wait_us (5); *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); wait_us (5); *cs = 0; spi->write (mode_register_write(REG_CTRL1)); spi->write (ctrl); *cs = 1; } char MAX1120x::get_control_1 () { char value; spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; spi->write (mode_register_read(REG_CTRL1)); value = (char) spi->write(0); *cs = 1; return value; } void MAX1120x::set_control_2 (char ctrl) { spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; spi->write (mode_register_write(REG_CTRL2)); spi->write (ctrl); *cs = 1; } char MAX1120x::get_control_2 () { char value; spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; 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); wait_us (5); *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); wait_us (5); *cs = 0; spi->write (mode_register_read(REG_CTRL3)); value = (char) spi->write(0); *cs = 1; return value; } uint MAX1120x::get_single_sample () { UI32toC_t sample; spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *cs = 0; spi->write (mode_action(ACT_CONV_1SPS)); *cs = 1; wait_ms(1); *cs = 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; sample.bytes[3] = 0; return sample.value; } uint MAX1120x::get_cal_register (char register_add) { UI32toC_t data; spi->format (8, MAX1120x_SPI_MODE); wait_us (5); *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 (); }