Maxim Integrated 7-bit Sink/Source Current DAC. DS4424, DS4422 input/output current Digital-to-Analog Converter Driver/library code.

Dependents:   DS4424_Hello_Current_DAC_on_MAX32630FTHR

Revision:
5:fc75fced724f
Parent:
4:3824afaf0d61
--- a/DS4424.cpp	Sun Oct 07 22:13:14 2018 +0000
+++ b/DS4424.cpp	Wed Jan 23 00:43:09 2019 +0000
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
+ * Copyright (C) 2018-2019 Maxim Integrated Products, Inc., All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -32,6 +32,10 @@
  */
  
 #include "DS4424.h"
+/* #include "USBSerial.h" */
+#define DS4424_U8_MAX     ((uint8_t)~0U)
+#define DS4424_S8_MAX     ((int8_t)(DS4424_U8_MAX>>1))
+#define DS4424_S8_MIN     ((int8_t)(-DS4424_S8_MAX - 1))
 
 /*
  * DS4424 DAC control register 8 bits
@@ -84,7 +88,7 @@
     union ds4424_raw_data raw;
     
     if (chan_addr >= REG_OUT0 && chan_addr <=  m_max_ch_reg_addr)
-        ret = read_register(chan_addr, value);
+        ret = read_register(value, chan_addr);
     if (ret != 0)
         return DS4424_ERROR;
     
@@ -98,6 +102,23 @@
 }
 
 
+
+/******************************************************************************/
+int DS4424::read_hw_raw(uint8_t &result, ChannelRegAddr_e chan_addr) 
+{
+    uint8_t value;
+    int ret = DS4424_ERROR;
+
+    if (chan_addr >= REG_OUT0 && chan_addr <=  m_max_ch_reg_addr)
+        ret = read_register(value, chan_addr);
+    if (ret != 0)
+        return DS4424_ERROR;
+
+    result = value;
+    return DS4424_NO_ERROR;
+}
+
+
 /******************************************************************************/
 int DS4424::write_raw(int32_t value, ChannelRegAddr_e chan_addr) 
 {
@@ -126,9 +147,90 @@
     }
 }
 
+
+
+/******************************************************************************/
+int DS4424::write_hw_raw(uint8_t value, ChannelRegAddr_e chan_addr) 
+{
+    int ret = DS4424_ERROR;
+    if (chan_addr >= REG_OUT0 && chan_addr <=  m_max_ch_reg_addr) {
+        ret = write_register(chan_addr, value);
  
+        if (ret != 0)
+            return DS4424_ERROR;
+        return DS4424_NO_ERROR;
+    } else {
+        return DS4424_ERROR;
+    }
+}
+
+
 /******************************************************************************/
-int DS4424::read_register(ChannelRegAddr_e reg, uint8_t &value) 
+int DS4424::convert_picoAmps_to_hw_raw(uint8_t *val_out,
+    int32_t picoAmps, uint32_t rfs_resistor)
+{
+    uint32_t val, tmp_scale, round_up;
+    union ds4424_raw_data raw;
+
+        /*   val can be 0 to 200,000,000 (200 picoAmps)  */
+        val = picoAmps;
+        raw.source_bit = DS4424_SOURCE_I;
+        if (picoAmps < 0) {
+            raw.source_bit = DS4424_SINK_I;
+            val = -picoAmps;
+        }
+        if (val > DS4424_MAX_PICOAMPS ||
+                rfs_resistor < DS4424_MIN_RFS ||
+                rfs_resistor > DS4424_MAX_RFS)
+            return DS4424_ERROR;
+        rfs_resistor /= 100;
+        val = val / 1000;
+
+        tmp_scale = DS4424_IFS_SCALE / 10;
+        round_up = tmp_scale / 2;
+        val = ((val * rfs_resistor) + round_up) /
+            tmp_scale;
+
+        val = val / 100;
+        if (val > DS4424_S8_MAX) {
+            printf("%s : Requested current %d\r\n",
+                __func__, val);
+            printf("exceeds maximum. DAC set to maximum %d\n\r\n",
+                DS4424_S8_MAX);
+            val = DS4424_S8_MAX;
+        }
+        raw.dx = val;
+        *val_out = raw.bits;
+        return DS4424_NO_ERROR;
+
+}
+
+
+/******************************************************************************/
+int DS4424::convert_raw_to_picoAmps(int32_t *val_out,
+    int8_t raw_in, uint32_t rfs_resistor)
+{
+    uint32_t round_up;
+    union ds4424_raw_data raw;
+    if (rfs_resistor < DS4424_MIN_RFS || rfs_resistor > DS4424_MAX_RFS) {
+        return DS4424_ERROR;
+    }
+    rfs_resistor /= 100;
+
+    raw.bits = raw_in;
+    *val_out = DS4424_IFS_SCALE * raw.dx * 10;
+    round_up = rfs_resistor / 2;
+    *val_out = (*val_out + round_up) / rfs_resistor;
+
+    if (raw.source_bit == DS4424_SINK_I)
+        *val_out = -*val_out;  /* this routine use negatives if sinking */
+    *val_out = *val_out * 1000; /* picoAmps */
+    return DS4424_NO_ERROR;
+}
+
+
+/******************************************************************************/
+int DS4424::read_register(uint8_t &value, ChannelRegAddr_e reg) 
 {
     int32_t ret;