Bläddra i källkod

DAC Fast Write mode in working state

namrota ghosh 9 månader sedan
förälder
incheckning
6e08464a0c

BIN
charge_controller_v7/Debug/.clangd/.cache/clangd/index/i2c_controller.c.D084D0AF1C0F98F4.idx


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 417 - 487
charge_controller_v7/Debug/charge_controller_v7.map


BIN
charge_controller_v7/Debug/charge_controller_v7.out


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 605 - 987
charge_controller_v7/Debug/charge_controller_v7_linkInfo.xml


BIN
charge_controller_v7/Debug/i2c_controller.o


+ 40 - 35
charge_controller_v7/i2c_controller.c

@@ -497,8 +497,22 @@ Byte 2: low byte of DAC
     return true;
 }*/
 
-/**Function for FAST write command, sending values over I2c to every channel of DAC**/
+//The device updates all DAC analog output(vout) at the same time
+
+void update_DAC_Output() {
+    uint8_t general_call_command = 0x08;  // General Call Update Command
+    while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
+    DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &general_call_command, 1);
 
+    // Start I2C transaction
+    DL_I2C_startControllerTransfer(I2C_controller_INST, 0x00, DL_I2C_CONTROLLER_DIRECTION_TX, 1);
+    
+    while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
+
+    printf("DAC Outputs Updated via General Call Software Update!\n");
+}
+
+/**Function for FAST write command, sending values over I2c to every channel of DAC**/
 bool fastWrite(uint16_t channel_a_value){
 
     /*DAC has a 12 bit resolution that ranges from 0 to 4095.
@@ -529,18 +543,20 @@ bool fastWrite(uint16_t channel_a_value){
     // **Wait for I2C Bus to be Free**
     while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
 
+
+    
+
     // **Start I2C Write Transaction**
     DL_I2C_startControllerTransfer(I2C_controller_INST, DEF_TARGET_ADDR_DAC, DL_I2C_CONTROLLER_DIRECTION_TX, 8);
 
-    // **Step 4: Load Configuration Byte into TX FIFO**
-    for (uint8_t i=0; i < 8; i++){
-        DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &output_buffer[i], 1);
+    // **Load Configuration Byte into TX FIFO**
+    DL_I2C_fillControllerTXFIFO(I2C_controller_INST, (uint8_t*)&output_buffer, 8);
 
-    }
 
     // **Ensure STOP Condition is Sent**
     while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
     printf("DAC Fast write Successful!\n");
+    update_DAC_Output();
     return true;
 
 }
@@ -583,19 +599,7 @@ bool fastWrite(uint16_t channel_a_value){
     printf("MCP4728 Registers Read Successfully!\n");
 }
 */
-//The device updates all DAC analog output(vout) at the same time
-
-/*void update_DAC_Output() {
-    uint8_t general_call_command = 0x08;  // General Call Update Command
 
-    // Start I2C transaction
-    DL_I2C_startControllerTransfer(I2C_controller_INST, DEF_TARGET_ADDR_DAC, DL_I2C_CONTROLLER_DIRECTION_TX, 1);
-    DL_I2C_fillControllerTXFIFO(I2C_controller_INST, &general_call_command, 1);
-    
-    while (DL_I2C_getControllerStatus(I2C_controller_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS);
-
-    printf("DAC Outputs Updated via General Call Software Update!\n");
-}*/
 
 /*
 DAC Function: 
@@ -703,7 +707,7 @@ int main(void)
     // **Step 2: Select ADC Channel via Multiplexer**
     printf("Selecting Multiplexer Channel...\n");
     Multiplexer_SelectChannel(ADC_I2C_CHANNEL);
-    I2C_scanBus();
+    //I2C_scanBus();
     // **Step 3: Enable I2C Interrupts**
     //NVIC_EnableIRQ(I2C_controller_INST_INT_IRQN);
     //NVIC_EnableIRQ(I2C_target_INST_INT_IRQN);
@@ -722,14 +726,14 @@ int main(void)
     printf("Configuring ADC...\n");
 
     //**Set Configuration Register for ADC**
-    SetConfiguration(channel, resolution, continuous, gain);  // CH1, 16-bit, Continuous mode, Gain x1
+    //SetConfiguration(channel, resolution, continuous, gain);  // CH1, 16-bit, Continuous mode, Gain x1
 
     while (1)
     {
         // Read ADC Value and DAC values:
-        int16_t adc_value = Read_ADC_Data(resolution);
-        Convert_ADC_To_Voltage(adc_value, resolution, gain); 
-        delay_cycles(10000); 
+        //int16_t adc_value = Read_ADC_Data(resolution);
+        //Convert_ADC_To_Voltage(adc_value, resolution, gain); 
+        //delay_cycles(10000); 
         fastWrite(3300);
 
         //Add Delay for Next Conversion**
@@ -824,14 +828,14 @@ void I2C_target_INST_IRQHandler(void) {
     static bool DataRx= false;
     static uint16_t registerAddress=0;
 
-    printf("I2C Interrupt Triggered to MCU (TARGET)!\n");
+    //printf("I2C Interrupt Triggered to MCU (TARGET)!\n");
 
     uint32_t status = DL_I2C_getPendingInterrupt(I2C_target_INST);
     switch (status) {
 
         /* START condition detected */
         case DL_I2C_IIDX_TARGET_START:
-            printf("START condition detected.\n");
+            //printf("START condition detected.\n");
             gTxCount= 0;
             gRxCount= 0;
             DataRx= false;
@@ -840,14 +844,14 @@ void I2C_target_INST_IRQHandler(void) {
 
         /* STOP condition detected */
         case DL_I2C_IIDX_TARGET_STOP:
-            printf("STOP condition detected.\n");
+            //printf("STOP condition detected.\n");
             if (DataRx == true){
-                printf("Data received from Pi: ");
+                //printf("Data received from Pi: ");
                 for (uint8_t i = 0; i < gRxCount; i++) {
-                    printf("0x%02X ", gRxBuffer[i]);
+                    //printf("0x%02X ", gRxBuffer[i]);
 
                 }
-                printf("\n");
+                //printf("\n");
                 DataRx= false;
             }
             DL_I2C_flushTargetTXFIFO(I2C_target_INST);
@@ -855,13 +859,14 @@ void I2C_target_INST_IRQHandler(void) {
 
         /* RX FIFO trigger (Pi is writing data to MCU) */
         case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER:
-            printf("receiving data from Pi.\n");
+            //printf("receiving data from Pi.\n");
             DataRx= true;
             while (!DL_I2C_isTargetRXFIFOEmpty(I2C_target_INST)) {
                 if (gRxCount == 0) {
                     // First byte received is the register address
                     registerAddress = DL_I2C_receiveTargetData(I2C_target_INST);
-                    printf("Register Address Set: 0x%02X\n", registerAddress);
+                    DL_I2C_flushTargetTXFIFO(I2C_target_INST);
+                    //printf("Register Address Set: 0x%02X\n", registerAddress);
                 } 
                 else if (registerAddress < REGISTER_SIZE) {
                     //Storing the received data from the controller correctly
@@ -880,16 +885,16 @@ void I2C_target_INST_IRQHandler(void) {
 
          /* TX FIFO trigger (Pi is reading data from MCU) */
         case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER:
-            printf("transmitting data to Pi...\n");
-            if (!DL_I2C_isTargetTXFIFOFull(I2C_target_INST)) {
+            //printf("transmitting data to Pi...\n");
+            if(!DL_I2C_isTargetTXFIFOFull(I2C_target_INST)) {
 
                 if (registerAddress < REGISTER_SIZE) {
                     //DL_I2C_fillTargetTXFIFO(I2C_0_INST, &gTxBuffer[gTxCount], 1);
                     // Retrieve stored value from the correct register
                     uint8_t value = registers[registerAddress];
-                    uint8_t value_test[2] = { 0x01, 0x03 };
-                    DL_I2C_fillTargetTXFIFO(I2C_target_INST, &value_test[0], 2);
-                    printf("Sending to 0x%02X: 0x%02X\n", registerAddress, value);  // Debugging
+                    //uint8_t value_test[2] = { 0x01, 0x03 };
+                    DL_I2C_fillTargetTXFIFO(I2C_target_INST, &value, 1);
+                    //printf("Sending to 0x%02X: 0x%02X\n", registerAddress, value);  // Debugging
                 } else {
                     // **Fix: Avoid infinite while loop**
                     printf("WARNING: TX Buffer Underflow! Sending default value.\n");

Vissa filer visades inte eftersom för många filer har ändrats