Browse Source

Verbesserung: I2C Buffer data sind jetzt globale structs

Heinrich Blatt 8 months ago
parent
commit
6937d44a7e

+ 2 - 0
.settings/org.eclipse.core.resources.prefs

@@ -10,5 +10,7 @@ encoding//Debug/src/interfaces/subdir_rules.mk=UTF-8
 encoding//Debug/src/interfaces/subdir_vars.mk=UTF-8
 encoding//Debug/src/interfaces/subdir_vars.mk=UTF-8
 encoding//Debug/src/peripherals/adc/subdir_rules.mk=UTF-8
 encoding//Debug/src/peripherals/adc/subdir_rules.mk=UTF-8
 encoding//Debug/src/peripherals/adc/subdir_vars.mk=UTF-8
 encoding//Debug/src/peripherals/adc/subdir_vars.mk=UTF-8
+encoding//Debug/src/peripherals/dac/subdir_rules.mk=UTF-8
+encoding//Debug/src/peripherals/dac/subdir_vars.mk=UTF-8
 encoding//Debug/subdir_rules.mk=UTF-8
 encoding//Debug/subdir_rules.mk=UTF-8
 encoding//Debug/subdir_vars.mk=UTF-8
 encoding//Debug/subdir_vars.mk=UTF-8

+ 16 - 15
main_target.c

@@ -6,6 +6,7 @@
 #include "src/peripherals/adc/adc.h"
 #include "src/peripherals/adc/adc.h"
 #include "src/peripherals/adc/adc_interface.h"
 #include "src/peripherals/adc/adc_interface.h"
 #include "src/i2c_comm/mcu_slave_interface.h"
 #include "src/i2c_comm/mcu_slave_interface.h"
+#include "src/interfaces/i2c_controller_interface.h"
 
 
 
 
 #define DELAY_CYCLE  (100000000)
 #define DELAY_CYCLE  (100000000)
