A collection of Analog Devices drivers for the mbed platform

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

Files at this revision

API Documentation at this revision

Comitter:
Suciu
Date:
Wed Mar 30 17:35:04 2016 +0300
Parent:
0:f4275700536f
Child:
2:36a3230c38cf
Commit message:
Added CN0357-example project and related drivers

Changed in this revision

examples/cn0357_example/Makefile Show annotated file Show diff for this revision Revisions of this file
examples/cn0357_example/main.cpp Show annotated file Show diff for this revision Revisions of this file
libraries/ad5270/AD5270.cpp Show annotated file Show diff for this revision Revisions of this file
libraries/ad5270/AD5270.h Show annotated file Show diff for this revision Revisions of this file
libraries/ad7790/AD7790.cpp Show annotated file Show diff for this revision Revisions of this file
libraries/ad7790/AD7790.h Show annotated file Show diff for this revision Revisions of this file
libraries/cn0357/cn0357.cpp Show annotated file Show diff for this revision Revisions of this file
libraries/cn0357/cn0357.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/cn0357_example/Makefile	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,88 @@
+# This file was automagically generated by mbed.org. For more information, 
+# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded
+
+GCC_BIN = 
+PROJECT = CN0357-MBED
+OBJECTS = ./main.o ./AD7790.o ./AD5270.o ./cn0357.o
+SYS_OBJECTS = ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/board.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/cmsis_nvic.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/hal_tick.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/mbed_overrides.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/retarget.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/startup_stm32f411xe.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_adc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_adc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_can.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cec.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cortex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_crc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cryp.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cryp_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dac.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dac_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dcmi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dcmi_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma2d.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dsi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_eth.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_fmpi2c_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_fmpi2c.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_msp_template.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_gpio.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hash.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hash_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hcd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2c.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2c_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2s.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2s_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_irda.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_iwdg.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_lptim.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_ltdc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_ltdc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_smartcard.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_nand.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_nor.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pccard.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pcd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pcd_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pwr.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pwr_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_qspi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rcc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rcc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rng.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rtc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rtc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sai.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sai_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sdram.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_spdifrx.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_spi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sram.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_tim.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_tim_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_uart.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_usart.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_wwdg.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_fmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_fsmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_sdmmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_usb.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/system_stm32f4xx.o 
+INCLUDE_PATHS = -I. -I./mbed -I./mbed/TARGET_NUCLEO_F411RE -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM/TARGET_STM32F4 -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F411RE -I./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM 
+LIBRARY_PATHS = -L./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM 
+LIBRARIES = -lmbed 
+LINKER_SCRIPT = ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/STM32F411XE.ld
+
+############################################################################### 
+AS      = $(GCC_BIN)arm-none-eabi-as
+CC      = $(GCC_BIN)arm-none-eabi-gcc
+CPP     = $(GCC_BIN)arm-none-eabi-g++
+LD      = $(GCC_BIN)arm-none-eabi-gcc
+OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
+OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
+SIZE    = $(GCC_BIN)arm-none-eabi-size 
+
+ifeq ($(HARDFP),1)
+	FLOAT_ABI = hard
+else
+	FLOAT_ABI = softfp
+endif
+
+
+CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI) 
+CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP
+CC_SYMBOLS = -DTARGET_RTOS_M4_M7 -DTARGET_FF_ARDUINO -DTOOLCHAIN_GCC_ARM -DTARGET_NUCLEO_F411RE -D__CORTEX_M4 -DTARGET_LIKE_MBED -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_LIKE_CORTEX_M4 -DMBED_BUILD_TIMESTAMP=1458639619.11 -DTARGET_M4 -D__MBED__=1 -DTARGET_STM -DTARGET_STM32F4 -DTARGET_FF_MORPHO -DTOOLCHAIN_GCC -DTARGET_STM32F411RE -DARM_MATH_CM4 
+
+LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref
+LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
+
+
+ifeq ($(DEBUG), 1)
+  CC_FLAGS += -DDEBUG -O0
+else
+  CC_FLAGS += -DNDEBUG -Os
+endif
+
+.PHONY: all clean lst size
+
+all: $(PROJECT).bin $(PROJECT).hex size
+
+
+clean:
+	rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)
+
+
+.asm.o:
+	$(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+.s.o:
+	$(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+.S.o:
+	$(CC) $(CPU) -c -x assembler-with-cpp -o $@ $<
+
+.c.o:
+	$(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99   $(INCLUDE_PATHS) -o $@ $<
+
+.cpp.o:
+	$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<
+
+
+
+$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
+	$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
+
+
+$(PROJECT).bin: $(PROJECT).elf
+	$(OBJCOPY) -O binary $< $@
+
+$(PROJECT).hex: $(PROJECT).elf
+	@$(OBJCOPY) -O ihex $< $@
+
+$(PROJECT).lst: $(PROJECT).elf
+	@$(OBJDUMP) -Sdh $< > $@
+
+lst: $(PROJECT).lst
+
+size: $(PROJECT).elf
+	$(SIZE) $(PROJECT).elf
+
+DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
+-include $(DEPS)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/cn0357_example/main.cpp	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,94 @@
+/**
+*   @file     main.cpp
+*   @brief    Toxic gas sensor shield application
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#include "mbed.h"
+#include "cn0357.h"
+
+/** @mainpage
+ * CN0357 single-supply, low noise, portable gas detector circuit using an
+ * electrochemical sensor. The Alphasense CO-AX carbon monoxide sensor is used
+ * in this example. Electrochemical sensors offer several advantages for
+ * instruments that detect or measure the concentration of many toxic gases.
+ * Most sensors are gas specific and have usable resolutions under one part per
+ * million (ppm) of gas concentration.
+ *
+ * EVAL-CN0357 example program for MBED platforms. To achieve connection between
+ * the shield and the ST Nucleo, the following connections need to be made:
+ *
+ * - ICSP pin 1 -> pin 12 of the Arduino header
+ * - ICSP pin 3 -> pin 13 of the Arduino header
+ * - ICSP pin 4 -> pin 11 of the Arduino header
+ * - if VIN is not supplied, 5V to VIN
+ *
+ * @page CN0357 CN0357 Analog Devices wiki page
+ * @brief link->
+ * https://wiki.analog.com/resources/eval/user-guides/eval-adicup360/hardware/cn0357
+ * @page AD7790 AD7790 datasheet
+ * @brief link ->
+ * http://www.analog.com/media/en/technical-documentation/data-sheets/AD7790.pdf
+ * @page AD5270 AD5270 datasheet
+ * @brief link ->
+ * http://www.analog.com/media/en/technical-documentation/data-sheets/AD5270_5271.pdf
+ *
+ */
+const float SENSOR_RANGE = 2000; ///< gas sensor range in PPM
+const float SENSOR_SENSITIVITY = (65 * pow(10, -9)); ///< gas sensor sensitivity in A/ppm - 65 nA/ppm
+
+Serial pc(USBTX, USBRX); ///< Serial interface to the pc
+
+/**
+ @brief Displays CN0357 circuit readings and data to the UART
+
+ @param ui16Data - ADC data register value to be displayed
+ @param fData1   - ADC input voltage reading to be displayed
+ @param fdata2   - Gas Concentration reading to be displayed
+
+ **/
+void display_data(uint16_t ui16Data, float fData1, float fdata2)
+{
+
+    pc.printf("\r\nADC Data Register Value = %#08x", ui16Data); /** Send valid ADC data register value*/
+    pc.printf("\r\nADC Input Voltage input = %f V", fData1); /** Send valid voltage input value */
+    pc.printf("\r\nGas Concentration = %f PPM", fdata2); /** Send valid gas concentration value */
+
+    pc.printf("\r\n");
+}
+
+
+/**
+ * Project entry-point - initializes the CN0357 shield, reads the data when the ADC is ready and outputs the sensor
+ * value in PPM
+ */
+int main()
+{
+    /* Main variables */
+
+
+    CN0357 cn0357;
+    cn0357.init(SENSOR_RANGE, SENSOR_SENSITIVITY);
+
+    /* Infinite loop */
+    while (1) {
+
+        uint8_t ui8Status_Reg = cn0357.read_adc_status(); //  Read ADC Status Register
+
+        if (ui8Status_Reg == 0x08) { //  Checks if ADC data is available
+            uint16_t ui16Adcdata = cn0357.read_sensor();
+            float fAdcVoltage    = cn0357.data_to_voltage(ui16Adcdata); //  Convert ADC data to voltage
+            float fConcentration = cn0357.calc_ppm(fAdcVoltage); //  Convert voltage to Gas concentration
+            display_data(ui16Adcdata, fAdcVoltage, fConcentration); //  Display data thru UART
+
+            // printf("OneshotRead: %f PPM \r\n", cn0357.readPPM());
+        }
+
+        wait_ms(1000);
+    }
+
+    /* Infinite loop, never returns. */
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad5270/AD5270.cpp	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,94 @@
+/**
+*   @file     AD5270.cpp
+*   @brief    Source file for AD5270 rheostat
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#include "mbed.h"
+#include "AD5270.h"
+
+/**
+ * @brief AD5270 constructor, sets CS pin and SPI format
+ * @param CS - (optional)chip select of the AD5270
+ * @param max_resistance - (optional) nominal resistance of the AD5270 chip in ohms
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK  - (optional)pin of the SPI interface
+ */
+AD5270::AD5270(PinName CS, float max_resistance, PinName MOSI,PinName MISO,PinName SCK):
+    ad5270(MOSI,MISO,SCK),cs(CS),_max_resistance(max_resistance)
+{
+    ad5270.format(8,3);
+    cs=true;
+}
+
+/**
+ * @brief Compute for the nearest RDAC value from given resistance
+ * @param resistance - resistor
+ * @return RDAC value - closest possible to given resistance
+ */
+uint16_t AD5270::calc_RDAC(float resistance)
+{
+    return static_cast<uint16_t>( (resistance / _max_resistance) * 1024.0 );
+}
+
+/**
+ *	@brief Puts the AD5270 SDO line in to Hi-Z mode
+ *	@return none
+ */
+void AD5270::set_SDO_HiZ(void)
+{
+    write_reg(HI_Z_Cmd);
+    write_reg(NO_OP_cmd);
+}
+
+/**
+ * @brief Set AD5270 SPI frequency
+ * @param hz - SPI bus frequency in hz
+ * @return none
+ */
+void AD5270::frequency(int hz)
+{
+    ad5270.frequency(hz);
+}
+
+/**
+ * @brief Issues AD5270 a command
+ * @param command - command to be sent
+ * @param data - (optional)value for the requested command
+ * @return response form the AD5270
+ */
+uint16_t AD5270::write_cmd(uint8_t command, uint16_t data)
+{
+    /* build 16 bit data to be written - Command + Value */
+    uint16_t ui16Command = ((command & 0x3C) << 8) | (data & 0x3FF);
+    return write_reg(ui16Command);
+}
+
+/**
+ * @brief Writes 16bit data to the AD5270 SPI interface
+ * @param data to be written
+ * @return data returned by the AD5270
+ */
+uint16_t AD5270::write_reg(uint16_t data)
+{
+    uint16_t result;
+    uint8_t upper_byte = (data >> 8) & 0xFF;
+    uint8_t lower_byte =  data & 0xFF;
+    cs = false;
+    result  = ((ad5270.write(upper_byte)) << 8);
+    result |=   ad5270.write(lower_byte);
+    cs = true;
+    return result;
+}
+
+/**
+ * @brief Gets maximum resistance of the AD5270 digital rheostat
+ * @return maximum resistance in ohms
+ */
+float AD5270::get_max_resistance()
+{
+    return _max_resistance;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad5270/AD5270.h	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,56 @@
+/**
+*   @file     AD5270.h
+*   @brief    Header file for AD5270 rheostat
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#ifndef AD5270_H
+#define AD5270_H
+
+#include "mbed.h"
+
+/**
+ * @brief Analog Devices AD5270 SPI Digital Rheostat class
+ */
+class AD5270
+{
+public:
+
+    /// AD5270 commands
+    typedef enum {
+        NO_OP               =  0x00,   ///< No data
+        NO_OP_cmd           =  0x0000, ///< 16 bit no data
+        WRITE_RDAC          =  0x04,   ///< Write to the RDAC Register
+        READ_RDAC           =  0x08,   ///< Read from the RDAC Register
+        STORE_50TP          =  0x0C,   ///< Write to the RDAC to memory
+        SW_RST              =  0x10,   ///< Software reset to last memory location
+        READ_50TP_CONTENTS  =  0x14,   ///< Read the last memory contents
+        READ_50TP_ADDRESS   =  0x18,   ///< Read the last memory address
+        WRITE_CTRL_REG      =  0x1C,   ///< Write to the control Register
+        READ_CTRL_REG       =  0x20,   ///< Read from the control Register
+        SW_SHUTDOWN         =  0x24,   ///< Software shutdown (0) - Normal, (1) - Shutdown
+        HI_Zupper           =  0x80,   ///< Get the SDO line ready for High Z
+        HI_Zlower           =  0x01,   ///< Puts AD5270 into High Z mode
+        HI_Z_Cmd            =  0x8001   ///< Puts AD5270 into High Z mode*/
+    } AD5270Commands_t;
+
+    AD5270(PinName CS=SPI_CS, float max_resistance = 20000.0, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+    void set_SDO_HiZ(void);
+    void frequency(int hz);
+    uint16_t calc_RDAC(float resistance);
+    uint16_t write_cmd(uint8_t command, uint16_t data = 0x00);
+    uint16_t write_reg(uint16_t data);
+    float get_max_resistance(void);
+
+    SPI ad5270;    ///< SPI instance of the AD5270
+    DigitalOut cs; ///< DigitalOut instance for the chipselect of the AD5270
+
+private:
+    const static int _RESET = 0xff;
+    const static int _DUMMY_BYTE = 0xAA;
+    float _max_resistance;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad7790/AD7790.cpp	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,117 @@
+/**
+*   @file     AD7790.cpp
+*   @brief    Source file for AD7790 ADC
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#include <stdint.h>
+#include "mbed.h"
+#include "ad7790.h"
+
+
+/**
+ * @brief AD7790 constructor, sets CS pin and SPI format
+ * @param CS - (optional)chip select of the AD7790
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK  - (optional)pin of the SPI interface
+ */
+AD7790::AD7790(PinName CS,
+               PinName MOSI,
+               PinName MISO,
+               PinName SCK) :
+    ad7790(MOSI, MISO, SCK),cs(CS)
+{
+    ad7790.format(8,3);
+    cs = true; // cs is active low
+}
+
+/**
+ * @brief Set AD7790 SPI frequency
+ * @param hz - SPI bus frequency in hz
+ * @return none
+ */
+void AD7790::frequency(int hz)
+{
+    ad7790.frequency(hz);
+}
+
+/**
+ * @brief Resets the AD7790
+ * @return none
+ */
+void AD7790::reset()
+{
+    cs = false;
+    ad7790.write(_RESET);
+    ad7790.write(_RESET);
+    ad7790.write(_RESET);
+    ad7790.write(_RESET);
+    cs = true;
+}
+
+/**
+ * @brief Reads the data register of the AD7790
+ * @return value of the register
+ */
+uint16_t AD7790::read_data(void)
+{
+    uint16_t dataResult = 0;
+
+    cs = false;
+    ad7790.write(_DATA_READ);
+    dataResult  = ((ad7790.write(_DUMMY_BYTE)) << 8);
+    dataResult |=  (ad7790.write(_DUMMY_BYTE));
+    cs = true;
+
+    return dataResult;
+}
+
+/**
+ * @brief Reads a register of the AD7790
+ * @param  regAddress - address of the register
+ * @return value of the register
+ */
+uint16_t AD7790::read_reg(AD7790Registers_t regAddress)
+{
+    uint16_t data = regAddress << 12;
+    data |= _DUMMY_BYTE;
+    data |= _READ_FLAG;
+    return	write_spi(data);
+}
+
+/**
+ * @brief Writes a register of the AD7790
+ * @param regAddress - address of the register
+ * @param regValue - value to be written
+ * @return none
+ *
+ */
+void AD7790::write_reg(AD7790Registers_t regAddress,uint8_t regValue)
+{
+    uint16_t data = regAddress << 12;
+    data |= regValue;
+    write_spi(data);
+}
+
+/**
+ * @brief Writes 16bit data to the AD7790 SPI interface
+ * @param data to be written
+ * @return data returned by the AD7790
+ */
+uint16_t AD7790::write_spi(uint16_t data)
+{
+    uint16_t result;
+    uint8_t upper_byte = (data >> 8) & 0xFF;
+    uint8_t lower_byte = data & 0xFF;
+    cs = false;
+    result  =  (ad7790.write(upper_byte) << 8);
+    result |=   ad7790.write(lower_byte);
+    cs = true;
+    return result;
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad7790/AD7790.h	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,56 @@
+/**
+*   @file     AD7790.h
+*   @brief    Header file for AD7790 ADC
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#ifndef AD7790_H
+#define AD7790_H
+
+#include "mbed.h"
+
+/**
+ * @brief Analog Devices AD7790 SPI 16-bit Buffered Sigma-Delta ADC
+ */
+class AD7790
+{
+public:
+    /// AD7790 registers
+    typedef enum {
+        COMMUNICATION_REG = 0, ///< Communication register
+        STATUS_REG = 0,        ///< Status register
+        MODE_REG,              ///< Mode register
+        FILTER_REG,            ///< Filter Register
+        DATA_REG               ///< Data register
+    } AD7790Registers_t;
+
+    /// AD7790 channel configuration
+    typedef enum {
+        DIFFERENTIAL, ///< AIN(+)-AIN(-)
+        RESERVED,     ///< reserved
+        SHORT,        ///< AIN(-)-AIN(-)
+        VDDMONITOR    ///< Monitor VDD
+    } AD7790Channel_t;
+
+    AD7790(PinName CS=SPI_CS, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+    void frequency(int hz);
+    void reset(void);
+    void write_reg(AD7790Registers_t regAddress, uint8_t regValue);
+    uint16_t write_spi(uint16_t data);
+    uint16_t read_reg (AD7790Registers_t regAddress);
+    uint16_t read_data(void);
+
+    SPI ad7790;    ///< SPI instance of the AD7790
+    DigitalOut cs; ///< DigitalOut instance for the chipselect of the AD7790
+
+private:
+
+    const static int _RESET = 0xFF;
+    const static int _DUMMY_BYTE = 0xAA;
+    const static int _READ_FLAG = 0x0800;
+    const static int _DATA_READ    = 0x38;             // Read from the Data Register
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/cn0357/cn0357.cpp	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,192 @@
+/**
+*   @file     CN0357.cpp
+*   @brief    Source file for CN0357 toxic gas sensor shield
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+
+#include "mbed.h"
+#include "AD7790.h"
+#include "AD5270.h"
+#include "cn0357.h"
+
+/**
+ * @brief CN0357 constructor
+ * @param CSAD7790 - (optional)chip select of the AD7790
+ * @param CSAD5270 - (optional)chip select of the AD5270
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK  - (optional)pin of the SPI interface
+ */
+CN0357::CN0357(PinName CSAD7790, PinName CSAD5270, PinName MOSI, PinName MISO,
+               PinName SCK) :
+    ad7790(CSAD7790, MOSI, MISO, SCK), ad5270(CSAD5270, 20000.0, MOSI, MISO, SCK) ,
+    _sensor_sensitivity(0), _sensor_range(0), _RDACvalue(0)
+{
+}
+
+/**
+ * @brief initializes the AD7790 and the AD5270
+ * @param range - range of the sensor used (in ppm)
+ * @param sensitivity - sensitivity of the sensor (A/ppm)
+ * @param jp - (optional)jumper configuration of the CN0357
+ * @param mode_val - (optional)if jp is set to InternalADC, configures the mode register of the Internal ADC
+ * @param filter_val - (optional)if jp is set to InternalADC, configures the filter register of the Internal ADC
+ */
+void CN0357::init(float range, float sensitivity,JumperConfig_t jp,uint8_t mode_val, uint8_t filter_val)
+{
+    ad5270.frequency(500000);
+    ad7790.frequency(500000);
+
+    float resistance = set_sensor_parameters(range,sensitivity);
+    _rdac_init(resistance);
+    if(jp == INTERNAL_AD7790) {
+        _AD7790_init(mode_val, filter_val);
+    }
+
+}
+
+/**
+ * @brief initializes the RDAC and sets SDO to HiZ
+ * @param resistance - resistance value to initialize the RDAC
+ * @return
+ */
+void CN0357::_rdac_init(float resistance)
+{
+    /* RDAC initialization*/
+    /* Compute for the nearest RDAC value from given resistance and save data to the structure */
+    set_RDAC_value(resistance);
+    /* Set AD5270 SDO to Hi-Z */
+    ad5270.set_SDO_HiZ();
+}
+
+/**
+ * @brief initializes the AD7790
+ * @param mode_val -  configures the mode register of the Internal ADC
+ * @param filter_val -  configures the filter register of the Internal ADC
+ */
+void CN0357::_AD7790_init(uint8_t mode_val, uint8_t filter_val)
+{
+    ad7790.reset();
+    // wait_ms(1000);
+    ad7790.write_reg(AD7790::MODE_REG, mode_val);
+    ad7790.write_reg(AD7790::FILTER_REG, filter_val);
+
+}
+
+/**
+ * @brief reads the status register of the AD7790
+ * @return status register value
+ */
+uint8_t CN0357::read_adc_status(void)
+{
+    return ad7790.read_reg(AD7790::STATUS_REG);
+}
+
+/**
+ * @brief reads the ADC and computes the sensor voltage
+ * @return sensor voltage
+ */
+float CN0357::read_sensor_voltage(void)
+{
+    return data_to_voltage(read_sensor());
+}
+
+/**
+ * @brief reads the data register of the AD7790
+ * @return data register value
+ */
+uint16_t CN0357::read_sensor(void)
+{
+    return ad7790.read_data();
+}
+
+/**
+ * @brief reads and computes the sensor reading in PPM
+ * @return value of the sensor reading in PPM
+ */
+float CN0357::read_ppm()
+{
+    return calc_ppm(read_sensor_voltage()); /* Convert voltage to Gas concentration*/
+}
+
+/**
+ * @brief computes a value in PPM from a reading received as a param
+ * @param adcVoltage - voltage to be converted to PPM
+ * @return sensor value in PPM
+ */
+float CN0357::calc_ppm(float adcVoltage)
+{
+    float fConcentration = 0;
+    fConcentration = (fabs(adcVoltage) / _RDACvalue) / _sensor_sensitivity;
+    return fConcentration;
+}
+
+/**
+ * @brief computes voltage from a 16 bit ADC value received as a parameter
+ * @param data - ADC value
+ * @return sensor voltage
+ */
+float CN0357::data_to_voltage(uint16_t data)
+{
+    return ((static_cast<float>(data) / pow(2, 15)) - 1) * 1.2; /* Bipolar voltage computation from ADC code */
+}
+
+/**
+ * @brief sets a new value for the RDAC
+ * @param resistance new value for the resistance
+ * @return none
+ */
+void CN0357::set_RDAC_value(float resistance)
+{
+    // Compute for the RDAC code nearest to the required feedback resistance
+    uint16_t RDAC_val = (resistance / 20000.0) * 1024.0;
+    // Compute for the constants used in voltage and PPM conversion computation
+    _RDACvalue = ((static_cast<float> (RDAC_val) * 20000.0) / 1024.0);
+    ad5270.write_cmd(AD5270::WRITE_CTRL_REG, 0x02); // RDAC register write protect -  allow update of wiper position through digital interface
+    ad5270.write_cmd(AD5270::WRITE_RDAC, RDAC_val); // write data to the RDAC register
+}
+
+/**
+ * @brief getter method for RDAC value
+ * @return value of the RDAC in ohms
+ */
+float CN0357::get_RDAC_value()
+{
+    return _RDACvalue;
+}
+
+/**
+ * @brief set sensor range and sensitivity
+ * sets sensor range, sensitivity
+ * returns suggested resistance value for feedback resistor
+ * @param range - range of the sensor used (in ppm)
+ * @param sensitivity - sensitivity of the sensor (in A/ppm)
+ * @return suggested resistance value for feedback resistor
+ */
+float CN0357::set_sensor_parameters(float range, float sensitivity)
+{
+    _sensor_sensitivity = static_cast<float>(sensitivity);
+    _sensor_range = range;
+    return (1.2 / (static_cast<float>(_sensor_range * _sensor_sensitivity)));
+}
+
+/**
+ * @brief getter method for sensor sensitivity
+ * @return sensor sensitivity (in A/ppm)
+ */
+float CN0357::get_sensor_sensitivity()
+{
+    return _sensor_sensitivity;
+}
+
+/**
+ * @brief getter method for sensor range
+ * @return sensor range (in ppm)
+ */
+float CN0357::get_sensor_range()
+{
+    return _sensor_range;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/cn0357/cn0357.h	Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,62 @@
+/**
+*   @file     CN0357.h
+*   @brief    Header file for CN0357 toxic gas sensor shield
+*   @version  V0.1
+*   @author   ADI
+*   @date     March 2015
+**/
+
+#ifndef CN0357_H
+#define CN0357_H
+
+#include "mbed.h"
+#include "ad7790.h"
+#include "ad5270.h"
+
+/**
+ * @brief EVAL-CN0357 toxic gas sensor shield
+ */
+class CN0357
+{
+public:
+
+    /// CN0357 shield jumper configuration
+    typedef enum {
+        INTERNAL_AD7790 = 0, 	///< The shield's AD7790 is used
+        EXTERNAL_ADC			///< Sensor analog output is routed to A1 pin of the shield
+    } JumperConfig_t;
+
+    CN0357(PinName CSAD7790=D8, PinName CSAD5270=D6, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+    void init(float range, float sensitivity,JumperConfig_t jp = INTERNAL_AD7790, uint8_t mode_val = _DEFAULT_MODE_VAL, uint8_t filter_val = _DEFAULT_FILTER_VAL);
+
+    uint8_t  read_adc_status(void);
+    uint16_t read_sensor(void);
+    float read_sensor_voltage(void);
+    float data_to_voltage(uint16_t data);
+    float calc_ppm(float adcVoltage);
+    float read_ppm(void);
+
+    void  set_RDAC_value(float resistor_val);
+    float get_RDAC_value(void);
+    float set_sensor_parameters(float range, float sensitivity);
+    float get_sensor_range(void);
+    float get_sensor_sensitivity(void);
+
+
+    AD7790 ad7790; ///< AD7790 instance - can be used for manual overriding
+    AD5270 ad5270; ///< AD5270 instance - can be used for manual overriding
+
+private:
+    const static int _RESET = 0xff;
+    const static int _DEFAULT_MODE_VAL = 0x00;
+    const static int _DEFAULT_FILTER_VAL = 0x07;
+    float _sensor_sensitivity;
+    float _sensor_range;
+    float _RDACvalue;
+    void _rdac_init(float resistanceValue);
+    void _AD7790_init(uint8_t mode_val, uint8_t filter_val);
+
+
+};
+
+#endif // CN0357_H