Example program for EVAL-CN0535-FMCZ

Dependencies:   platform_drivers AD77681

Revision:
1:f3b5e79a8488
Parent:
0:ae894be1131f
Child:
2:998f1de78dae
--- a/main.cpp	Thu Mar 04 15:34:19 2021 +0000
+++ b/main.cpp	Mon Mar 15 07:12:29 2021 +0000
@@ -1,75 +1,1536 @@
-/* Copyright (c) 2019 Analog Devices, Inc.  All rights reserved.
+#include "mbed.h"
+#include "main.h"
+#include "app_config.h"
+#include "cn0535_init_params.h"
+#define CRC_DEBUG
+
+// Descriptor of the main device - the ADC AD7768-1
+ad77681_dev *device;
+// Descriptor of the  ADC AD7768-1 Status
+ad77681_status_registers *current_status;
+// Structure carying measured data, sampled by the ADC
+adc_data measured_data;
+
+
+// Initialize the serial object with TX and RX pins
+Serial pc(USBTX, USBRX);
+// Initialize the drdy pin as interrupt input
+InterruptIn drdy(DRDY_PIN, PullNone);
+// Initialize the adc_rst_pin pin as digital output
+DigitalOut adc_rst(ADC_RST_PIN);
+// Initialize the interrupt event variable
+volatile bool int_event= false;
+
+
+/*
+ * ADC data recteption interrupt from DRDY
+ *
+ * Data reception from the ADC using interrupt generated by the ADC's DRDY (Data Ready) pin
+ * Interrupt triggers falling edge of the active-high DRDY pulse
+ * DRDY pulse is generated by the ADC and frequency of the DRDY pulse depends on the ADC settings:
+ *
+ * DRDY frequency = MCLK / ( MCLK_DIV * FILTER_OSR )
+ *
+ */
+void drdy_interrupt()
+{
+    int_event = true;
+
+    if (measured_data.count == measured_data.samples) { // Desired numer of samples has been taken, set everything back
+        drdy.disable_irq();                             // Disable interrupt on DRDY pin
+        measured_data.finish = true;                    // Desired number of samples has been taken
+        measured_data.count = 0;                        // Set measured data counter to 0
+    }
+}
+
+
+int main()
+{
+    int32_t connected = FAILURE;
+    uint32_t menu;
+
+    adc_hard_reset();                                                   // Perform hard reset thru GPIO
+    connected = ad77681_setup(&device, init_params, &current_status);   // SETUP and check connection
+
+    if(connected == FAILURE)
+        go_to_error();
+
+    adc_gpio_init();    // Initilized SDP-K1 GPIOS
+    print_title();
+    print_prompt();
+
+//============ MAIN WHILE ====================
+    while(1) {
+        if (pc.readable()) {                                // Settings menu SWITCH
+            getUserInput(&menu);
+
+            switch (menu) {
 
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-  - Redistributions of source code must retain the above copyright notice, 
-  this list of conditions and the following disclaimer.
-  - Redistributions in binary form must reproduce the above copyright notice, 
-  this list of conditions and the following disclaimer in the documentation 
-  and/or other materials provided with the distribution.  
-  - Modified versions of the software must be conspicuously marked as such.
-  - This software is licensed solely and exclusively for use with processors/products 
-  manufactured by or for Analog Devices, Inc.
-  - This software may not be combined or merged with other code in any manner 
-  that would cause the software to become subject to terms and conditions which 
-  differ from those listed here.
-  - Neither the name of Analog Devices, Inc. nor the names of its contributors 
-  may be used to endorse or promote products derived from this software without 
-  specific prior written permission.
-  - The use of this software may or may not infringe the patent rights of one or 
-  more patent holders.  This license does not release you from the requirement 
-  that you obtain separate licenses from these patent holders to use this software.
+            case 1:
+                menu_1_set_pgia_gain_mode();                // Set PGIA gain or mode
+                break;
+            case 2:
+                menu_2_set_fda_powermode();                 // Set FDA power mode
+                break;
+            case 3:
+                menu_3_set_ad77681_powermode();             // Set FDA power mode
+                break;
+            case 4:
+                menu_4_set_ad77681_clock_divider();         // Set FDA power mode
+                break;
+            case 5:
+                menu_5_set_ad77681_filter_type();           // Set ad7768-1 filter type
+                break;
+            case 6:
+                menu_6_ad77681_AIN_buffers_controll();      // Set ad7768-1 AIN buffers
+                break;
+            case 7:
+                menu_7_ad77681_REF_buffers_controll();      // Set ad7768-1 REF buffers
+                break;
+            case 8:
+                menu_8_set_ad77681_vcm_setup();             // Set ad7768-1 VCM
+                break;
+            case 9:
+                menu_9_set_ad77681_data_output_mode();      // Set ad7768-1 Data output mode
+                break;
+            case 10:
+                menu_10_set_ad77681_diagnostic_mode();      // Set ad7768-1 Diagnostic mode
+                break;
+            case 11:
+                menu_11_set_ad77681_gains_offsets();        // Set ad7768-1 gain and offset
+                break;
+            case 12:
+                menu_12_ad77681_read_master_status();       // Read ad7768-1 Master status
+                break;
+            case 13:
+                menu_13_ad77681_read_register();            // Read ad7768-1 registers
+                break;
+            case 14:
+                menu_14_read_ad77681_single_conv_data();    // Read ad7768-1 single convertion data
+                break;
+            case 15:
+                menu_15_read_ad77681_continuous_data();     // Read ad7768-1 continuous read data
+                break;
+            case 16:
+                menu_16_print_ad77681_continuos_read_data();// Print ad7768-1 continuous read data
+                break;
+            case 17:
+                menu_17_ad77681_check_scratchpad();         // Perform ad7768-1 scratch pad check
+                break;
+            case 18:
+                menu_18_reset_ad77681_ADC();                // Reset ad7768-1
+                break;
+            case 19:
+                menu_19_set_default_settings();             // Set Board defaul settings
+                break;
+            case 20:
+                menu_20_mclk_vref();                        // Set ad7768-1 MCLK and Vref Values
+                break;
+            default:
+                pc.printf("Invalid option");                // Invalid Option
+                print_prompt();
+                break;
+            }
+        }
+    }
+}
 
-THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND 
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, 
-TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 
-NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES 
-(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL 
-PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 
-OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/**
+ * Error warning, in case of unsuccessfull SPI connection
+ *
+ */
+void static go_to_error()
+{
+    int32_t connected = FAILURE;
+
+    while (1) {
+        pc.printf("ERROR: NOT CONNECTED\nCHECK YOUR PHYSICAL CONNECTION\n\n");  // When not connected, keep showing error message
+        wait(5);
+
+        connected = ad77681_setup(&device, init_params, &current_status);       // Keep trying to connect
+        if (connected == SUCCESS) {
+            pc.printf("SUCCESSFULLY RECONNECTED\n\n");                          // If successfull reading from scratchpad, init the ADC and go back
+            break;
+        }
+    }
+}
 
-2019-01-10-7CBSD SLA
-*/
+/**
+ * Print title
+ *
+ */
+void static print_title()
+{
+    pc.printf("\n\r");
+    pc.printf("****************************************************************\n");
+    pc.printf("*           CN0535 Demonstration Program -- (mbed)             *\n");
+    pc.printf("*                                                              *\n");
+    pc.printf("* This program demonstrates Universal Measurement Platform     *\n");
+    pc.printf("* using the AD7768-1 Precision 24-bit sigma-delta AD converter *\n");
+    pc.printf("*                                                              *\n");
+    pc.printf("* Set the baud rate to 115200 select the newline terminator.   *\n");
+    pc.printf("****************************************************************\n");
+}
+
+/**
+ * Print main menu to console
+ *
+ */
+void static print_prompt()
+{
+    pc.printf("\n\nCommand Summary:\n\n");
+    pc.printf("  1  - Set LTC6373 PGIA Gain/Mode\n");
+    pc.printf("  2  - Set ADA4945 FDA Power Mode\n");
+    pc.printf("  3  - Set AD7768-1 power mode\n");
+    pc.printf("  4  - Set AD7768-1 MCLK clock divider\n");
+    pc.printf("  5  - Set AD7768-1 filter type\n");
+    pc.printf("  6  - Set AD7768-1 AIN buffers\n");
+    pc.printf("  7  - Set AD7768-1 REF buffers\n");
+    pc.printf("  8  - Set AD7768-1 VCM output\n");
+    pc.printf("  9  - Set AD7768-1 data output mode\n");
+    pc.printf("  10 - Set AD7768-1 diagnostic mode\n");
+    pc.printf("  11 - Set AD7768-1 Gains and Offsets\n");
+    pc.printf("  12 - Read AD7768-1 master status\n");
+    pc.printf("  13 - Read AD7768-1 desired register\n");
+    pc.printf("  14 - Read AD7768-1 data register\n");
+    pc.printf("  15 - Read AD7768-1 continuous mode data\n");
+    pc.printf("  16 - Print AD7768-1 Continuous mode measured data\n");
+    pc.printf("  17 - AD7768-1 Scratchpad Check \n");
+    pc.printf("  18 - Reset AD7768-1 ADC\n");
+    pc.printf("  19 - Set to Board Default Config\n");
+    pc.printf("  20 - Update Vref and MCLK values\n");
+    pc.printf("\n\r");
+}
 
-#include "mbed.h"
+/**
+ * Set LTC6373 PGIA Gain or Mode
+ *
+ */
+void static menu_1_set_pgia_gain_mode(void)
+{
+    uint32_t new_pgia_gain;
+    uint8_t value;
 
-// LED Blinking rate in milliseconds (Note: need to define the unit of a time duration i.e. seconds(s) or milliseconds(ms))
-#define SLEEP_TIME                  500ms
+    pc.printf(" Avaliable LT6373 PGIA Gains and Mode: \n");
+    pc.printf("  1 - Shutdown\n");
+    pc.printf("  2 - 0.25V/V\n");
+    pc.printf("  3 - 0.50V/V\n");
+    pc.printf("  4 - 1V/V\n");
+    pc.printf("  5 - 2V/V\n");
+    pc.printf("  6 - 4V/V\n");
+    pc.printf("  7 - 8V/V\n");
+    pc.printf("  8 - 16V/V\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_pgia_gain);
+    pc.putc('\n');
+
+    switch (new_pgia_gain) {
 
-// Initialise the digital pin that controls LED1
-DigitalOut led(LED1);
-// Initialise the serial object with TX and RX pins
-static BufferedSerial  serial_port(USBTX, USBRX);
-
-// The File handler is needed to allow printf commands to write to the terminal
-FileHandle *mbed::mbed_override_console(int fd)
-{
-    return &serial_port;
+    case 1:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 7;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA Shutdown selected\n");
+        break;
+    case 2:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 6;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 0.25V/V selected\n");
+        break;
+    case 3:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 5;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 0.5V/V selected\n");
+        break;
+    case 4:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 4;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 1V/V selected\n");
+        break;
+    case 5:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 3;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 2V/V selected\n");
+        break;
+    case 6:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 2;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 4V/V selected\n");
+        break;
+    case 7:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 1;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 8V/V selected\n");
+        break;
+    case 8:
+        ad77681_spi_read_mask(device, AD77681_REG_GPIO_WRITE, AD77681_GPIO_WRITE_3_MSK, &value);
+        value |= 0;
+        ad77681_gpio_write(device,value, AD77681_ALL_GPIOS);
+        pc.printf(" PGIA gain: 16V/V selected\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
 }
 
-// main() runs in its own thread in the OS
-int main()
+/**
+ * Set ADA4945 FDA Mode
+ *
+ */
+void static menu_2_set_fda_powermode(void)
+{
+    uint32_t new_fda_powermode;
+    uint8_t value;
+
+    pc.printf(" Avaliable LT6373 PGIA Gains and Mode: \n");
+    pc.printf("  1 - Full Power Mode\n");
+    pc.printf("  2 - Low Power Moden");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_fda_powermode);
+    pc.putc('\n');
+
+    switch (new_fda_powermode) {
+
+    case 1:
+        value = 1;
+        ad77681_gpio_write(device,value, AD77681_GPIO3);
+        pc.printf(" FDA Full Power Mode selected\n");
+        break;
+    case 2:
+        value = 0;
+        ad77681_gpio_write(device,value, AD77681_GPIO3);
+        pc.printf(" FDA Low Power Mode selected\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Set AD7768-1 power mode
+ *
+ */
+void static menu_3_set_ad77681_powermode(void)
+{
+    uint32_t new_ad77681_pwr_mode;
+
+    pc.printf(" Avaliable AD7768-1 power modes: \n");
+    pc.printf("  1 - Low power mode\n");
+    pc.printf("  2 - Median power mode\n");
+    pc.printf("  3 - Fast power mode\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_ad77681_pwr_mode);
+    pc.putc('\n');
+
+    switch (new_ad77681_pwr_mode) {
+
+    case 1:
+        ad77681_set_power_mode(device, AD77681_ECO);
+        pc.printf(" AD7768-1 Low power mode selected\n");
+        break;
+    case 2:
+        ad77681_set_power_mode(device, AD77681_MEDIAN);
+        pc.printf(" AD7768-1 Median power mode selected\n");
+        break;
+    case 3:
+        ad77681_set_power_mode(device, AD77681_FAST);
+        pc.printf(" AD7768-1 Fast power mode selected\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Set AD7768-1 clock divider
+ *
+ */
+void static menu_4_set_ad77681_clock_divider(void)
+{
+    uint32_t new_ad77681_mclk_div;
+
+    pc.printf(" Avaliable AD7768-1 MCLK divider options: \n");
+    pc.printf("  1 - MCLK/16\n");
+    pc.printf("  2 - MCLK/8\n");
+    pc.printf("  3 - MCLK/4\n");
+    pc.printf("  4 - MCLK/2\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_ad77681_mclk_div);
+    pc.putc('\n');
+
+    switch (new_ad77681_mclk_div) {
+
+    case 1:
+        ad77681_set_mclk_div(device, AD77681_MCLK_DIV_16);
+        pc.printf(" AD7768-1 MCLK/16 selected\n");
+        break;
+    case 2:
+        ad77681_set_mclk_div(device, AD77681_MCLK_DIV_8);
+        pc.printf(" AD7768-1 MCLK/8 selected\n");
+        break;
+    case 3:
+        ad77681_set_mclk_div(device, AD77681_MCLK_DIV_4);
+        pc.printf(" AD7768-1 MCLK/4 selected\n");
+        break;
+    case 4:
+        ad77681_set_mclk_div(device, AD77681_MCLK_DIV_2);
+        pc.printf(" AD7768-1 MCLK/2 selected\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+
+    ad77681_update_sample_rate(device);         // Update the sample rate after changing the MCLK divider
+    print_prompt();
+}
+
+/**
+ * Set filter type
+ *
+ */
+void static menu_5_set_ad77681_filter_type(void)
 {
-    // printing the Mbed OS version this example was written to the console
-    printf("This Application has been developed on Mbed OS version 6.4\r\n");
-    
-    // printing the actual Mbed OS version that this application is using to the console.
-    printf(
-        "Mbed OS version %d.%d.%d is what this applicaiton is currently using\r\n",
-        MBED_MAJOR_VERSION,
-        MBED_MINOR_VERSION,
-        MBED_PATCH_VERSION
-    );
-    
-    // The loop will toggle the LED every 500ms(SLEEP_TIME = 500ms) and print LED1s current state to the terminal
-    while (1) {
-        led = !led;          // toggle LED1 state
-        printf("LED1 state: %d \r\n", (uint8_t)led);
-        ThisThread::sleep_for(SLEEP_TIME);
+    pc.printf(" Avaliable AD7768-1 Filter Type options: \n");
+    pc.printf("  1 - SINC3 Fileter\n");
+    pc.printf("  2 - SINC5 Filter\n");
+    pc.printf("  3 - Low ripple FIR Filter\n");
+    pc.printf("  4 - SINC3 50/60Hz rejection\n");
+    pc.printf("  5 - User-defined FIR filter\n");
+    pc.printf(" Select an option: \n");
+
+    uint32_t new_filter = 0;
+    int32_t ret;
+
+    getUserInput(&new_filter);
+    pc.putc('\n');
+
+    switch (new_filter) {
+
+    case 1:
+        set_SINC3_filter();
+        break;
+    case 2:
+        set_SINC5_filter();
+        break;
+    case 3:
+        set_FIR_filter();
+        break;
+    case 4:
+        set_50HZ_rej();
+        break;
+    case 5:
+        set_user_defined_FIR();
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+
+    ad77681_update_sample_rate(device);         // Update the sample rate after changing the Filter type
+    print_prompt();
+}
+
+/**
+ * Set SINC3 filter
+ *
+ */
+void static set_SINC3_filter(void)
+{
+    uint32_t new_sinc3 = 0, new_sinc5 = 0;
+    int32_t ret;
+
+    pc.printf(" AD7768-1 SINC3 filter Oversampling ratios: \n");
+    pc.printf("  OSR is calculated as (x + 1)*32\n");
+    pc.printf("  x is SINC3 OSR register value\n");
+    pc.printf(" Please input a value from 0 to 8192 = 2^13\n  :");
+
+    ret = getUserInput(&new_sinc3);
+
+    if ((new_sinc3 >= 0) && (new_sinc3 <= 8192) && (ret == SUCCESS)) {
+        pc.printf("%d\n", new_sinc3);
+
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx32, AD77681_SINC3, new_sinc3);
+        pc.printf(" SINC3 OSR is set to %d\n", (new_sinc3 + 1) * 32);
+    } else {
+        pc.printf("%d\n", new_sinc3);
+        pc.printf(" Invalid option - too large number\n");
+    }
+}
+
+/**
+ * Set SINC5 filter
+ *
+ */
+void static set_SINC5_filter(void)
+{
+    uint32_t new_sinc5;
+
+    pc.printf(" AD7768-1 SINC5 filter Oversampling ratios: \n");
+    pc.printf("  1 - Oversampled by 8\n");
+    pc.printf("  2 - Oversampled by 16\n");
+    pc.printf("  3 - Oversampled by 32\n");
+    pc.printf("  4 - Oversampled by 64\n");
+    pc.printf("  5 - Oversampled by 128\n");
+    pc.printf("  6 - Oversampled by 256\n");
+    pc.printf("  7 - Oversampled by 512\n");
+    pc.printf("  8 - Oversampled by 1024\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_sinc5);
+    pc.putc('\n');
+
+    switch (new_sinc5) {
+    case 1:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx32, AD77681_SINC5_DECx8, 0);
+        pc.printf(" SINC5 with OSRx8 set\n");
+        break;
+    case 2:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx32, AD77681_SINC5_DECx16, 0);
+        pc.printf(" SINC5 with OSRx16 set\n");
+        break;
+    case 3:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx32, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx32 set\n");
+        break;
+    case 4:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx64, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx64 set\n");
+        break;
+    case 5:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx128, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx128 set\n");
+        break;
+    case 6:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx256, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx256 set\n");
+        break;
+    case 7:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx512, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx512 set\n");
+        break;
+    case 8:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx1024, AD77681_SINC5, 0);
+        pc.printf(" SINC5 with OSRx1024 set\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+}
+
+/**
+ * Set FIR filter
+ *
+ */
+void static set_FIR_filter(void)
+{
+    uint32_t new_fir;
+
+    pc.printf(" AD7768-1 FIR filter Oversampling ratios: \n");
+    pc.printf("  1 - Oversampled by 32\n");
+    pc.printf("  2 - Oversampled by 64\n");
+    pc.printf("  3 - Oversampled by 128\n");
+    pc.printf("  4 - Oversampled by 256\n");
+    pc.printf("  5 - Oversampled by 512\n");
+    pc.printf("  6 - Oversampled by 1024\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_fir);
+    pc.putc('\n');
+
+    switch (new_fir) {
+    case 1:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx32, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx32 set\n");
+        break;
+    case 2:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx64, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx64 set\n");
+        break;
+    case 3:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx128, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx128 set\n");
+        break;
+    case 4:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx256, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx256 set\n");
+        break;
+    case 5:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx512, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx512 set\n");
+        break;
+    case 6:
+        ad77681_set_filter_type(device, AD77681_SINC5_FIR_DECx1024, AD77681_FIR, 0);
+        pc.printf(" FIR with OSRx1024 set\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+}
+
+/**
+ * Set 50HZ rejection bit when SINC3 is being used
+ *
+ */
+void static set_50HZ_rej(void)
+{
+    uint32_t new_50Hz;
+
+    pc.printf(" AD7768-1 SINC3 50/60Hz rejection: \n");
+    pc.printf("  1 - 50/60Hz rejection enable \n");
+    pc.printf("  2 - 50/60Hz rejection disable \n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_50Hz);
+    pc.putc('\n');
+
+    switch (new_50Hz) {
+    case 1:
+        ad77681_set_50HZ_rejection(device, ENABLE);
+        pc.printf(" SINC3 50/60Hz rejection enabled\n");
+        break;
+    case 2:
+        ad77681_set_50HZ_rejection(device, DISABLE);
+        pc.printf(" SINC3 50/60Hz rejection disabled\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
     }
 }
 
+/**
+ * Insert user-defined FIR filter coeffs
+ *
+ */
+void static set_user_defined_FIR(void)
+{
+    const uint8_t coeff_reg_length = 56;        // Maximum allowed number of coefficients in the coeff register
+
+    pc.printf(" AD7768-1 User Defined FIR filter\n");
+
+    if ((ARRAY_SIZE(programmable_FIR) <= coeff_reg_length) && (count_of_active_coeffs <= coeff_reg_length)) {
+        pc.printf("  Aplying user-defined FIR filter coefficients from 'cn0535_init_params.h' programmable_FIR[56] \n");
+        ad77681_programmable_filter(device, programmable_FIR, count_of_active_coeffs);
+        pc.printf("  Coeffs inserted successfully\n");
+    } else
+        pc.printf("  Incorrect count of coefficients in 'cn0535_init_params.h' programmable_FIR[56]\n");
+}
+
+/**
+ * AIN and REF buffers controll
+ *
+ */
+void static menu_6_ad77681_AIN_buffers_controll(void)
+{
+    uint32_t new_AD77681_REF_buffer = 0;
+
+    pc.printf(" AD7768-1 Analog IN precharge buffers settings: \n");
+    pc.printf("  1 - Turn ON  both precharge buffers\n");
+    pc.printf("  2 - Turn OFF both precharge buffers\n");
+    pc.printf("  3 - Turn ON  AIN- precharge buffer\n");
+    pc.printf("  4 - Turn OFF AIN- precharge buffer\n");
+    pc.printf("  5 - Turn ON  AIN+ precharge buffer\n");
+    pc.printf("  6 - Turn OFF AIN+ precharge buffer\n");
+    pc.printf(" Select an option: \n");
+
+
+    getUserInput(&new_AD77681_REF_buffer);
+    pc.putc('\n');
+
+    switch (new_AD77681_REF_buffer) {
+    case 1:
+        ad77681_set_AINn_buffer(device, AD77681_AINn_ENABLED);
+        ad77681_set_AINp_buffer(device, AD77681_AINp_ENABLED);
+        pc.printf(" AIN+ and AIN- enabled\n");
+        break;
+    case 2:
+        ad77681_set_AINn_buffer(device, AD77681_AINn_DISABLED);
+        ad77681_set_AINp_buffer(device, AD77681_AINp_DISABLED);
+        pc.printf(" AIN+ and AIN- disabled\n");
+        break;
+    case 3:
+        ad77681_set_AINn_buffer(device, AD77681_AINn_ENABLED);
+        pc.printf(" AIN- Enabled\n");
+        break;
+    case 4:
+        ad77681_set_AINn_buffer(device, AD77681_AINn_DISABLED);
+        pc.printf(" AIN- Disabled\n");
+        break;
+    case 5:
+        ad77681_set_AINp_buffer(device, AD77681_AINp_ENABLED);
+        pc.printf(" AIN+ Enabled\n");
+        break;
+    case 6:
+        ad77681_set_AINp_buffer(device, AD77681_AINp_DISABLED);
+        pc.printf(" AIN+ Disabled\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * AIN and REF buffers controll
+ *
+ */
+void static menu_7_ad77681_REF_buffers_controll(void)
+{
+
+    uint32_t  new_REF_buffer = 0;
+
+    pc.printf(" REF buffers settings: \n");
+    pc.printf("  1 - Full REF- reference buffer\n");
+    pc.printf("  2 - Full REF+ reference buffer\n");
+    pc.printf("  3 - Unbuffered REF- reference buffer\n");
+    pc.printf("  4 - Unbuffered REF+ reference buffer\n");
+    pc.printf("  5 - Precharge  REF- reference buffer\n");
+    pc.printf("  6 - Precharge  REF+ reference buffer\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_REF_buffer);
+    pc.putc('\n');
+
+    switch (new_REF_buffer) {
+    case 1:
+        ad77681_set_REFn_buffer(device, AD77681_BUFn_FULL_BUFFER_ON);
+        pc.printf(" Fully buffered REF-\n");
+        break;
+    case 2:
+        ad77681_set_REFp_buffer(device, AD77681_BUFp_FULL_BUFFER_ON);
+        pc.printf(" Fully buffered REF+\n");
+        break;
+    case 3:
+        ad77681_set_REFn_buffer(device, AD77681_BUFn_DISABLED);
+        pc.printf(" Unbuffered REF-\n");
+        break;
+    case 4:
+        ad77681_set_REFp_buffer(device, AD77681_BUFp_DISABLED);
+        pc.printf(" Unbuffered REF+\n");
+        break;
+    case 5:
+        ad77681_set_REFn_buffer(device, AD77681_BUFn_ENABLED);
+        pc.printf(" Precharge buffer on REF-\n");
+        break;
+    case 6:
+        ad77681_set_REFp_buffer(device, AD77681_BUFp_ENABLED);
+        pc.printf(" Precharge buffer on REF+\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+
+    }
+    print_prompt();
+}
+
+/**
+ * VCM output controll
+ *
+ */
+void static menu_8_set_ad77681_vcm_setup(void)
+{
+    uint32_t new_vcm = 0;
+
+    pc.printf(" Avaliable VCM output voltage levels: \n");
+    pc.printf("  1 - VCM = (AVDD1-AVSS)/2\n");
+    pc.printf("  2 - VCM = 2.5V\n");
+    pc.printf("  3 - VCM = 2.05V\n");
+    pc.printf("  4 - VCM = 1.9V\n");
+    pc.printf("  5 - VCM = 1.65V\n");
+    pc.printf("  6 - VCM = 1.1V\n");
+    pc.printf("  7 - VCM = 0.9V\n");
+    pc.printf("  8 - VCM off\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_vcm);
+    pc.putc('\n');
+
+    switch (new_vcm) {
+
+    case 1:
+        ad77681_set_VCM_output(device, AD77681_VCM_HALF_VCC);
+        pc.printf(" VCM set to half of the Vcc\n");
+        break;
+    case 2:
+        ad77681_set_VCM_output(device, AD77681_VCM_2_5V);
+        pc.printf(" VCM set to 2.5V\n");
+        break;
+    case 3:
+        ad77681_set_VCM_output(device, AD77681_VCM_2_05V);
+        pc.printf(" VCM set to 2.05V\n");
+        break;
+    case 4:
+        ad77681_set_VCM_output(device, AD77681_VCM_1_9V);
+        pc.printf(" VCM set to 1.9V\n");
+        break;
+    case 5:
+        ad77681_set_VCM_output(device, AD77681_VCM_1_65V);
+        pc.printf(" VCM set to 1.65V\n");
+        break;
+    case 6:
+        ad77681_set_VCM_output(device, AD77681_VCM_1_1V);
+        pc.printf(" VCM set to 1.1V\n");
+        break;
+    case 7:
+        ad77681_set_VCM_output(device, AD77681_VCM_0_9V);
+        pc.printf(" VCM set to 0.9V\n");
+        break;
+    case 8:
+        ad77681_set_VCM_output(device, AD77681_VCM_OFF);
+        pc.printf(" VCM OFF\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Set data output mode
+ *
+ */
+void static menu_9_set_ad77681_data_output_mode(void)
+{
+    uint32_t new_data_mode = 0, new_length = 0, new_status = 0, new_crc = 0;
+
+    pc.printf(" ADC data outpup modes: \n");
+    pc.printf("  1 - Continuous: waiting for DRDY\n");
+    pc.printf("  2 - Continuous one shot: waiting for SYNC_IN\n");
+    pc.printf("  3 - Single-conversion standby\n");
+    pc.printf("  4 - Periodic standby\n");
+    pc.printf("  5 - Standby mode\n");
+    pc.printf("  6 - 16bit or 24bit data format\n");
+    pc.printf("  7 - Status bit output\n");
+    pc.printf("  8 - Switch form diag mode to measure\n");
+    pc.printf("  9 - Switch form measure to diag mode\n");
+    pc.printf(" 10 - Set CRC type\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_data_mode);
+    pc.putc('\n');
+
+    switch (new_data_mode) {
+    case 1:
+        ad77681_set_conv_mode(device, AD77681_CONV_CONTINUOUS, device->diag_mux_sel, device->conv_diag_sel);         // DIAG MUX NOT SELECTED
+        pc.printf(" Continuous mode set\n");
+        break;
+    case 2:
+        ad77681_set_conv_mode(device, AD77681_CONV_ONE_SHOT, device->diag_mux_sel, device->conv_diag_sel);
+        pc.printf(" Continuous one shot conversion set\n");
+        break;
+    case 3:
+        ad77681_set_conv_mode(device, AD77681_CONV_SINGLE, device->diag_mux_sel, device->conv_diag_sel);
+        pc.printf(" Single conversion standby mode set\n");
+        break;
+    case 4:
+        ad77681_set_conv_mode(device, AD77681_CONV_PERIODIC, device->diag_mux_sel, device->conv_diag_sel);
+        pc.printf(" Periodiec standby mode set\n");
+        break;
+    case 5:
+        ad77681_set_conv_mode(device, AD77681_CONV_STANDBY, device->diag_mux_sel, device->conv_diag_sel);
+        pc.printf(" Standby mode set\n");
+        break;
+    case 6:
+        pc.printf(" Conversion length select: \n");
+        pc.printf("  1 - 24bit length\n");
+        pc.printf("  2 - 16bit length\n");
+
+        getUserInput(&new_length);
+        pc.putc('\n');
+
+        switch (new_length) {
+        case 1:
+            ad77681_set_convlen(device, AD77681_CONV_24BIT);
+            pc.printf(" 24bit data output format selected\n");
+            break;
+        case 2:
+            ad77681_set_convlen(device, AD77681_CONV_16BIT);
+            pc.printf(" 16bit data output format selected\n");
+            break;
+        default:
+            pc.printf(" Invalid option\n");
+            break;
+        }
+        break;
+    case 7:
+        pc.printf(" Status bit output: \n");
+        pc.printf("  1 - Enable status bit after each ADC conversion\n");
+        pc.printf("  2 - Disable status bit after each ADC conversion\n");
+
+        getUserInput(&new_status);
+        pc.putc('\n');
+
+        switch (new_status) {
+        case 1:
+            ad77681_set_status_bit(device, true);
+            pc.printf(" Status bit enabled\n");
+            break;
+        case 2:
+            ad77681_set_status_bit(device, false);
+            pc.printf(" Status bit disabled\n");
+            break;
+        default:
+            pc.printf(" Invalid option\n");
+            break;
+        }
+
+        break;
+    case 8:
+        ad77681_set_conv_mode(device, device->conv_mode, device->diag_mux_sel, false);      // DIAG MUX NOT SELECTED
+        pc.printf(" Measure mode selected\n");
+        break;
+    case 9:
+        ad77681_set_conv_mode(device, device->conv_mode, device->diag_mux_sel, true);       // DIAG MUX SELECTED
+        pc.printf(" Diagnostic mode selected\n");
+        break;
+    case 10:
+        pc.printf(" CRC settings \n");
+        pc.printf("  1 - Disable CRC\n");
+        pc.printf("  2 - 8-bit polynomial CRC\n");
+        pc.printf("  3 - XOR based CRC\n");
+
+        getUserInput(&new_crc);
+        pc.putc('\n');
+
+        switch (new_crc) {
+        case 1:
+            if(ad77681_set_crc_sel(device, AD77681_NO_CRC)==SUCCESS)
+                pc.printf(" CRC disabled\n");
+            else
+                pc.printf("Command Failed\n");
+            break;
+        case 2:
+            ad77681_set_crc_sel(device, AD77681_CRC);
+            pc.printf("  8-bit polynomial CRC method selected\n");
+            break;
+        case 3:
+            ad77681_set_crc_sel(device, AD77681_XOR);
+            pc.printf("  XOR based CRC method selected\n");
+            break;
+        default:
+            pc.printf(" Invalid option\n");
+            break;
+        }
+        break;
+
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Set diagnostic mode
+ *
+ */
+void static menu_10_set_ad77681_diagnostic_mode(void)
+{
+    uint32_t new_diag_mode = 0;
+
+    pc.printf(" ADC diagnostic modes: \n");
+    pc.printf("  1 - Internal temperature sensor\n");
+    pc.printf("  2 - AIN shorted\n");
+    pc.printf("  3 - Positive full-scale\n");
+    pc.printf("  4 - Negative full-scale\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_diag_mode);
+    pc.putc('\n');
+
+    switch (new_diag_mode) {
+    case 1:
+        ad77681_set_conv_mode(device, device->conv_mode, AD77681_TEMP_SENSOR, true);
+        pc.printf(" Diagnostic mode: Internal temperature sensor selected\n");
+        break;
+    case 2:
+        ad77681_set_conv_mode(device, device->conv_mode, AD77681_AIN_SHORT, true);
+        pc.printf(" Diagnostic mode: AIN shorted selected\n");
+        break;
+    case 3:
+        ad77681_set_conv_mode(device, device->conv_mode, AD77681_POSITIVE_FS, true);
+        pc.printf(" Diagnostic mode: Positive full-scale selected\n");
+        break;
+    case 4:
+        ad77681_set_conv_mode(device, device->conv_mode, AD77681_NEGATIVE_FS, true);
+        pc.printf(" Diagnostic mode: Negative full-scale selected\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Set Gains and Offsets
+ *
+ */
+void static menu_11_set_ad77681_gains_offsets(void)
+{
+    uint32_t gain_offset, ret;
+    uint32_t new_menu_select;
+
+    pc.printf(" Gains and Offsets settings: \n");
+    pc.printf("  1 - Set gain\n");
+    pc.printf("  2 - Set offset\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_menu_select);
+    pc.putc('\n');
+
+    switch (new_menu_select) {
+    case 1:
+        pc.printf(" Insert new Gain value in decimal form\n");
+        ret = getUserInput(&gain_offset);
+
+        if ((gain_offset <= 0xFFFFFF) && (ret == SUCCESS)) {
+            ad77681_apply_gain(device, gain_offset);
+            pc.printf(" Value %d has been successfully inserted to the Gain register\n", gain_offset);
+        } else
+            pc.printf(" Invalid value\n");
+        break;
+    case 2:
+        pc.printf(" Insert new Offset value in decimal form\n");
+        ret = getUserInput(&gain_offset);
+
+        if ((gain_offset <= 0xFFFFFF) && (ret == SUCCESS)) {
+            ad77681_apply_offset(device, gain_offset);
+            pc.printf(" Value %d has been successfully inserted to the Offset register\n", gain_offset);
+        } else
+            pc.printf(" Invalid value\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Read ADC status from status registers
+ *
+ */
+void static menu_12_ad77681_read_master_status(void)
+{
+    uint8_t reg_read_buf[3];
+    char binary_number[8];
+
+    ad77681_status(device, current_status);     // Read AD7768-1 Status
+    pc.putc('\n');
+    pc.printf("== MASTER STATUS REGISER\n");
+    pc.printf("Master error:          %s\n", ((current_status->master_error == 0) ? "OK" : "FAULT"));
+    pc.printf("ADC error:             %s\n", ((current_status->adc_error == 0) ? "OK" : "FAULT"));
+    pc.printf("Dig error:             %s\n", ((current_status->dig_error == 0) ? "OK" : "FAULT"));
+    pc.printf("Ext. clock:            %s\n", ((current_status->adc_err_ext_clk_qual == 0) ? "OK" : "FAULT"));
+    pc.printf("Filter saturated:      %s\n", ((current_status->adc_filt_saturated == 0) ? "OK" : "FAULT"));
+    pc.printf("Filter not settled:    %s\n", ((current_status->adc_filt_not_settled == 0) ? "OK" : "FAULT"));
+    pc.printf("SPI error:             %s\n", ((current_status->spi_error == 0) ? "OK" : "FAULT"));
+    pc.printf("POR Flag:              %s\n", ((current_status->por_flag == 0) ? "OK" : "FAULT"));
+
+    if (current_status->spi_error == 1) {
+        pc.printf("\n== SPI DIAG STATUS REGISER\n");
+        pc.printf("SPI ignore error:      %s\n", ((current_status->spi_ignore == 0) ? "OK" : "FAULT"));
+        pc.printf("SPI clock count error: %s\n", ((current_status->spi_clock_count == 0) ? "OK" : "FAULT"));
+        pc.printf("SPI read error:        %s\n", ((current_status->spi_read_error == 0) ? "OK" : "FAULT"));
+        pc.printf("SPI write error:       %s\n", ((current_status->spi_write_error == 0) ? "OK" : "FAULT"));
+        pc.printf("SPI CRC error:         %s\n", ((current_status->spi_crc_error == 0) ? "OK" : "FAULT"));
+    }
+
+    if (current_status->adc_error == 1) {
+        pc.printf("\n== ADC DIAG STATUS REGISER\n");
+        pc.printf("DLDO PSM error:        %s\n", ((current_status->dldo_psm_error == 0) ? "OK" : "FAULT"));
+        pc.printf("ALDO PSM error:        %s\n", ((current_status->aldo_psm_error == 0) ? "OK" : "FAULT"));
+        pc.printf("REF DET error:         %s\n", ((current_status->ref_det_error == 0) ? "OK" : "FAULT"));
+        pc.printf("FILT SAT error:        %s\n", ((current_status->filt_sat_error == 0) ? "OK" : "FAULT"));
+        pc.printf("FILT NOT SET error:    %s\n", ((current_status->filt_not_set_error == 0) ? "OK" : "FAULT"));
+        pc.printf("EXT CLK QUAL error:    %s\n", ((current_status->ext_clk_qual_error == 0) ? "OK" : "FAULT"));
+    }
+
+    if (current_status->dig_error == 1) {
+        pc.printf("\n== DIGITAL DIAG STATUS REGISER\n");
+        pc.printf("Memory map CRC error:  %s\n", ((current_status->memoy_map_crc_error == 0) ? "OK" : "FAULT"));
+        pc.printf("RAM CRC error:         %s\n", ((current_status->ram_crc_error == 0) ? "OK" : "FAULT"));
+        pc.printf("FUSE CRC error:        %s\n", ((current_status->fuse_crc_error == 0) ? "OK" : "FAULT"));
+    }
+
+    pc.putc('\n');
+    print_prompt();
+}
+
+/**
+ * Register read
+ *
+ */
+void static menu_13_ad77681_read_register(void)
+{
+    uint32_t new_reg_to_read = 0;
+    uint8_t reg_read_buf[3], read_adc_data[6], hex_number = 0;
+    uint8_t HI = 0, MID = 0, LO = 0;
+    char binary_number[8];
+
+    pc.printf(" Read desired register: \n");
+    pc.printf("  1 - 0x03        - Chip type\n");
+    pc.printf("  2 - 0x14        - Interface format\n");
+    pc.printf("  3 - 0x15        - Power clock\n");
+    pc.printf("  4 - 0x16        - Analog\n");
+    pc.printf("  5 - 0x17        - Analog2\n");
+    pc.printf("  6 - 0x18        - Conversion\n");
+    pc.printf("  7 - 0x19        - Digital filter\n");
+    pc.printf("  8 - 0x1A        - SINC3 Dec. rate MSB\n");
+    pc.printf("  9 - 0x1B        - SINC3 Dec. rate LSB\n");
+    pc.printf(" 10 - 0x1C        - Duty cycle ratio\n");
+    pc.printf(" 11 - 0x1D        - Sync, Reset\n");
+    pc.printf(" 12 - 0x1E        - GPIO Controll\n");
+    pc.printf(" 13 - 0x1F        - GPIO Write\n");
+    pc.printf(" 14 - 0x20        - GPIO Read\n");
+    pc.printf(" 15 - 0x21 - 0x23 - Offset register\n");
+    pc.printf(" 16 - 0x24 - 0x26 - Gain register\n");
+    pc.printf(" 17 - 0x2C        - ADC Data\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_reg_to_read);
+    pc.putc('\n');
+
+    switch (new_reg_to_read) {
+
+    case 1:
+        ad77681_spi_reg_read(device, AD77681_REG_CHIP_TYPE, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x03 - Chip type register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 2:
+        ad77681_spi_reg_read(device, AD77681_REG_INTERFACE_FORMAT, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x14 - Interface format register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 3:
+        ad77681_spi_reg_read(device, AD77681_REG_POWER_CLOCK, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x15 - Power clock register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 4:
+        ad77681_spi_reg_read(device, AD77681_REG_ANALOG, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x16 - Anlaog register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 5:
+        ad77681_spi_reg_read(device, AD77681_REG_ANALOG2, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x17 - Analog2 regster is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 6:
+        ad77681_spi_reg_read(device, AD77681_REG_CONVERSION, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x18 - Conversion register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 7:
+        ad77681_spi_reg_read(device, AD77681_REG_DIGITAL_FILTER, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x19 - Digital filter register is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 8:
+        ad77681_spi_reg_read(device, AD77681_REG_SINC3_DEC_RATE_MSB, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1A - SINC3 Dec. rate MSB is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 9:
+        ad77681_spi_reg_read(device, AD77681_REG_SINC3_DEC_RATE_LSB, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1B - SINC3 Dec. rate LSB is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 10:
+        ad77681_spi_reg_read(device, AD77681_REG_DUTY_CYCLE_RATIO, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1C - Duty cycle ratio 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 11:
+        ad77681_spi_reg_read(device, AD77681_REG_SYNC_RESET, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1D - Sync, Reset 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 12:
+        ad77681_spi_reg_read(device, AD77681_REG_GPIO_CONTROL, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1E - GPIO Controll is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 13:
+        ad77681_spi_reg_read(device, AD77681_REG_GPIO_WRITE, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x1F - GPIO Write is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 14:
+        ad77681_spi_reg_read(device, AD77681_REG_GPIO_READ, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x20 - GPIO Read is: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    case 15:
+        ad77681_spi_reg_read(device, AD77681_REG_OFFSET_HI, reg_read_buf);
+        HI = reg_read_buf[1];
+
+        ad77681_spi_reg_read(device, AD77681_REG_OFFSET_MID, reg_read_buf);
+        MID = reg_read_buf[1];
+
+        ad77681_spi_reg_read(device, AD77681_REG_OFFSET_LO, reg_read_buf);
+        LO = reg_read_buf[1];
+
+        pc.printf(" Value of 0x21 - 0x23 - Offset register is: 0x%x %x %x\n", HI, MID, LO);
+        break;
+    case 16:
+        ad77681_spi_reg_read(device, AD77681_REG_GAIN_HI, reg_read_buf);
+        HI = reg_read_buf[1];
+
+        ad77681_spi_reg_read(device, AD77681_REG_GAIN_MID, reg_read_buf);
+        MID = reg_read_buf[1];
+
+        ad77681_spi_reg_read(device, AD77681_REG_GAIN_LO, reg_read_buf);
+        LO = reg_read_buf[1];
+
+        pc.printf(" Value of 0x24 - 0x26 - Gain register is: 0x%x %x %x\n", HI, MID, LO);
+        break;
+    case 17:
+        ad77681_spi_read_adc_data(device, read_adc_data, AD77681_REGISTER_DATA_READ);
+        pc.printf(" Value of 0x2C - ADC data is: 0x%x 0x%x 0x%x\n", read_adc_data[1], read_adc_data[2], read_adc_data[3]);
+        break;
+    case 18:
+        ad77681_spi_reg_read(device, AD77681_REG_INTERFACE_FORMAT, reg_read_buf);
+        print_binary(reg_read_buf[1], binary_number);
+        pc.printf(" Value of 0x14 -REG_INTERFACE_FORMATis: 0x%x  0b%s\n", reg_read_buf[1], binary_number);
+        break;
+    default :
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Print measured data and transfered to voltage
+ *
+ */
+void static menu_14_read_ad77681_single_conv_data(void)
+{
+
+    uint8_t adc_reg[6];
+    uint32_t raw_code;
+    int32_t converted_data;
+    double voltage;
+    int32_t shifted_data;
+    char buf[15];
+
+    ad77681_spi_read_adc_data(device, adc_reg, AD77681_REGISTER_DATA_READ);
+    raw_code = (adc_reg[1] << 16) | (adc_reg[2] << 8) | (adc_reg[3] << 0);
+    // Printing Voltage
+    pc.printf("\n\nVoltage\n");
+    ad77681_data_to_voltage(device, &raw_code, &voltage);
+    sprintf(buf, "%.9f \n",voltage);
+    pc.printf(buf);
+    memset(buf, 0, sizeof(buf));//clears buffer
+    
+    // Printing Raw Code
+    pc.printf("\n\nRaw Code\n");
+    pc.printf("%d\n", raw_code);
+    
+    // Printing Shifted Code
+    pc.printf("\n\nShifted Code\n");
+    if (raw_code & 0x800000)
+        shifted_data = (int32_t)((0xFF << 24) | raw_code);
+    else
+        shifted_data = (int32_t)((0x00 << 24) | raw_code);
+    pc.printf("%d\n", shifted_data + AD7768_HALF_SCALE);
+
+    print_prompt();
+}
+
+/**
+ * Read ADC data
+ *
+ */
+void static menu_15_read_ad77681_continuous_data(void)
+{
+    uint8_t buf[6];
+    uint32_t new_sample_count = 0;
+    int32_t ret;
+
+    pc.printf(" Read Continuous ADC Data");
+    pc.printf("  Input number of samples (1 to 4096): \n");
+    ret = getUserInput(&new_sample_count);                  // Get user input
+
+    if ((new_sample_count <= 4096) && (ret == SUCCESS) ) {
+        pc.printf("\n%d of samples\n", new_sample_count);   // Print Desired Measurement Count
+        measured_data.samples = (uint16_t)(new_sample_count);
+        measured_data.finish = false;
+        measured_data.count = 0;
+        pc.printf("Sampling....\n");
+        ad77681_set_continuos_read(device, AD77681_CONTINUOUS_READ_ENABLE);
+        __enable_irq();                                             // Enable all interupts
+        drdy.enable_irq();                                          // Enable interrupt on DRDY pin
+        drdy.fall(&drdy_interrupt);                                 // Interrupt on falling edne of DRDY
+
+        while (!measured_data.finish) { // While loop. Waiting for the measurements to be completed
+            if (int_event==true) {      // Checks if Interrupt Occurred
+                ad77681_spi_read_adc_data(device, buf, AD77681_CONTINUOUS_DATA_READ);    // Read the continuous read data
+                if (device->conv_len == AD77681_CONV_24BIT)                                                     // 24bit format
+                    measured_data.raw_data[measured_data.count] = (buf[0] << 16 | buf[1] << 8 | buf[2]<< 0);    // Combining the SPI buffers
+                else                                                                                            // 16bit format
+                    measured_data.raw_data[measured_data.count] = (buf[0] << 8 | buf[1]<< 0);                   // Combining the SPI buffers
+                measured_data.count++;  // Increment Measured Data Counter
+                int_event=false;        // Set int event flag after reading the Data
+            }
+        }
+        ad77681_set_continuos_read(device, AD77681_CONTINUOUS_READ_DISABLE);            // Disable continuous ADC read
+        pc.printf("Done Sampling....\n");
+    }
+
+    else {
+        pc.printf(" Invalid option\n");
+    }
+    print_prompt();
+}
+
+/**
+ * Print measured data and transfered to voltage
+ *
+ */
+void static menu_16_print_ad77681_continuos_read_data(void)
+{
+    double voltage;
+    int32_t shifted_data;
+    uint16_t i;
+    char buf[15];
+
+    if (measured_data.finish) {
+        // Printing Voltage
+        pc.printf("\n\nVoltage\n");
+        for ( i = 0; i < measured_data.samples; i++) {
+            ad77681_data_to_voltage(device, &measured_data.raw_data[i], &voltage);
+            sprintf(buf, "%.9f \n",voltage);
+            pc.printf(buf);
+            memset(buf, 0, sizeof(buf));//clears buffer
+        }
+        // Printing Codes
+        pc.printf("\n\nCodes\n");
+        for(i = 0 ; i < measured_data.samples ; i++) {
+            if (measured_data.raw_data[i] & 0x800000)
+                shifted_data = (int32_t)((0xFF << 24) | measured_data.raw_data[i]);
+            else
+                shifted_data = (int32_t)((0x00 << 24) | measured_data.raw_data[i]);
+
+            pc.printf("%d\n", shifted_data + AD7768_HALF_SCALE);
+        }
+        // Printing Raw Date
+        pc.printf("\n\nRaw data\n");
+        for (i = 0; i < measured_data.samples; i++)
+            pc.printf("%d\n", measured_data.raw_data[i]);
+        // Set  measured_data.finish to false after Printing
+        measured_data.finish = false;
+    } else
+        pc.printf("Data not prepared\n");
+    print_prompt();
+}
+
+/**
+ * Chceck read and write functionaity by writing to and reading from scratchpad register
+ *
+ */
+void static menu_17_ad77681_check_scratchpad(void)
+{
+    uint32_t new_menu_select;
+    uint8_t chceck_sequence;
+    int32_t ret;
+    
+    pc.printf(" Scratchpad check\n");
+    pc.printf(" Insert 8bit number for scratchpad check: \n");
+
+    ret = getUserInput(&new_menu_select);                   // Get user input
+
+    if ((new_menu_select <= 0xFF) && (new_menu_select >= 0) && (ret == SUCCESS)) {
+        chceck_sequence = (uint8_t)(new_menu_select);
+        ret = ad77681_scratchpad(device, &chceck_sequence); // Write and read Scratch Pad
+        pc.printf("  Insered sequence:  %d\n  Returned sequence: %d\n", new_menu_select, chceck_sequence);
+        if (ret == SUCCESS)
+            pc.printf("  SUCCESS!\n");
+        else
+            pc.printf("  FAILURE!\n");
+    } else
+        pc.printf("  Invalid value\n");
+    print_prompt();
+}
+
+void static menu_18_reset_ad77681_ADC(void)
+{
+    uint32_t new_reset_option = 0;
+
+    pc.printf(" ADC reset opportunities: \n");
+    pc.printf("  1 - Soft reset - over SPI\n");
+    pc.printf("  2 - Hard reset - uing RESET pin\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_reset_option);
+    pc.putc('\n');
+
+    switch (new_reset_option) {
+    case 1:
+        ad77681_soft_reset(device);             // Perform soft reset thru SPI write
+        pc.printf(" ADC after soft reset\n");
+        break;
+    case 2:
+        adc_hard_reset();                       // Perform hard reset thru GPIO
+        pc.printf(" ADC after hard reset\n");
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Rest and set the Board to default setting
+ *
+ */
+void static menu_19_set_default_settings(void)
+{
+
+    int32_t default_settings_flag;
+
+    adc_hard_reset();                                                               // Perform hard reset thru GPIO
+    default_settings_flag = ad77681_setup(&device, init_params, &current_status);   // SETUP and check connection
+    adc_gpio_init();                                                                // Initilized SDP-K1 GPIOS
+
+    if (default_settings_flag == SUCCESS)
+        pc.printf("\n Default settings successfull loaded\n");
+    else
+        pc.printf("\n Error in settings, please reset the ADC\n");
+    print_prompt();
+}
+
+/**
+ * Set Vref anc MCLK as "exteranl" values, depending on you setup
+ *
+ */
+void static menu_20_mclk_vref(void)
+{
+    uint32_t input = 0, new_settings = 0;
+    int32_t ret;
+
+    pc.printf(" Set Vref and Mclk: \n");
+    pc.printf("  1 - Change Vref\n");
+    pc.printf("  2 - Change MCLK\n");
+    pc.printf(" Select an option: \n");
+
+    getUserInput(&new_settings);
+    pc.putc('\n');
+
+    switch (new_settings) {
+    case 1:
+        pc.printf(" Change Vref from %d mV to [mV]: ", device->vref);           // Vref change
+        ret = getUserInput(&input);
+
+        if ((input >= 1000) && (input <= 5000) && (ret == SUCCESS)) {
+            pc.printf("\n New Vref value is %d mV", input);
+            device->vref = input;
+        } else
+            pc.printf(" Invalid option\n");
+
+        pc.putc('\n');
+        break;
+
+    case 2:
+        pc.printf(" Change MCLK from %d kHz to [kHz]: ", device->mclk);         // MCLK change
+        ret = getUserInput(&input);
+        if ((input >= 10000) && (input <= 50000) && (ret == SUCCESS)) {
+            pc.printf("\n New MCLK value is %d kHz\n", input);
+            device->vref = input;
+            ad77681_update_sample_rate(device);                                 // Update the sample rate after changinig the MCLK
+        } else
+            pc.printf(" Invalid option\n");
+
+        pc.putc('\n');
+        break;
+    default:
+        pc.printf(" Invalid option\n");
+        break;
+    }
+    print_prompt();
+}
+
+/**
+ * Prints out an array in binary form
+ *
+ */
+void static print_binary(uint8_t number, char *binary_number)
+{
+    for (int8_t i = 7; i >= 0; i--) {
+        if (number & 1)
+            binary_number[i] = '1';
+        else
+            binary_number[i] = '0';
+        number >>= 1;
+    }
+}
+
+/**
+ * Read user input from uart
+ * *UserInput = 0 if failure
+ *
+ */
+int32_t static getUserInput(uint32_t *UserInput)
+{
+    long uart_val;
+    int32_t ret;
+
+    ret = pc.scanf("%ld", &uart_val);       // Return 1 = OK, Return 0 = Fail
+
+    if((ret == 0) || (uart_val < 0)) {      // Failure if uart_val is negative, or non-digit
+        *UserInput = 0;
+        return FAILURE;
+    }
+    *UserInput = (uint32_t)(uart_val);
+    return SUCCESS;
+}
+
+/**
+ * ADC hard reset thru SDP-K1 GPIO
+ *
+ */
+void static adc_hard_reset()
+{
+    adc_rst=0;      // Set ADC reset pin to Low
+    mdelay(100);    // Delay 100ms
+    adc_rst=1;      // Set ADC reset pin to High
+    mdelay(100);    // Delay 100ms
+}
+
+/**
+ * ADC hard reset thru SDP-K1 GPIO
+ *
+ */
+void static adc_gpio_init()
+{
+    ad77681_global_gpio(device, AD77681_GLOBAL_GPIO_ENABLE);                                    // Enable AD7768-1 GPIO pins
+    ad77681_gpio_inout(device, AD77681_GPIO_CNTRL_ALL_GPIOS_OP_EN(0x0F), AD77681_ALL_GPIOS);    // Set AD7768-1 GPIO1 - GPIO3 as Output
+    ad77681_gpio_write(device,AD77681_GPIO_CNTRL_ALL_GPIOS_OP_EN(0x05), AD77681_ALL_GPIOS);     // Set FDA to Low Power mode and PGIA Gain to 1
+}
\ No newline at end of file