@@ -67,7 +68,7 @@ void I2C_controller_INST_IRQHandler(void) {
   switch (DL_I2C_getPendingInterrupt(I2C_controller_INST)) { 
   switch (DL_I2C_getPendingInterrupt(I2C_controller_INST)) { 
     
     
     case DL_I2C_IIDX_CONTROLLER_START:
     case DL_I2C_IIDX_CONTROLLER_START:
-        gRxADCcount = 0;
+        controllerRxPackage.count = 0;
         
         
         DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
         DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
         break;
         break;
@@ -75,43 +76,43 @@ void I2C_controller_INST_IRQHandler(void) {
     case DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER:
     case DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER:
         /* Store bytes received from target in Rx Msg Buffer */
         /* Store bytes received from target in Rx Msg Buffer */
         while (DL_I2C_isControllerRXFIFOEmpty(I2C_controller_INST) != true) {
         while (DL_I2C_isControllerRXFIFOEmpty(I2C_controller_INST) != true) {
-            if (gRxADCcount < gRxADClen) {
-                gRxPacket[gRxADCcount] =
+            if (controllerRxPackage.count < controllerRxPackage.len) {
+                controllerRxPackage.packet[controllerRxPackage.count] =
                     DL_I2C_receiveControllerData(I2C_controller_INST);
                     DL_I2C_receiveControllerData(I2C_controller_INST);
                     ;
                     ;
-                gRxADCcount++;
+                controllerRxPackage.count++;
 
 
             } else {
             } else {
                 /* Ignore and remove from FIFO if the buffer is full */
                 /* Ignore and remove from FIFO if the buffer is full */
                 DL_I2C_receiveControllerData(I2C_controller_INST);
                 DL_I2C_receiveControllerData(I2C_controller_INST);
             }
             }
         }
         }
-            if (gRxADCcount >= gRxADClen) {
-            gRxComplete = true;
+            if (controllerRxPackage.count >= controllerRxPackage.len) {
+            controllerRxPackage.complete = true;
             DL_I2C_enableInterrupt(I2C_controller_INST,
             DL_I2C_enableInterrupt(I2C_controller_INST,
                                     DL_I2C_INTERRUPT_CONTROLLER_STOP);
                                     DL_I2C_INTERRUPT_CONTROLLER_STOP);
             }
             }
         break;
         break;
     /*TRANSMIT data to ADC*/
     /*TRANSMIT data to ADC*/
     case DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER:
     case DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER:
-        if (gTxADCcount < gTxADClen) {
+        if (controllerTxPackage.count < controllerTxPackage.len) {
             DL_I2C_fillControllerTXFIFO(I2C_controller_INST,
             DL_I2C_fillControllerTXFIFO(I2C_controller_INST,
-                                                    &gTxPacket[gTxADCcount],
-                                                    (gTxADClen - gTxADCcount));
-            gTxADCcount++;
+                                        &controllerTxPackage.packet[controllerTxPackage.count],
+                                        (controllerTxPackage.len - controllerTxPackage.count));
+            controllerTxPackage.count++;
         } else {
         } else {
             /*Prevent overflow and just ignore data*/
             /*Prevent overflow and just ignore data*/
             DL_I2C_fillTargetTXFIFO(I2C_controller_INST, (uint8_t[]){0x00}, 1);
             DL_I2C_fillTargetTXFIFO(I2C_controller_INST, (uint8_t[]){0x00}, 1);
-            gTxComplete = true;
+            controllerTxPackage.complete = true;
         }
         }
-        if(gTxADCcount >= gTxADClen){
-            gTxComplete= true;
+        if(controllerTxPackage.count >= controllerTxPackage.len){
+            controllerTxPackage.complete= true;
         }
         }
         break;
         break;
     /*STOP condition*/
     /*STOP condition*/
     case DL_I2C_IIDX_CONTROLLER_STOP:
     case DL_I2C_IIDX_CONTROLLER_STOP:
-        gTxComplete = true;
-        gRxComplete = true;
+        controllerTxPackage.complete = true;
+        controllerRxPackage.complete = true;
         break;
         break;
     case DL_I2C_IIDX_CONTROLLER_ARBITRATION_LOST:
     case DL_I2C_IIDX_CONTROLLER_ARBITRATION_LOST:
         break;
         break;

+ 23 - 2
src/interfaces/i2c_controller_interface.h

@@ -25,12 +25,33 @@ Reference:
 #include <stdint.h>
 #include <stdint.h>
 #include <stdbool.h>
 #include <stdbool.h>
 
 
+//Maximum packet sizes
+#define I2C_TX_MAX_PACKET_SIZE (4)  
+#define I2C_RX_MAX_PACKET_SIZE (4)  
+
+typedef struct {
+    volatile bool complete;
+    uint8_t packet[I2C_RX_MAX_PACKET_SIZE];
+    uint8_t count;
+    uint8_t len;
+} I2CRxPackage;
+
+extern I2CRxPackage controllerRxPackage;
+
+typedef struct {
+    volatile bool complete;
+    uint8_t packet[I2C_TX_MAX_PACKET_SIZE];
+    uint8_t count;
+    uint8_t len;
+} I2CTxPackage;
+extern I2CTxPackage controllerTxPackage;
+
 /*
 /*
 * Since C does not allows to add functions in typedef struct, however a function pointer can be included in Structure in C. This interface provides a standard features of i2c_hal
 * Since C does not allows to add functions in typedef struct, however a function pointer can be included in Structure in C. This interface provides a standard features of i2c_hal
 */
 */
 typedef struct{
 typedef struct{
-    bool (*write)(uint8_t const TARGET_ADDRESS, const uint8_t *const Data, uint8_t const Data_length);
-    bool (*read) (uint8_t const TARGET_ADDRESS, uint8_t const Data_length);
+    bool (*write)(uint8_t const TARGET_ADDRESS);
+    bool (*read) (uint8_t const TARGET_ADDRESS);
 } I2C_Interface;
 } I2C_Interface;
 
 
 extern I2C_Interface i2c_hal;
 extern I2C_Interface i2c_hal;

+ 18 - 9
src/interfaces/i2c_hal.c

@@ -8,6 +8,13 @@
 #include "ti_msp_dl_config.h"
 #include "ti_msp_dl_config.h"
 #include <stdio.h>
 #include <stdio.h>
 
 
+volatile bool gRxComplete;
+volatile bool gTxComplete;
+uint8_t gTxPacket[I2C_TX_MAX_PACKET_SIZE];
+uint8_t gRxPacket[I2C_RX_MAX_PACKET_SIZE];
+uint8_t gTxADClen, gTxADCcount;
+uint8_t gRxADClen, gRxADCcount;
+
 /*
 /*
 static function is for implementing Data Hiding, access to the static function
 static function is for implementing Data Hiding, access to the static function
 is restricted to the file where they are declared const keyword for
 is restricted to the file where they are declared const keyword for
@@ -15,9 +22,10 @@ is restricted to the file where they are declared const keyword for
 const Data: means the pointer to the variable and the value of Data is immutable
 const Data: means the pointer to the variable and the value of Data is immutable
 */
 */
 
 
-static bool msp_i2c_write(uint8_t const TARGET_ADDRESS,
-                          const uint8_t *const Data,
-                          uint8_t const Data_length) {
+I2CRxPackage controllerRxPackage;
+I2CTxPackage controllerTxPackage;
+
+static bool msp_i2c_write(uint8_t const TARGET_ADDRESS) {
   // Flush any stale data in TX FIFO:
   // Flush any stale data in TX FIFO:
   DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
   DL_I2C_flushControllerTXFIFO(I2C_controller_INST);
 
 
@@ -36,11 +44,13 @@ static bool msp_i2c_write(uint8_t const TARGET_ADDRESS,
 
 
   // **Start I2C Write Transaction**
   // **Start I2C Write Transaction**
   DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
   DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
-                                 DL_I2C_CONTROLLER_DIRECTION_TX, Data_length);
+                                 DL_I2C_CONTROLLER_DIRECTION_TX, controllerTxPackage.len);
 
 
   // **Load Configuration Byte into TX FIFO**
   // **Load Configuration Byte into TX FIFO**
-  DL_I2C_fillControllerTXFIFO(I2C_controller_INST, (uint8_t *)Data,
-                              Data_length);
+  DL_I2C_fillControllerTXFIFO(I2C_controller_INST, controllerTxPackage.packet, controllerTxPackage.len);
+  for (uint8_t i = 0; i < controllerTxPackage.len; i++) {
+      printf("Sending 0x%02X\n", controllerTxPackage.packet[i]);
+  }
 
 
   // ** Wait for the I2C Bus to be FREE **
   // ** Wait for the I2C Bus to be FREE **
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
@@ -67,8 +77,7 @@ static bool msp_i2c_write(uint8_t const TARGET_ADDRESS,
   return true;
   return true;
 }
 }
 
 
-static bool msp_i2c_read(uint8_t const TARGET_ADDRESS,
-                         uint8_t const Data_length) {
+static bool msp_i2c_read(uint8_t const TARGET_ADDRESS) {
 
 
   
   
  // Flush any stale data in TX FIFO:
  // Flush any stale data in TX FIFO:
@@ -77,7 +86,7 @@ static bool msp_i2c_read(uint8_t const TARGET_ADDRESS,
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
     ;
     ;
   DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
   DL_I2C_startControllerTransfer(I2C_controller_INST, TARGET_ADDRESS,
-                                 DL_I2C_CONTROLLER_DIRECTION_RX, Data_length);
+                                 DL_I2C_CONTROLLER_DIRECTION_RX, controllerRxPackage.len);
 
 
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)

+ 10 - 1
src/peripherals/adc/adc.c

@@ -3,6 +3,7 @@
 #include <stdint.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdio.h>
 #include "src/peripherals/adc/adc_interface.h"
 #include "src/peripherals/adc/adc_interface.h"
+#include "src/interfaces/i2c_controller_interface.h"
 
 
 
 
 //static ADC_Params adc_params;
 //static ADC_Params adc_params;
@@ -22,7 +23,6 @@ void updateADCReading_multichannel(uint8_t slot, uint8_t channel) {
             adc_params.gain = 1;
             adc_params.gain = 1;
             //printf("Config: Memory address of batteries: %p\n", &batteries[0]);
             //printf("Config: Memory address of batteries: %p\n", &batteries[0]);
             adc_hal.configure(slot, &adc_params);
             adc_hal.configure(slot, &adc_params);
-            delay_cycles(500000);
             //adc_state = ADC_STATE_WAIT;
             //adc_state = ADC_STATE_WAIT;
             adc_state = ADC_STATE_READ;
             adc_state = ADC_STATE_READ;
             break;
             break;
@@ -51,6 +51,15 @@ void updateADCReading_multichannel(uint8_t slot, uint8_t channel) {
                 adc_state = ADC_STATE_DONE;
                 adc_state = ADC_STATE_DONE;
                 printf("[ADC] Battery Current in slot %d is %d mA.\n", slot, batteries[slot].current);
                 printf("[ADC] Battery Current in slot %d is %d mA.\n", slot, batteries[slot].current);
                 //printf("current: Memory address of batteries: %p\n", &batteries[0]);
                 //printf("current: Memory address of batteries: %p\n", &batteries[0]);
+            } else if (channel == 2) {
+
+                int16_t raw_adc_voltage = adc_hal.read_raw(slot, &adc_params);
+                batteries[slot].voltage =
+                    adc_hal.convert_voltage(raw_adc_voltage, &adc_params); 
+                adc_state = ADC_STATE_DONE;
+                printf("[ADC] Ch3 Voltage in slot %d is %d mV.\n", slot, batteries[slot].voltage);
+                //printf("voltage: Memory address of batteries: %p\n", &batteries[0].voltage);
+
             }
             }
             break;
             break;
         default:
         default:

+ 28 - 50
src/peripherals/adc/adc_hal.c

@@ -54,13 +54,6 @@ D15.
 #include "ti_msp_dl_config.h"
 #include "ti_msp_dl_config.h"
 #include <stdio.h>
 #include <stdio.h>
 
 
-volatile bool gRxComplete;
-volatile bool gTxComplete;
-uint8_t gTxPacket[I2C_TX_MAX_PACKET_SIZE];
-uint8_t gRxPacket[I2C_RX_MAX_PACKET_SIZE];
-uint8_t gTxADClen, gTxADCcount;
-uint8_t gRxADClen, gRxADCcount;
-
 /*
 /*
 * Creating Configuartion Register as mentioned in the datasheet: https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/22226a.pdf
 * Creating Configuartion Register as mentioned in the datasheet: https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/22226a.pdf
 * Under section 5.2 Configuration Register
 * Under section 5.2 Configuration Register
@@ -116,31 +109,24 @@ static uint8_t construct_config_byte(ADC_Params *params) {
  * I2C*/
  * I2C*/
 
 
 static bool adc_configure(uint8_t slot_id, ADC_Params *params) {
 static bool adc_configure(uint8_t slot_id, ADC_Params *params) {
-  /*printf("Configuring for channel: %d\n", params->channel);
-  printf("Configuring for resolution: %d\n", params->resolution);
-  printf("Configuring for gain: %d\n", params->gain); 
-  printf("Continuous or Single: %d\n", params->continuous);
-  */
-  uint8_t config_byte = construct_config_byte(params);
-  printf("Config Byte: 0x%02X\n", config_byte);
+  controllerTxPackage.packet[0] = construct_config_byte(params);
+  printf("Config Byte: 0x%02X\n", controllerTxPackage.packet[0]);
   // Wait for I2C Bus to be Free**
   // Wait for I2C Bus to be Free**
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
   while (DL_I2C_getControllerStatus(I2C_controller_INST) &
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
          DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
     ;
     ;
-  if(config_byte == 0xFF){
+  if(controllerTxPackage.packet[0] == 0xFF){
     printf("[ADC] Unable to send config bytes\n");
     printf("[ADC] Unable to send config bytes\n");
     return false;
     return false;
   } 
   } 
-  // Prepare TX Buffer:
-  gTxPacket[0] = config_byte;
-  gTxADClen = 1;
-  gTxADCcount = 0;
-  gTxComplete = false;
-  i2c_hal.write(ADC_TARGET_BASE_ADDRESS, gTxPacket, gTxADClen);
-  while(!gTxComplete);
-  printf("ADC Config:: gTxADClen: %d, gTxADCcount: %d\n", gTxADClen, gTxADCcount);
+  // Prepare TX Buffer
+  controllerTxPackage.len = 1;
+  controllerTxPackage.count = 0;
+  controllerTxPackage.complete = false;
+  i2c_hal.write(ADC_TARGET_BASE_ADDRESS);
+  
+  while(!controllerTxPackage.complete);
   return true;
   return true;
-  //return i2c_hal.write(ADC_TARGET_BASE_ADDRESS + slot_id, &config_byte, 1);
 }
 }
 
 
 
 
@@ -157,22 +143,18 @@ Conversion mode, writing this bit to “1” initiates a new conversion.
 
 
 static bool adc_is_ready(uint8_t slot_id, ADC_Params *params) {
 static bool adc_is_ready(uint8_t slot_id, ADC_Params *params) {
   uint8_t adc_address = ADC_TARGET_BASE_ADDRESS + slot_id;
   uint8_t adc_address = ADC_TARGET_BASE_ADDRESS + slot_id;
-  gRxADClen = 3;
-  gRxADCcount = 0;
-  gRxComplete = false;
+  controllerRxPackage.len = 3;
+  controllerRxPackage.count = 0;
+  controllerRxPackage.complete = false;
 
 
-  gRxPacket[0] = 0;
-  gRxPacket[1] = 0;
-  gRxPacket[2] = 0;
-
-  i2c_hal.read(adc_address, gRxADClen);
+  i2c_hal.read(adc_address);
   //i2c_hal.read(ADC_TARGET_BASE_ADDRESS + slot_id, 3);
   //i2c_hal.read(ADC_TARGET_BASE_ADDRESS + slot_id, 3);
   // Ready bit is bit 7
   // Ready bit is bit 7
-  while(!gRxComplete);
-  uint8_t config_adc_byte = gRxPacket[2];
+  while(!controllerRxPackage.complete);
+  uint8_t config_adc_byte = controllerRxPackage.packet[2];
   bool ready = (config_adc_byte & 0x80) == 1;
   bool ready = (config_adc_byte & 0x80) == 1;
-  printf("Bytes: 0x%02X 0x%02X 0x%02X (%d %d %d)\n", gRxPacket[0], gRxPacket[1],  gRxPacket[2], gRxPacket[0], gRxPacket[1],  gRxPacket[2]);
-  printf("ADC Ready:: gRxADClen: %d, gRxADCcount: %d ready? %d\n", gRxADClen, gRxADCcount, ready);
+  printf("Bytes: 0x%02X 0x%02X 0x%02X (%d %d %d)\n", controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2], controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2]);
+  printf("ADC Ready:: gRxADClen: %d, gRxADCcount: %d ready? %d\n", controllerRxPackage.len, controllerRxPackage.count, ready);
   return ready;
   return ready;
 }
 }
 
 
@@ -182,21 +164,17 @@ static int16_t read_adc_raw_data(uint8_t slot_id, ADC_Params *params) {
   // Buffer for ADC data (MSB, LSB, Config Byte)
   // Buffer for ADC data (MSB, LSB, Config Byte)
   int16_t raw_adc = 0;
   int16_t raw_adc = 0;
 
 
-  gRxADClen = 3;
-  gRxADCcount = 0;
-  gRxComplete = false;
-
-  gRxPacket[0] = 0;
-  gRxPacket[1] = 0;
-  gRxPacket[2] = 0;
+  controllerRxPackage.len = 3;
+  controllerRxPackage.count = 0;
+  controllerRxPackage.complete = false;
   
   
-  i2c_hal.read(ADC_TARGET_BASE_ADDRESS + slot_id, gRxADClen);
-  while(!gRxComplete);
-  printf("ADC Read:: gRxADClen: %d, gRxADCcount: %d\n", gRxADClen, gRxADCcount);
-  printf("Bytes: 0x%02X 0x%02X 0x%02X (%d %d %d)\n", gRxPacket[0], gRxPacket[1],  gRxPacket[2], gRxPacket[0], gRxPacket[1],  gRxPacket[2]);
-  uint8_t msb = gRxPacket[0];
-  uint8_t lsb = gRxPacket[1];
-  uint8_t config_adc_byte = gRxPacket[2];
+  i2c_hal.read(ADC_TARGET_BASE_ADDRESS + slot_id);
+  while(!controllerRxPackage.complete);
+  printf("ADC Read:: gRxADClen: %d, gRxADCcount: %d\n", controllerRxPackage.len, controllerRxPackage.count);
+  printf("Bytes: 0x%02X 0x%02X 0x%02X (%d %d %d)\n", controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2], controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2]);
+  uint8_t msb = controllerRxPackage.packet[0];
+  uint8_t lsb = controllerRxPackage.packet[1];
+  uint8_t config_adc_byte = controllerRxPackage.packet[2];
 
 
   if (params->resolution == 12) {
   if (params->resolution == 12) {
     raw_adc = ((msb & 0b00001111) << 8) | lsb;
     raw_adc = ((msb & 0b00001111) << 8) | lsb;

+ 0 - 15
src/peripherals/adc/adc_interface.h

@@ -7,21 +7,6 @@
 #define ADC_TARGET_BASE_ADDRESS (0x68)
 #define ADC_TARGET_BASE_ADDRESS (0x68)
 #define ADC_VREF_MV (2048)
 #define ADC_VREF_MV (2048)
 
 
-//Maximum packet sizes
-#define I2C_TX_MAX_PACKET_SIZE (4)  
-#define I2C_RX_MAX_PACKET_SIZE (4)  
-
-//Flag for READ and WRITE
-extern volatile bool gRxComplete;
-extern volatile bool gTxComplete;
-extern uint8_t gTxPacket[I2C_TX_MAX_PACKET_SIZE];
-extern uint8_t gRxPacket[I2C_RX_MAX_PACKET_SIZE];
-
-/*Counters for Tx and Rx length and bytes sent*/
-/*Reduced variable size for ADC count and len*/
-extern uint8_t gTxADClen, gTxADCcount;
-extern uint8_t gRxADClen, gRxADCcount;
-
 typedef struct {
 typedef struct {
     uint8_t channel;
     uint8_t channel;
     uint8_t resolution;
     uint8_t resolution;

+ 3 - 1
src/peripherals/dac/dac.c

@@ -47,8 +47,10 @@ bool DAC_SingleWrite(uint16_t channel_value) {
            output_buffer_SingleWrite[1],
            output_buffer_SingleWrite[1],
            output_buffer_SingleWrite[2]);
            output_buffer_SingleWrite[2]);
 
 
+
+  // @TODO FIXME to right global variables!!
   // Write data to DAC
   // Write data to DAC
-  if (!i2c_hal.write(DAC_TARGET_BASE_ADDRESS, output_buffer_SingleWrite, data_length)) {
+  if (!i2c_hal.write(DAC_TARGET_BASE_ADDRESS)) {
         printf("I2C DAC Write Error: Failed to write to DAC.\n");
         printf("I2C DAC Write Error: Failed to write to DAC.\n");
         return false;
         return false;
     }
     }