Simple driver for the 20-bit ADC MAX1120x from Maxim

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 ();
+}