Simple driver for the 20-bit ADC MAX1120x from Maxim

Committer:
macgyveremir
Date:
Tue Oct 23 19:09:00 2012 +0000
Revision:
3:9bf082d65d25
Parent:
2:26afdc979a54
Working implementation. Can easily be extended to include higher-level functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
macgyveremir 0:af630aa9a00d 1 #include "MAX1120x.h"
macgyveremir 0:af630aa9a00d 2
macgyveremir 0:af630aa9a00d 3 MAX1120x::MAX1120x (SPI *spi_itf, DigitalIn *miso, DigitalOut *cs_pin)
macgyveremir 0:af630aa9a00d 4 {
macgyveremir 0:af630aa9a00d 5 spi = spi_itf;
macgyveremir 0:af630aa9a00d 6 cs = cs_pin;
macgyveremir 0:af630aa9a00d 7 rdy_dout = miso;
macgyveremir 0:af630aa9a00d 8
macgyveremir 0:af630aa9a00d 9 *cs = 1; // Assert CS high
macgyveremir 0:af630aa9a00d 10 }
macgyveremir 0:af630aa9a00d 11
macgyveremir 0:af630aa9a00d 12 void MAX1120x::do_self_calibration ()
macgyveremir 0:af630aa9a00d 13 {
macgyveremir 2:26afdc979a54 14 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 15 wait_us (5);
macgyveremir 3:9bf082d65d25 16
macgyveremir 0:af630aa9a00d 17 *cs = 0;
macgyveremir 2:26afdc979a54 18 spi->write (mode_action(ACT_SELF_CAL));
macgyveremir 0:af630aa9a00d 19 *cs = 1;
macgyveremir 3:9bf082d65d25 20 wait_ms (202);
macgyveremir 2:26afdc979a54 21 }
macgyveremir 2:26afdc979a54 22
macgyveremir 2:26afdc979a54 23 void MAX1120x::calibrate_system_zero ()
macgyveremir 2:26afdc979a54 24 {
macgyveremir 2:26afdc979a54 25 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 26 wait_us (5);
macgyveremir 3:9bf082d65d25 27
macgyveremir 2:26afdc979a54 28 *cs = 0;
macgyveremir 2:26afdc979a54 29 spi->write (mode_action(ACT_SYS_OFF_CAL));
macgyveremir 2:26afdc979a54 30 *cs = 1;
macgyveremir 2:26afdc979a54 31 wait_ms(102);
macgyveremir 0:af630aa9a00d 32 }
macgyveremir 0:af630aa9a00d 33
macgyveremir 2:26afdc979a54 34 void MAX1120x::calibrate_system_gain ()
macgyveremir 0:af630aa9a00d 35 {
macgyveremir 2:26afdc979a54 36 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 37 wait_us (5);
macgyveremir 3:9bf082d65d25 38
macgyveremir 0:af630aa9a00d 39 *cs = 0;
macgyveremir 2:26afdc979a54 40 spi->write (mode_action(ACT_SYS_GAN_CAL));
macgyveremir 2:26afdc979a54 41 *cs = 1;
macgyveremir 2:26afdc979a54 42 wait_ms(102);
macgyveremir 2:26afdc979a54 43 }
macgyveremir 2:26afdc979a54 44
macgyveremir 2:26afdc979a54 45 char MAX1120x::get_status ()
macgyveremir 2:26afdc979a54 46 {
macgyveremir 2:26afdc979a54 47 char value;
macgyveremir 2:26afdc979a54 48
macgyveremir 2:26afdc979a54 49 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 50 wait_us (5);
macgyveremir 3:9bf082d65d25 51
macgyveremir 2:26afdc979a54 52 *cs = 0;
macgyveremir 2:26afdc979a54 53 spi->write (mode_register_read(REG_STAT1));
macgyveremir 2:26afdc979a54 54 value = (char) spi->write(0);
macgyveremir 2:26afdc979a54 55 *cs = 1;
macgyveremir 2:26afdc979a54 56
macgyveremir 2:26afdc979a54 57 return value;
macgyveremir 2:26afdc979a54 58 }
macgyveremir 2:26afdc979a54 59
macgyveremir 2:26afdc979a54 60 void MAX1120x::set_control_1 (char ctrl)
macgyveremir 2:26afdc979a54 61 {
macgyveremir 2:26afdc979a54 62 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 63 wait_us (5);
macgyveremir 3:9bf082d65d25 64
macgyveremir 2:26afdc979a54 65 *cs = 0;
macgyveremir 2:26afdc979a54 66 spi->write (mode_register_write(REG_CTRL1));
macgyveremir 2:26afdc979a54 67 spi->write (ctrl);
macgyveremir 0:af630aa9a00d 68 *cs = 1;
macgyveremir 0:af630aa9a00d 69 }
macgyveremir 0:af630aa9a00d 70
macgyveremir 0:af630aa9a00d 71 char MAX1120x::get_control_1 ()
macgyveremir 0:af630aa9a00d 72 {
macgyveremir 0:af630aa9a00d 73 char value;
macgyveremir 0:af630aa9a00d 74
macgyveremir 2:26afdc979a54 75 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 76 wait_us (5);
macgyveremir 3:9bf082d65d25 77
macgyveremir 0:af630aa9a00d 78 *cs = 0;
macgyveremir 2:26afdc979a54 79 spi->write (mode_register_read(REG_CTRL1));
macgyveremir 0:af630aa9a00d 80 value = (char) spi->write(0);
macgyveremir 0:af630aa9a00d 81 *cs = 1;
macgyveremir 0:af630aa9a00d 82
macgyveremir 0:af630aa9a00d 83 return value;
macgyveremir 0:af630aa9a00d 84 }
macgyveremir 0:af630aa9a00d 85
macgyveremir 2:26afdc979a54 86 void MAX1120x::set_control_2 (char ctrl)
macgyveremir 1:17195d284d76 87 {
macgyveremir 2:26afdc979a54 88 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 89 wait_us (5);
macgyveremir 3:9bf082d65d25 90
macgyveremir 1:17195d284d76 91 *cs = 0;
macgyveremir 2:26afdc979a54 92 spi->write (mode_register_write(REG_CTRL2));
macgyveremir 2:26afdc979a54 93 spi->write (ctrl);
macgyveremir 1:17195d284d76 94 *cs = 1;
macgyveremir 1:17195d284d76 95 }
macgyveremir 1:17195d284d76 96
macgyveremir 1:17195d284d76 97 char MAX1120x::get_control_2 ()
macgyveremir 1:17195d284d76 98 {
macgyveremir 1:17195d284d76 99 char value;
macgyveremir 1:17195d284d76 100
macgyveremir 2:26afdc979a54 101 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 102 wait_us (5);
macgyveremir 3:9bf082d65d25 103
macgyveremir 1:17195d284d76 104 *cs = 0;
macgyveremir 2:26afdc979a54 105 spi->write (mode_register_read(REG_CTRL2));
macgyveremir 2:26afdc979a54 106 value = (char) spi->write(0);
macgyveremir 2:26afdc979a54 107 *cs = 1;
macgyveremir 2:26afdc979a54 108
macgyveremir 2:26afdc979a54 109 return value;
macgyveremir 2:26afdc979a54 110 }
macgyveremir 2:26afdc979a54 111
macgyveremir 2:26afdc979a54 112 void MAX1120x::set_control_3 (char ctrl)
macgyveremir 2:26afdc979a54 113 {
macgyveremir 2:26afdc979a54 114 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 115 wait_us (5);
macgyveremir 3:9bf082d65d25 116
macgyveremir 2:26afdc979a54 117 *cs = 0;
macgyveremir 2:26afdc979a54 118 spi->write (mode_register_write(REG_CTRL3));
macgyveremir 2:26afdc979a54 119 spi->write (ctrl);
macgyveremir 2:26afdc979a54 120 *cs = 1;
macgyveremir 2:26afdc979a54 121 }
macgyveremir 2:26afdc979a54 122
macgyveremir 2:26afdc979a54 123 char MAX1120x::get_control_3 ()
macgyveremir 2:26afdc979a54 124 {
macgyveremir 2:26afdc979a54 125 char value;
macgyveremir 2:26afdc979a54 126
macgyveremir 2:26afdc979a54 127 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 128 wait_us (5);
macgyveremir 3:9bf082d65d25 129
macgyveremir 2:26afdc979a54 130 *cs = 0;
macgyveremir 2:26afdc979a54 131 spi->write (mode_register_read(REG_CTRL3));
macgyveremir 1:17195d284d76 132 value = (char) spi->write(0);
macgyveremir 1:17195d284d76 133 *cs = 1;
macgyveremir 1:17195d284d76 134
macgyveremir 1:17195d284d76 135 return value;
macgyveremir 1:17195d284d76 136 }
macgyveremir 1:17195d284d76 137
macgyveremir 0:af630aa9a00d 138 uint MAX1120x::get_single_sample ()
macgyveremir 0:af630aa9a00d 139 {
macgyveremir 2:26afdc979a54 140 UI32toC_t sample;
macgyveremir 2:26afdc979a54 141
macgyveremir 2:26afdc979a54 142 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 143 wait_us (5);
macgyveremir 3:9bf082d65d25 144
macgyveremir 2:26afdc979a54 145 *cs = 0;
macgyveremir 2:26afdc979a54 146 spi->write (mode_action(ACT_CONV_1SPS));
macgyveremir 2:26afdc979a54 147 *cs = 1;
macgyveremir 2:26afdc979a54 148
macgyveremir 2:26afdc979a54 149 wait_ms(1);
macgyveremir 0:af630aa9a00d 150
macgyveremir 0:af630aa9a00d 151 *cs = 0;
macgyveremir 2:26afdc979a54 152 while (*rdy_dout) {};
macgyveremir 2:26afdc979a54 153 spi->write (mode_register_read(REG_DATA));
macgyveremir 2:26afdc979a54 154 sample.bytes[2] = (char) spi->write(0);
macgyveremir 2:26afdc979a54 155 sample.bytes[1] = (char) spi->write(0);
macgyveremir 2:26afdc979a54 156 sample.bytes[0] = (char) spi->write(0);
macgyveremir 0:af630aa9a00d 157 *cs = 1;
macgyveremir 2:26afdc979a54 158 sample.bytes[3] = 0;
macgyveremir 2:26afdc979a54 159
macgyveremir 2:26afdc979a54 160 return sample.value;
macgyveremir 2:26afdc979a54 161 }
macgyveremir 0:af630aa9a00d 162
macgyveremir 2:26afdc979a54 163 uint MAX1120x::get_cal_register (char register_add)
macgyveremir 2:26afdc979a54 164 {
macgyveremir 2:26afdc979a54 165 UI32toC_t data;
macgyveremir 2:26afdc979a54 166
macgyveremir 2:26afdc979a54 167 spi->format (8, MAX1120x_SPI_MODE);
macgyveremir 3:9bf082d65d25 168 wait_us (5);
macgyveremir 3:9bf082d65d25 169
macgyveremir 2:26afdc979a54 170 *cs = 0;
macgyveremir 2:26afdc979a54 171 spi->write (mode_register_read(register_add));
macgyveremir 2:26afdc979a54 172 data.bytes[2] = (char) spi->write(0);
macgyveremir 2:26afdc979a54 173 data.bytes[1] = (char) spi->write(0);
macgyveremir 2:26afdc979a54 174 data.bytes[0] = (char) spi->write(0);
macgyveremir 2:26afdc979a54 175 *cs = 1;
macgyveremir 2:26afdc979a54 176 data.bytes[3] = 0;
macgyveremir 2:26afdc979a54 177
macgyveremir 2:26afdc979a54 178 return data.value;
macgyveremir 0:af630aa9a00d 179 }
macgyveremir 2:26afdc979a54 180
macgyveremir 2:26afdc979a54 181 void MAX1120x::init_singlecycle_unipolar_nosyscal ()
macgyveremir 2:26afdc979a54 182 {
macgyveremir 2:26afdc979a54 183 set_control_1 (CTRL1_SCYCLE | CTRL1_SIGBUF | CTRL1_REFBUF | CTRL1_UNIP_BIP);
macgyveremir 2:26afdc979a54 184 set_control_3 (CTRL3_NOSYSG | CTRL3_NOSYSO );
macgyveremir 2:26afdc979a54 185 do_self_calibration ();
macgyveremir 2:26afdc979a54 186 }