Example program for EVAL-TempSense-ARDZ boards.
Dependencies: platform_drivers
Revision 7:3e5f6cca357e, committed 2021-09-24
- Comitter:
- Kjansen
- Date:
- Fri Sep 24 15:22:13 2021 +0100
- Parent:
- 6:0228e21af1f0
- Commit message:
- 1.) Updated the project repository structure
2.) Made modifications in the code to align with the latest no-OS drivers and the platform drivers
Changed in this revision
diff -r 0228e21af1f0 -r 3e5f6cca357e ADT73xx-ADT74xx.lib --- a/ADT73xx-ADT74xx.lib Mon Dec 09 17:54:51 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://os.mbed.com/teams/AnalogDevices/code/ADT73xx-ADT74xx/#a86efb0ef0ad
diff -r 0228e21af1f0 -r 3e5f6cca357e app/.mbedignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/.mbedignore Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,64 @@ +mbed_platform_drivers/adc_data_capture.c +mbed_platform_drivers/irq.cpp +no-OS/ad5758-sdz/ +no-OS/AD6673-EBZ/ +no-OS/AD9250-EBZ/ +no-OS/adum7701_fmc/ +no-OS/ci/ +no-OS/common_drivers/ +no-OS/device_drivers/ +no-OS/doc/ +no-OS/drivers/accel/ +no-OS/drivers/afe/ +no-OS/drivers/axi_core/ +no-OS/drivers/adc/ad4* +no-OS/drivers/adc/ad6* +no-OS/drivers/adc/ad70* +no-OS/drivers/adc/ad71* +no-OS/drivers/adc/ad72* +no-OS/drivers/adc/ad73* +no-OS/drivers/adc/ad74* +no-OS/drivers/adc/ad75* +no-OS/drivers/adc/ad76* +no-OS/drivers/adc/ad77* +no-OS/drivers/adc/ad78* +no-OS/drivers/adc/ad79* +no-OS/drivers/adc/adaq7980/ +no-OS/drivers/adc/ad9* +no-OS/drivers/adc/ltc2312/ +no-OS/drivers/adc/adc_demo/ +no-OS/drivers/adc-dac/ad5592r/ +no-OS/drivers/amplifiers/ +no-OS/drivers/instr-amplif/ +no-OS/drivers/tdm/ +no-OS/drivers/cdc/ +no-OS/drivers/dac/ +no-OS/drivers/display/ +no-OS/drivers/ecg/ +no-OS/drivers/frequency/ +no-OS/drivers/gpio/ +no-OS/drivers/gyro/ +no-OS/drivers/i2c/ +no-OS/drivers/irq/ +no-OS/drivers/impedance-analyzer/ +no-OS/drivers/io-expander/ +no-OS/drivers/mux/ +no-OS/drivers/photo-electronic/ +no-OS/drivers/platform/ +no-OS/drivers/potentiometer/ +no-OS/drivers/rf-transceiver/ +no-OS/drivers/sd-card/ +no-OS/drivers/spi/ +no-OS/iio/ +no-OS/legacy/ +no-OS/libraries/fatfs/ +no-OS/libraries/mbedtls/ +no-OS/libraries/mqtt/ +no-OS/libraries/iio/ +no-OS/network/ +no-OS/projects/ +no-OS/scripts/ +no-OS/tools/ +no-OS/v4l2_config/ +libtinyiiod/ci/ +libtinyiiod/example.c \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e app/adt7xxx_support.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/adt7xxx_support.c Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,325 @@ +/***************************************************************************//** + * @file adt7xxx_support.c + * @brief Support Source File for adt7xxx +******************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ + +#include <stdint.h> +#include "adt7420.h" +#include "error.h" +#include "adt7xxx_support.h" + +/******************************************************************************/ +/********************** Macros and Constants Definitions **********************/ +/******************************************************************************/ + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ + +/***************************************************************************//** + * @brief Reads the value of a register SPI/I2C. + * + * @param dev - The device structure. + * @param register_address - Address of the register. + * + * @return register_value - Value of the register. +*******************************************************************************/ +uint16_t adt7420_get_register_address_and_value(struct adt7420_dev *dev, + uint8_t register_address) +{ + uint16_t register_value = 0; + + //remap register map + if(adt7420_is_spi(dev)) { + switch (register_address) { + case REG_TEMP: + register_address = ADT7320_REG_TEMP; + break; // Temperature value + case REG_STATUS : + register_address = ADT7320_REG_STATUS; + break; // status info + case REG_CONFIG : + register_address = ADT7320_REG_CONFIG; + break; // Configuration + case REG_T_CRIT : + register_address = ADT7320_REG_T_CRIT; + break; // Temperature CRIT setpoint (147'C) + case REG_HIST : + register_address = ADT7320_REG_HIST; + break; // Temperature HYST setpoint (5'C) + case REG_T_HIGH : + register_address = ADT7320_REG_T_HIGH; + break; // Temperature HIGH setpoint (64'C) + case REG_T_LOW : + register_address = ADT7320_REG_T_LOW; + break; // Temperature LOW setpoint (10'C) + case REG_ID : + register_address = ADT7320_REG_ID; + break; // ID value + } + register_value = adt7420_get_register_value(dev, register_address); + } else { + switch (register_address) { + case REG_TEMP: { + register_value = adt7420_get_register_value(dev, + ADT7420_REG_TEMP_MSB) << 8; + register_value |= adt7420_get_register_value(dev, ADT7420_REG_TEMP_LSB); + break; + } + case REG_STATUS: + register_value = adt7420_get_register_value(dev, ADT7420_REG_STATUS); + break; + case REG_CONFIG: + register_value = adt7420_get_register_value(dev, ADT7420_REG_CONFIG); + break; + case REG_T_HIGH: { + register_value = adt7420_get_register_value(dev, + ADT7420_REG_T_HIGH_MSB) << 8; + register_value |= adt7420_get_register_value(dev, ADT7420_REG_T_HIGH_LSB); + break; + } + case REG_T_LOW: { + register_value = adt7420_get_register_value(dev, + ADT7420_REG_T_LOW_MSB) << 8; + register_value |= adt7420_get_register_value(dev, ADT7420_REG_T_LOW_LSB); + break; + } + case REG_T_CRIT: { + register_value = adt7420_get_register_value(dev, + ADT7420_REG_T_CRIT_MSB) << 8; + register_value |= adt7420_get_register_value(dev, ADT7420_REG_T_CRIT_LSB); + break; + } + case REG_HIST: + register_value = adt7420_get_register_value(dev, ADT7420_REG_HIST); + break; + case REG_ID: + register_value = adt7420_get_register_value(dev, ADT7420_REG_ID); + break; + } + } + return register_value; +} + + +/**************************************************************************//** + * @brief Configure write typev register based on communication interface. + * + * @param dev - The device structure. + * @param register_address - Register type. + * + * @return register_address - Register Address. +******************************************************************************/ +uint16_t configure_write_type_registers(struct adt7420_dev *dev, + uint8_t register_address) +{ + if (adt7420_is_spi(dev)) { + //simple address re-map for SPI devices + switch(register_address) { + case REG_TEMP: + register_address = ADT7320_REG_TEMP; + break; // Temperature value + case REG_STATUS : + register_address = ADT7320_REG_STATUS; + break; // status info + case REG_CONFIG : + register_address = ADT7320_REG_CONFIG; + break; // Configuration + case REG_T_CRIT : + register_address = ADT7320_REG_T_CRIT; + break; // Temperature CRIT setpoint (147'C) + case REG_HIST : + register_address = ADT7320_REG_HIST; + break; // Temperature HYST setpoint (5'C) + case REG_T_HIGH : + register_address = ADT7320_REG_T_HIGH; + break; // Temperature HIGH setpoint (64'C) + case REG_T_LOW : + register_address = ADT7320_REG_T_LOW; + break; // Temperature LOW setpoint (10'C) + case REG_ID : + register_address = ADT7320_REG_ID; + break; // ID value + } + } else { + //simple address re-map for I2Cdevices + switch(register_address) { + case REG_TEMP: + register_address = ADT7420_REG_T_HIGH_MSB; + break; // Temperature value + case REG_STATUS : + register_address = ADT7420_REG_STATUS; + break; // status info + case REG_CONFIG : + register_address = ADT7420_REG_CONFIG; + break; // Configuration + case REG_T_CRIT : + register_address = ADT7420_REG_T_CRIT_MSB; + break; // Temperature CRIT setpoint (147'C) + case REG_HIST : + register_address = ADT7420_REG_HIST; + break; // Temperature HYST setpoint (5'C) + case REG_T_HIGH : + register_address = ADT7420_REG_T_HIGH_MSB; + break; // Temperature HIGH setpoint (64'C) + case REG_T_LOW : + register_address = ADT7420_REG_T_LOW_MSB; + break; // Temperature LOW setpoint (10'C) + case REG_ID : + register_address = ADT7420_REG_ID; + break; // ID value + } + } + + return register_address; +} + +/**************************************************************************//** + * @brief Write to a setpoint register. + * + * @param dev - The device structure. + * @param register_value - Command control bits. + * @param data - Data to be written in input register. + * + * @return read_back_data - value read from register. +******************************************************************************/ +uint8_t adt7420_wr_setpoint_reg(struct adt7420_dev *dev, + uint8_t register_value, + uint16_t data) +{ + uint16_t read_back_data = 0; + uint8_t address, num_bytes; + uint8_t data_buffer[3] = { 0, 0, 0 }; + + switch (register_value) { + case REG_T_CRIT: + case REG_T_HIGH: + case REG_T_LOW: { + num_bytes = 3; + data_buffer[0] = ((data & ADT7420_MSB_MASK) >> ADT7420_MSB_OFFSET); + data_buffer[1] = data & ADT7420_LSB_MASK; + break; + } + case REG_HIST: { + num_bytes = 2; + data_buffer[0] = data & ADT7420_LSB_MASK; + break; + } + } + + address = configure_write_type_registers(dev, register_value); + set_register_value(dev, address, num_bytes, data_buffer, ADT7420_MASK_SET_PT_REGISTER, 0x00); + read_back_data = adt7420_get_register_value(dev, address); + + if (register_value == REG_HIST) { + data &= 0x000F; //msbits are all low for HIST register + read_back_data &= 0x000F; //msbits are all low for HIST register + } + + return read_back_data == data ? SUCCESS : FAILURE; +} + +/***************************************************************************//** + * @brief Sets the Fault Queue option for ADT7420/ADT7320. + * + * @param dev - The device structure. + * @param mode - Fault Queue selection. + * Example: 1 - 1 fault (default). + * 2 - 2 faults. + * 3 - 3 faults. + * 4 - 4 faults. + * + * @return None. +*******************************************************************************/ +void adt7420_set_fault_queue(struct adt7420_dev *dev, + uint8_t mode) +{ + uint8_t register_value[1] = { 0 }; + uint8_t address; + + if (adt7420_is_spi(dev)) { + address = ADT7320_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7320_REG_CONFIG); + } else { + address = ADT7420_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7420_REG_CONFIG); + } + + set_register_value(dev, address, 2, register_value, + ADT7420_CONFIG_FAULT_QUEUE(ADT7420_FAULT_QUEUE_4_FAULTS), + ADT7420_CONFIG_FAULT_QUEUE(mode)); +} + +/***************************************************************************//** + * @brief Sets comparator/interrupt (CT/INT) mode for ADT7420/ADT7320. + * + * @param dev - The device structure. + * @param setting - Mode selection. + * Example: 0 - Interrupt (default). + * 1 - Comparator. + * + * + * @return None. +*******************************************************************************/ +void adt7420_set_ct_int_mode(struct adt7420_dev *dev, + uint8_t setting) +{ + uint8_t register_value[1] = { 0 }; + uint8_t address; + + if (adt7420_is_spi(dev)) { + address = ADT7320_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7320_REG_CONFIG); + } else { + address = ADT7420_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7420_REG_CONFIG); + } + + set_register_value(dev, address,2 ,register_value, ADT7420_CONFIG_INT_CT_MODE, + (setting * ADT7420_CONFIG_INT_CT_MODE)); +} + +/***************************************************************************//** + * @brief Sets output polarity for the pins CT/INT (Critical Temp - Over/Under Temp). + * + * @param dev - The device structure. + * @param polarity - Polarity selection. + * Example: 0 - Active Low (default). + * 1 - Active High. + * + * + * @return None. +*******************************************************************************/ +void adt7420_set_ct_int_polarity(struct adt7420_dev *dev, + uint8_t polarity) +{ + uint8_t register_value[1] = { 0 }; + uint8_t address; + uint8_t bit_mask, bit_value; + + if (adt7420_is_spi(dev)) { + address = ADT7320_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7320_REG_CONFIG); + } else { + address = ADT7420_REG_CONFIG; + register_value[0] = adt7420_get_register_value(dev, ADT7420_REG_CONFIG); + register_value[0] = adt7420_get_register_value(dev, ADT7420_REG_CONFIG); + } + + bit_mask = (ADT7420_CONFIG_CT_POL) | (ADT7420_CONFIG_INT_POL); + bit_value = (polarity * ADT7420_CONFIG_CT_POL) | (polarity * + ADT7420_CONFIG_INT_POL); + + set_register_value(dev, address, 2, register_value, bit_mask, bit_value); +}
diff -r 0228e21af1f0 -r 3e5f6cca357e app/adt7xxx_support.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/adt7xxx_support.h Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,74 @@ +/***************************************************************************** + * @file adt7xxx_support.h + * @brief Support Header File for adt7xxx +****************************************************************************** + * Copyright (c) 2021 Analog Devices, Inc. + * All rights reserved. + * + * This software is proprietary to Analog Devices, Inc. and its licensors. + * By using this software you agree to the terms of the associated + * Analog Devices Software License Agreement. +*****************************************************************************/ + +#ifndef _ADT7XXX_SUPPORT_H +#define _ADT7XXX_SUPPORT_H + +/* ADT7420 bit mask */ +#define ADT7420_LSB_MASK 0x00FF +#define ADT7420_MSB_MASK 0xFF00 +#define ADT7420_LSB_OFFSET 0 +#define ADT7420_MSB_OFFSET 8 +#define ADT7420_CONFIG_CT_POL BIT(2) +#define ADT7420_CONFIG_FAULT_QUEUE(x) ((x) & 0x3) +#define ADT7420_CONFIG_INT_POL BIT(3) +#define ADT7420_CONFIG_INT_CT_MODE BIT(4) +#define ADT7420_MASK_SET_PT_REGISTER 0x00 + +/* ADT7420_CONFIG_FAULT_QUEUE(x) options */ +#define ADT7420_FAULT_QUEUE_1_FAULT 0 +#define ADT7420_FAULT_QUEUE_2_FAULTS 1 +#define ADT7420_FAULT_QUEUE_3_FAULTS 2 +#define ADT7420_FAULT_QUEUE_4_FAULTS 3 + +/* ADT7xxx default ID */ +#define ADT7320_DEFAULT_ID 0xC3 +#define ADT7420_DEFAULT_ID 0xCB + +typedef enum { + REG_TEMP, // Temperature value + REG_STATUS, // status info + REG_CONFIG, // Configuration + REG_T_CRIT, // Temperature CRIT setpoint (147'C) + REG_HIST, // Temperature HYST setpoint (5'C) + REG_T_HIGH, // Temperature HIGH setpoint (64'C) + REG_T_LOW, // Temperature LOW setpoint (10'C) + REG_ID, // ID value + REG_RESET +} registers_e; + + +/*! Sets the Fault Queue option for ADT7420/ADT7320.*/ +void adt7420_set_fault_queue(struct adt7420_dev *dev, + uint8_t mode); + +/*! Sets comparator/interrupt (CT/INT) mode for ADT7420/ADT7320.*/ +void adt7420_set_ct_int_mode(struct adt7420_dev *dev, + uint8_t setting); + +/*! Sets output polarity for the pins CT/INT (Critical Temp - Over/Under Temp).*/ +void adt7420_set_ct_int_polarity(struct adt7420_dev *dev, + uint8_t polarity); + +/*! Writes data to temperature registers*/ +uint8_t adt7420_wr_setpoint_reg(struct adt7420_dev *device, + uint8_t register_value, + uint16_t data); + +/*! Get the register address of write type registers */ +uint16_t configure_write_type_registers(struct adt7420_dev *dev, + uint8_t register_address); + +/*! Get the register address based on the register type enum- registers_e */ +uint16_t adt7420_get_register_address_and_value(struct adt7420_dev *dev, + uint8_t register_address); +#endif // _ADT7XXX_SUPPORT_H \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e app/app_config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/app_config.h Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,108 @@ +/***************************************************************************** + * @file app_config.h + * @brief Application configuration file + * @author ssmith (sean.smith@analog.com) +****************************************************************************** +* Copyright (c) 2019, 2021 Analog Devices, Inc. +* +* All rights reserved. +* +* 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. +* +* 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. +* +* 20180927-7CBSD SLA +*****************************************************************************/ + +#ifndef _APP_CONFIG_H_ +#define _APP_CONFIG_H_ + +#include <stdint.h> +#include "PinNames.h" + +#ifndef ACTIVE_DEVICE +/** + #define your chosen device here from the + adt7420_type (adt7420.h) enum +*/ +#define ACTIVE_DEVICE ID_ADT7320 +#endif // ! + +/** + ADT7420 is a 7-bit I2C address +*/ +#define EXT_I2C_ADDRESS 0x49 +#define INT_I2C_ADDRESS 0x48 + +/** + Add a line-ending constant as different emulators + implement it in various ways - simple to change it here +*/ +#define EOL "\r\n" + +/** + The ADI SDP_K1 can be used with either arduino headers + or the 120-pin SDP connector found on ADI evaluation + boards. The default is the SDP connector + + Uncomment the ARDUINO #define above to enable the ARDUINO connector +*/ + +//#define ARDUINO + +#ifdef ARDUINO + #define I2C_SCL D15 + #define I2C_SDA D14 + + #define SPI_CS D10 + #define SPI_MISO D12 + #define SPI_MOSI D11 + #define SPI_SCK D13 + + #define SPI_CSE D9 + +#else + #define I2C_SCL SDP_I2C_SCL + #define I2C_SDA SDP_I2C_SDA + + #define SPI_CS SDP_SPI_CS_A + #define SPI_MISO SDP_SPI_MISO + #define SPI_MOSI SDP_SPI_MOSI + #define SPI_SCK SDP_SPI_SCK + + #define SPI_CSE SDP_SPI_CS_B + +#endif + +#endif //_APP_CONFIG_H_ \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e app/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/main.cpp Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,790 @@ +/***************************************************************************** + * @file main.cpp + * @brief EVAL-TempSense-ARDZ example program + * @author ssmith (sean.smith@analog.com) +****************************************************************************** +* Copyright (c) 2019, 2021 Analog Devices, Inc. +* +* All rights reserved. +* +* 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. +* +* 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. +* +* 20180927-7CBSD SLA +*****************************************************************************/ +#include <cstdio> +#include <mbed.h> +#include <cmath> + +#include "app_config.h" +#include "spi.h" +#include "i2c.h" +#include "error.h" +#include "i2c_extra.h" +#include "spi_extra.h" + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "delay.h" +#include "platform_support.h" +#include "adt7420.h" +#include "adt7xxx_support.h" +#ifdef __cplusplus +} +#endif // __cplusplus + +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) + +#define TEMP_MIN -40 +#define TEMP_MAX 150 +#define MAX_HYST_TEMP 15 +#define MIN_HYST_TEMP 0 + +#define RESET_DELAY 500 +#define WAIT_MENU_TIME 1000 +#define NOT_USED 0 + +static void print_title(void); +static void print_prompt(void); +static uint8_t select_device(); +static void print_active_device(int ext_int_value); +static int get_menu_select(uint8_t *menu_select); +static uint8_t read_temperature(); +static uint8_t set_resolution(); +static uint8_t set_op_mode(); +static uint8_t bunch_of_temps(); +static uint8_t readback_reg(); +static uint8_t reset_interface(); +static uint8_t write_to_setpoint_reg(); +static uint8_t set_fault_queue(); +static uint8_t set_ct_int_config(); +static void microcontroller_reset(); +static int input_check(int input_val, + int lowest_accepted_val, + int highest_accepted_val, + int invalid_check); + + +/******************************************************************************/ +/************************** Variables Declarations ****************************/ +/******************************************************************************/ + +// Initialize the extra parameters for I2C initialization +mbed_i2c_init_param i2c_init_extra_params = { + .i2c_sda_pin = I2C_SDA, + .i2c_scl_pin = I2C_SCL +}; + +i2c_init_param i2c_params = { + .max_speed_hz = 100000, // i2c max speed (hz) + .slave_address = INT_I2C_ADDRESS, // i2c slave address + .extra = &i2c_init_extra_params // I2C extra init parameters +}; + +// Initialize the extra parameters for SPI initialization +mbed_spi_init_param spi_init_extra_params = { + .spi_miso_pin = SPI_MISO, + .spi_mosi_pin = SPI_MOSI, + .spi_clk_pin = SPI_SCK +}; + +spi_init_param spi_params = { + .max_speed_hz = 1000000, //SPI frequency (Hz) + .chip_select = SPI_CS, //Chip Select + .mode = SPI_MODE_3, //CPOL/CPHA settings for your device + .extra = &spi_init_extra_params // SPI extra init parameters +}; + +adt7420_init_param init_params = { + .resolution_setting = NOT_USED, //Resolution setting + .active_device = ACTIVE_DEVICE //Set this in app_config.h +}; + +adt7420_dev *device; + +registers_e registers; + +int32_t connected = -1; +uint8_t device_id = 0; + + +int main() +{ + uint8_t menu_select = 0; + + print_title(); + + device_id = select_device(); + + connected = adt7420_init(&device, init_params); + + if (connected != SUCCESS) { + printf(EOL EOL " Connection to device failed :(" EOL); + printf(" ...Restarting application... " EOL); + mdelay(WAIT_MENU_TIME); + microcontroller_reset(); + } else { + printf(EOL EOL " Connection to device succeeded!" EOL); + } + + while (connected == SUCCESS) { + menu_select = 0; + print_active_device(device_id); + print_prompt(); + + if (get_menu_select(&menu_select) == FAILURE) + printf(EOL "***** Returning to main menu *****" EOL); + else { + switch (menu_select) { + case 1: + read_temperature(); + break; + case 2: + set_resolution(); + break; + case 3: + set_op_mode(); + break; + case 4: + bunch_of_temps(); + break; + case 5: + readback_reg(); + break; + case 6: + reset_interface(); + break; + case 7: + write_to_setpoint_reg(); + break; + case 8: + set_fault_queue(); + break; + case 9: + set_ct_int_config(); + break; + case 10: + /*Restore device registers to default values before restarting microcontroller*/ + reset_interface(); + microcontroller_reset(); + break; + default: + printf("Invalid option" EOL); + break; + } + } + mdelay(WAIT_MENU_TIME); //wait 1 second + } +} + + +/******************************************************************************* + * @brief Prints the title block. + *******************************************************************************/ +void print_title() +{ + printf("*****************************************************************" EOL); + printf("* EVAL-TempeSense-ARDZ Demonstration Program *" EOL); + printf("* *" EOL); + printf("* This program demonstrates communication with the ADT7xx *" EOL); + printf("* High-Accuracy digital temperature sensor family *" EOL); + printf("* It works with both SPI & I2C versions *" EOL); + printf("* *" EOL); + printf("*****************************************************************" EOL); +} + +/******************************************************************************* + * @brief Prints the "main menu" prompt to the console. + *******************************************************************************/ +void print_prompt() +{ + printf(EOL EOL "Command Summary:" EOL); + printf(" 1 -Read temperature" EOL); + printf(" 2 -Set resolution" EOL); + printf(" 3 -Set operation mode" EOL); + printf(" 4 -Poll temperature" EOL); + printf(" 5 -Read a register" EOL); + printf(" 6 -Reset the interface" EOL); + printf(" 7 -Write to a setpoint register" EOL); + printf(" 8 -Set Fault Queue configuration" EOL); + printf(" 9 -Set CT/INT polarity and mode" EOL); + printf(" 10 -Full System Reset" EOL); + printf(EOL); +} + +static int get_menu_select(uint8_t *menu_select) +{ + int invalid_check = scanf("%d",(int *) menu_select); + return input_check(*menu_select, 1, 10, invalid_check); +} + +/******************************************************************************* + * @brief - Select the serial interface (SPI/I2C) and device + * based on the part family. + * - Only one device and interface can be active. + * Example: ADT7320 - SPI (Internal or Remote device) + * ADT7420 - I2C (Internal or Remote device) + * + * @param None + * + * @return new_dev - Return device selected + * Example: 1 - Internal(Main PCB) + * 2 - Remote (External PCB) + *******************************************************************************/ +uint8_t select_device() +{ + printf("Please select interface by choosing a device:" EOL); + printf(" 1- ADT7320 (SPI)" EOL); + printf(" 2- ADT7420 (I2C)" EOL); + printf(" Select an option: "); + + int invalid_check, new_interface = 0; + invalid_check = scanf("%d", &new_interface); + + //Prompts for user input while correct interface is not selected + while (input_check(new_interface, 1, 2, invalid_check) == FAILURE) { + printf("Please select interface by choosing a device:" EOL); + printf(" 1- ADT7320 (SPI)" EOL); + printf(" 2- ADT7420 (I2C)" EOL); + printf(" Select an option: "); + invalid_check = scanf("%d", &new_interface); + } + printf("%d", new_interface); + + switch (new_interface) { + case 1: + printf(" ADT7320 sensor selected!" EOL EOL); + init_params.active_device = ID_ADT7320; + init_params.interface_init.spi_init = spi_params; + break; + case 2: + printf(" ADT7420 sensor selected!" EOL EOL); + init_params.active_device = ID_ADT7420; + init_params.interface_init.i2c_init = i2c_params; + break; + } + + printf("Available devices:" EOL); + printf(" 1- Internal (Main PCB)" EOL); + printf(" 2- Remote (External PCB)" EOL); + printf(" Select an option: "); + + int new_dev = 0; + invalid_check = scanf("%d", &new_dev); + + //Prompts for user input while correct device is not selected + while (input_check(new_dev, 1, 2, invalid_check) == FAILURE) { + printf("Device select:" EOL); + printf(" 1- Internal (Main PCB)" EOL); + printf(" 2- Remote (External PCB)" EOL); + printf(" Select an option: "); + invalid_check = scanf("%d", &new_dev); + } + + printf("%d", new_dev); + + switch (new_dev) { + case 1: + printf(" Internal sensor selected!"); + init_params.interface_init.i2c_init.slave_address = INT_I2C_ADDRESS; + init_params.interface_init.spi_init.chip_select = SPI_CS; + break; + case 2: + printf(" External sensor selected!"); + init_params.interface_init.i2c_init.slave_address = EXT_I2C_ADDRESS; + init_params.interface_init.spi_init.chip_select = SPI_CSE; + break; + } + + return new_dev; +} + +/******************************************************************************* + * @brief - Reads and prints the temperature in Celsius Degree + * + * @param None + * + * @return - Return SUCCESS flag - currently unused. + *******************************************************************************/ +static uint8_t read_temperature() +{ + float temp = adt7420_get_temperature(device); + + printf("Current temperature:%.3f C", temp); + return SUCCESS; +} + +/******************************************************************************* + * @brief -Set the device resolution for 13 or 16 bits + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t set_resolution() +{ + printf(" Available resolutions:" EOL); + printf(" 1- 13-bit" EOL); + printf(" 2- 16-bit" EOL); + printf(" Select an option: "); + + int new_res, invalid_check = 0; + invalid_check = scanf("%d", &new_res); + + if (input_check(new_res, 1, 2, invalid_check) == FAILURE) { + return FAILURE; + } else { + printf("%d" EOL, new_res); + new_res = (new_res == 1) ? 0 : 1; + adt7420_set_resolution(device, new_res); + printf("Set resolution to %d-bit", (13 + 3 * new_res)); + return SUCCESS; + } +} + +/******************************************************************************* + * @brief - Set the device operation mode + * (Continuous conversion, One-shot, SPS, Shutdown). + * - Consult datasheet for more information. + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t set_op_mode() +{ + printf(" Available operation modes:" EOL); + printf(" 1- Continuous conversion mode (default)" EOL); + printf(" 2- One-shot mode" EOL); + printf(" 3- 1 SPS mode" EOL); + printf(" 4- Shutdown" EOL); + printf(" Select a mode: "); + + int new_mode, invalid_check = 0; + invalid_check = scanf("%d", &new_mode); + if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) { + return FAILURE; + } else { + printf("%d" EOL, new_mode); + switch (new_mode) { + case 1: + adt7420_set_operation_mode(device, ADT7420_OP_MODE_CONT_CONV); + break; + case 2: + /*When One shot mode is set completes one conversion and immediately goes to shutdown mode*/ + adt7420_set_operation_mode(device, ADT7420_OP_MODE_ONE_SHOT); + printf( EOL" One Shot mode enabled, device will enter shutdown mode once a conversion is complete." + EOL); + printf(" See page 10 in datasheet for details." EOL); + break; + case 3: + adt7420_set_operation_mode(device, ADT7420_OP_MODE_1_SPS); + break; + case 4: + adt7420_set_operation_mode(device, ADT7420_OP_MODE_SHUTDOWN); + break; + default: + printf("Invalid option" EOL); + break; + } + return SUCCESS; + } +} + +/******************************************************************************* + * @brief - Prints poll of temperature based on the frequency of readings and + * number of samples. + * + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t bunch_of_temps() +{ + printf(" Enter number of desired samples: "); + int num_samples, invalid_check = 1; + + invalid_check = scanf("%d", &num_samples); + if (input_check(num_samples, 1, 2000000, invalid_check) == FAILURE) { + return FAILURE; + } + printf("%d" EOL, num_samples); + + printf(" Enter a desired frequency in samples/sec (max 10): "); + int sample_freq = 1; + invalid_check = scanf("%d", &sample_freq); + if (input_check(sample_freq, 1, 10, invalid_check) == FAILURE) { + return FAILURE; + } + sample_freq = constrain(sample_freq, 1, 10); + printf("%d", sample_freq); + + uint32_t delay_sec = 1000000 / sample_freq; + + printf(" Gathering %d seconds of samples" EOL, num_samples/sample_freq); + printf("Press enter to continue and then press again to quit" EOL); + getchar(); + + for (int i = 0; i < num_samples; i++) { + if(getchar_noblock()) { + return SUCCESS; + } else { + printf(" Sample:%d: Temperature:", i + 1); + float temp = adt7420_get_temperature(device); + printf("%.4f" EOL, temp); + udelay(delay_sec); + } + } + return SUCCESS; +} + +/******************************************************************************* + * @brief - Reads back data store in device registers + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ + +static uint8_t readback_reg() +{ + printf(" Available registers:" EOL); + printf(" 1- Status" EOL); + printf(" 2- Configuration" EOL); + printf(" 3- Temperature" EOL); + printf(" 4- ID" EOL); + printf(" 5- Critical Temperature setpoint" EOL); + printf(" 6- Hysteresis Temperature setpoint" EOL); + printf(" 7- Temperature high setpoint" EOL); + printf(" 8- Temperature low setpoint" EOL); + printf(" Select a mode: "); + + uint16_t read_value = 0; + int new_mode, invalid_check = 0; + invalid_check = scanf("%d", &new_mode); + if (input_check(new_mode, 1, 8, invalid_check) == FAILURE) { + return FAILURE; + } + printf("%d" EOL, new_mode); + + switch (new_mode) { + case 1: + read_value = adt7420_get_register_address_and_value(device, REG_STATUS); + break; + case 2: + read_value = adt7420_get_register_address_and_value(device, REG_CONFIG); + break; + case 3: + read_value = adt7420_get_register_address_and_value(device, REG_TEMP); + break; + case 4: + read_value = adt7420_get_register_address_and_value(device, REG_ID); + break; + case 5: + read_value = adt7420_get_register_address_and_value(device, REG_T_CRIT); + break; + case 6: + read_value = adt7420_get_register_address_and_value(device, REG_HIST); + break; + case 7: + read_value = adt7420_get_register_address_and_value(device, REG_T_HIGH); + break; + case 8: + read_value = adt7420_get_register_address_and_value(device, REG_T_LOW); + break; + default: + break; + } + printf("Read value: 0x%x" EOL, read_value); + + return SUCCESS; +} + +/******************************************************************************* + * @brief - Resets device interface (SPI/I2C) (power-on reset) + * + * @param None + * + * @return - Return SUCCESS flag - currently unused. + *******************************************************************************/ +static uint8_t reset_interface() +{ + printf(" Resetting interface..." EOL); + adt7420_reset(device); + udelay(RESET_DELAY); + return SUCCESS; +} + +/******************************************************************************* + * @brief - Write to setpoint registers THIGH, TLOW, TCRIT and THYST. + - Values entered in Celsius and rounded to a near integer value. + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t write_to_setpoint_reg() +{ + printf(" Available registers:" EOL); + printf(" 1- Critical setpoint" EOL); + printf(" 2- Hystersis setpoint" EOL); + printf(" 3- Temperature high setpoint" EOL); + printf(" 4- Temperature low setpoint" EOL); + printf(" Select a mode: "); + + int new_mode, invalid_check = 0; + invalid_check = scanf("%d", &new_mode); + if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) { + return FAILURE; + } + printf("%d" EOL, new_mode); + + float temp_c; + + if(new_mode == 2) { + printf("Enter value to write (0 to 15) Celsius:"); + invalid_check = scanf("%f", &temp_c); + if(input_check(temp_c, MIN_HYST_TEMP, MAX_HYST_TEMP, + invalid_check) == FAILURE) { + return FAILURE; + } + } else { + printf("Enter value to write (in Celsius):"); + invalid_check = scanf("%f", &temp_c); + if(input_check(temp_c, TEMP_MIN, TEMP_MAX, invalid_check) == FAILURE) { + return FAILURE; + } + } + + printf(" %.2f", temp_c); + + int16_t write_value; + + if(new_mode == 2) + write_value = round(temp_c); + else + write_value = round(128 * temp_c); + + switch (new_mode) { + case 1: + if (adt7420_wr_setpoint_reg(device, REG_T_CRIT, write_value) == SUCCESS) + printf(EOL "0x%x successfuly written" EOL, write_value); + else + printf(EOL "0x%x NOT successfuly written" EOL, write_value); + break; + case 2: + if (adt7420_wr_setpoint_reg(device, REG_HIST, write_value) == SUCCESS) + printf(EOL "0x%x successfuly written (bits 7:4 are fixed at 0)" EOL, + write_value); + else + printf(EOL "0x%x NOT successfuly written" EOL, write_value); + break; + case 3: + if (adt7420_wr_setpoint_reg(device, REG_T_HIGH, write_value) == SUCCESS) + printf(EOL "0x%x successfuly written" EOL, write_value); + else + printf(EOL "0x%x NOT successfuly written" EOL, write_value); + break; + case 4: + if (adt7420_wr_setpoint_reg(device, REG_T_LOW, write_value) == SUCCESS) + printf(EOL "0x%x successfuly written" EOL, write_value); + else + printf(EOL "0x%x NOT successfuly written" EOL, write_value); + break; + default: + printf("Invalid selection - try again." EOL); + mdelay(2000); + break; + } + return SUCCESS; +} + +/******************************************************************************* + * @brief - Set the number of undertemperature/overtemperature faults + * that can occur before setting the INT and CT output pins + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t set_fault_queue() +{ + printf(" Available fault queue options:" EOL); + printf(" 1- 1 fault (default) " EOL); + printf(" 2- 2 faults" EOL); + printf(" 3- 3 faults" EOL); + printf(" 4- 4 faults" EOL); + printf(" Select a mode: "); + + int new_fault, invalid_check = 0; + invalid_check = scanf("%d", &new_fault); + if (input_check(new_fault, 1, 4, invalid_check) == FAILURE) { + return FAILURE; + } else { + printf("%d" EOL, new_fault); + + switch (new_fault) { + case 1: + adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_1_FAULT); + break; + case 2: + adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_2_FAULTS); + break; + case 3: + adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_3_FAULTS); + break; + case 4: + adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_4_FAULTS); + break; + default: + printf("Invalid option" EOL); + break; + } + return SUCCESS; + } +} + +/******************************************************************************* + * @brief - Set INT/CT Outputs pins to Comparator or Interrupt mode + * + * @param None + * + * @return - Return SUCCESS/FAILURE flags + *******************************************************************************/ +static uint8_t set_ct_int_config() +{ + int new_polarity = 0; + int new_mode, invalid_check = 0; + + printf(" Choose INT/CT mode:" EOL); + printf(" 1- Interrupt (default) " EOL); + printf(" 2- Comparator " EOL); + printf(" Select a mode: "); + invalid_check = scanf("%d", &new_mode); + if (input_check(new_mode, 1, 2, invalid_check) == FAILURE) { + return FAILURE; + } else { + printf("%d" EOL, new_mode); + new_mode = (new_mode == 1) ? 0 : 1; + adt7420_set_ct_int_mode(device, new_mode); + } + + printf(EOL " Set output polarity for Critical and Over/Under Temperature pin:" + EOL); + printf(" (Feature available only for internal sensors)." EOL); + + if(init_params.interface_init.i2c_init.slave_address == INT_I2C_ADDRESS || + init_params.interface_init.spi_init.chip_select == SPI_CS) { + + printf(" 1- Active Low (default) " EOL); + printf(" 2- Active High" EOL); + printf(" Select a mode: "); + + invalid_check = scanf("%d", &new_polarity); + if (input_check(new_polarity, 1, 2, invalid_check) == FAILURE) { + return FAILURE; + } else { + printf("%d" EOL, new_polarity); + new_polarity = (new_polarity == 1) ? 0 : 1; + adt7420_set_ct_int_polarity(device, new_polarity); + } + } + return SUCCESS; +} + +/******************************************************************************* + * @brief Reset microcontroller + * + * @param None + * + * @return None. + *******************************************************************************/ +static void microcontroller_reset() +{ + NVIC_SystemReset(); +} + +/******************************************************************************* + * @brief Prints the active device every time the main menu is redrawn + * + * @param external_internal_selection - External or Internal Chip Selected + * + * @return None. + *******************************************************************************/ +static void print_active_device(int external_internal_selection) +{ + const char* devices[7] = {EOL EOL " Active Device: ADT7410 I2C", + EOL EOL " Active Device: ADT7420 I2C", + EOL EOL " Active Device: ADT7422 I2C", + EOL EOL " Active Device: ADT7310 SPI", + EOL EOL " Active Device: ADT7311 SPI", + EOL EOL " Active Device: ADT7312 SPI", + EOL EOL " Active Device: ADT7320 SPI" + }; + + const char* external_internal_print[] = {" - Internal Chip " EOL, + " - External Chip " EOL + }; + + printf("%s %s", devices[init_params.active_device], + external_internal_print[external_internal_selection - 1]); +} + +/******************************************************************************* + * @brief Checks is an input is a digit and within valid range + * + * @param input_val - Value inputed by user + * @param lowest_accepted_val - Lowest acceptable value + * @param highest_accepted_val - Highest acceptable value + * @param invalid_check - Checks if unexpected type of data was entered in scanf + * + * @return SUCCESS/FAILURE Flags. + *******************************************************************************/ +static int input_check(int input_val, + int lowest_accepted_val, + int highest_accepted_val, + int invalid_check) +{ + if(invalid_check == 0 || input_val < lowest_accepted_val + || input_val > highest_accepted_val) { + printf(EOL EOL "***** Invalid entry: No changes made *****" EOL ); + mdelay(WAIT_MENU_TIME); + return FAILURE; + } + return SUCCESS; +}
diff -r 0228e21af1f0 -r 3e5f6cca357e app/mbed_platform_drivers.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/mbed_platform_drivers.lib Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/AnalogDevices/code/platform_drivers/#af1f2416dd26 \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e app/no-OS.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/no-OS.lib Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,1 @@ +https://github.com/analogdevicesinc/no-OS/#fa40d58aa19a2116731c4b568bf47b27f30daca7
diff -r 0228e21af1f0 -r 3e5f6cca357e app_config.h --- a/app_config.h Mon Dec 09 17:54:51 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/*************************************************************************//** - * @file app_config.h - * @brief Configuration file of AD5686 firmware example program - * @author ssmith (sean.smith@analog.com) -****************************************************************************** -* Copyright (c) 2019 Analog Devices, Inc. -* -* All rights reserved. -* -* 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. -* -* 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. -* -* 20180927-7CBSD SLA -*****************************************************************************/ - -#ifndef _APP_CONFIG_H_ -#define _APP_CONFIG_H_ - -#include <stdint.h> -#include "PinNames.h" - -#include "platform_drivers.h" -#ifdef __cplusplus -extern "C" -{ -#endif -#ifdef __cplusplus -#include "adt7420.h" -} -#endif - - -#ifndef ACTIVE_DEVICE -/** - #define your chosen device here from the - adt7420_type (adt7420.h) enum -*/ -#define ACTIVE_DEVICE ID_ADT7320 -#endif // ! - -/** - ADT7420 is a 7-bit I2C address - MBED API uses 8-bit addresses -*/ -#define EXTERNAL_I2C 0x49<<1 -#define INTERNAL_I2C 0x48<<1 - -/** - ChipSelect index definition for - PinName array in main.cpp -*/ -#define EXTERNAL_SPI 1 -#define INTERNAL_SPI 0 - -/** - Add a line-ending constant as different emulators - implement it in various ways - simple to change it here -*/ -#define EOL "\r\n" -/** - The ADI SDP_K1 can be used with both arduino headers - or the 120-pin SDP connector found on ADI evaluation - boards. The default is the SDP connector - - Uncomment the ARDUINO #define above to enable the ARDUINO connector -*/ - -#define ARDUINO - -#ifdef ARDUINO - #define I2C_SCL D15 - #define I2C_SDA D14 - - #define SPI_CS D10 - #define SPI_MISO D12 - #define SPI_MOSI D11 - #define SPI_SCK D13 - - #define SPI_CSE D9 - -#else - - #define I2C_SCL SDP_I2C_SCL - #define I2C_SDA SDP_I2C_SDA - - #define SPI_CS SDP_SPI_CS_A - #define SPI_MISO SDP_SPI_MISO - #define SPI_MOSI SDP_SPI_MOSI - #define SPI_SCK SDP_SPI_SCK - - #define SPI_CSE SDP_SPI_CS_B - -#endif - -#endif //_APP_CONFIG_H_ \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e main.cpp --- a/main.cpp Mon Dec 09 17:54:51 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,778 +0,0 @@ -/*************************************************************************//** - * @file main.cpp - * @brief Main application code for EVAL-TempSense-ARDZ mbed example program - * @author ssmith (sean.smith@analog.com) -****************************************************************************** -* Copyright (c) 2019 Analog Devices, Inc. -* -* All rights reserved. -* -* 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. -* -* 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. -* -* 20180927-7CBSD SLA -*****************************************************************************/ -#include <cstdio> -#include <mbed.h> -#include "app_config.h" -#include <cmath> - -#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) - -#define TEMP_MIN -40 -#define TEMP_MAX 150 -#define MAX_HYST_TEMP 15 -#define MIN_HYST_TEMP 0 - -#define RESET_DELAY 500 -#define WAIT_MENU_TIME 1 -#define NOT_USED 0 - -static void print_title(void); -static void print_prompt(void); -static uint8_t select_device(); -static void print_active_device(int ext_int_value); -static int get_menu_select(uint8_t *menu_select); -static uint8_t read_temperature(); -static uint8_t set_resolution(); -static uint8_t set_op_mode(); -static uint8_t bunch_of_temps(); -static uint8_t readback_reg(); -static uint8_t reset_interface(); -static uint8_t write_to_setpoint_reg(); -static uint8_t set_fault_queue(); -static uint8_t set_ct_int_config(); -static void microcontroller_reset(); -static int input_check(int input_val, - int lowest_accepted_val, - int highest_accepted_val, - int invalid_check); - -#ifdef __cplusplus -extern "C" -{ -#endif -#include "adt7420.h" -#ifdef __cplusplus -} -#endif // __cplusplus - - -/******************************************************************************/ -/************************** Variables Declarations ****************************/ -/******************************************************************************/ - -/** - The following definitions are a requirement for the platform_driver - Pin are changed if required in the app_config.h file - ***/ -PinName slave_selects[MAX_SLAVE_SELECTS] = { SPI_CS, SPI_CSE }; -mbed::SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); -mbed::I2C i2c(I2C_SDA, I2C_SCL); - - -i2c_init_param i2c_params = { - GENERIC_I2C, // i2c type - NOT_USED, // i2c id - 100000, // i2c max speed (hz) - INTERNAL_I2C, // i2c slave address (defined in app_config.h) -}; - -spi_init_param spi_params = { - MBED, //For future ADI use - GENERIC_SPI, //For future ADI use - NOT_USED, //id - 1000000, //SPI frequency (Hz) - SPI_MODE_3, //CPOL/CPHA settings for your device - INTERNAL_SPI, //CS index for PinName (defined in app_config.h) -}; - -adt7420_init_param init_params = { - i2c_params, // I2C parameters - spi_params, // SPI parameters - NOT_USED, //Resolution setting - ACTIVE_DEVICE, //Set this in app_config.h -}; - -adt7420_dev *device; - -registers_e registers; - - -int32_t connected = -1; -uint8_t device_id = 0; - -//Configure and instantiate the UART - PB10/11 -Serial pc(USBTX, USBRX, 115200); - - - -int main() -{ - uint8_t menu_select = 0; - - print_title(); - - device_id = select_device(); - - connected = adt7420_init(&device, init_params); - - if (connected != SUCCESS) { - pc.printf(EOL EOL " Connection to device failed :(" EOL); - pc.printf(" ...Restarting application... " EOL); - wait(WAIT_MENU_TIME); - microcontroller_reset(); - } else { - pc.printf(EOL EOL " Connection to device succeeded!" EOL); - } - - while (connected == SUCCESS) { - menu_select = 0; - print_active_device(device_id); - print_prompt(); - - if (get_menu_select(&menu_select) == FAILURE) - pc.printf(EOL "***** Returning to main menu *****" EOL); - else { - switch (menu_select) { - case 1: - read_temperature(); - break; - case 2: - set_resolution(); - break; - case 3: - set_op_mode(); - break; - case 4: - bunch_of_temps(); - break; - case 5: - readback_reg(); - break; - case 6: - reset_interface(); - break; - case 7: - write_to_setpoint_reg(); - break; - case 8: - set_fault_queue(); - break; - case 9: - set_ct_int_config(); - break; - case 10: - /*Restore device registers to default values before restarting microcontroller*/ - reset_interface(); - microcontroller_reset(); - break; - default: - pc.printf("Invalid option" EOL); - break; - } - } - wait(WAIT_MENU_TIME); //wait 1 second - } -} - - -/***************************************************************************//** - * @brief Prints the title block. - *******************************************************************************/ -void print_title() -{ - pc.printf("*****************************************************************" EOL); - pc.printf("* EVAL-TempeSense-ARDZ Demonstration Program -- (mbed) *" EOL); - pc.printf("* *" EOL); - pc.printf("* This program demonstrates communication with the ADT7xx *" EOL); - pc.printf("* High-Accuracy digital temperature sensor family *" EOL); - pc.printf("* It will also work with both SPI & I2C versions *" EOL); - pc.printf("* *" EOL); - pc.printf("* Set the baud rate to 115200 select the newline terminator. *" EOL); - pc.printf("*****************************************************************" EOL); -} - -/***************************************************************************//** - * @brief Prints the "main menu" prompt to the console. - *******************************************************************************/ -void print_prompt() -{ - pc.printf(EOL EOL "Command Summary:" EOL); - pc.printf(" 1 -Read temperature" EOL); - pc.printf(" 2 -Set resolution" EOL); - pc.printf(" 3 -Set operation mode" EOL); - pc.printf(" 4 -Poll temperature" EOL); - pc.printf(" 5 -Read a register" EOL); - pc.printf(" 6 -Reset the interface" EOL); - pc.printf(" 7 -Write to a setpoint register" EOL); - pc.printf(" 8 -Set Fault Queue configuration" EOL); - pc.printf(" 9 -Set CT/INT polarity and mode" EOL); - pc.printf(" 10 -Full System Reset" EOL); - pc.printf(EOL); -} - -static int get_menu_select(uint8_t *menu_select) -{ - int invalid_check = pc.scanf("%d",(int *) menu_select); - return input_check(*menu_select, 1, 10, invalid_check); -} - -/***************************************************************************//** - * @brief - Select the serial interface (SPI/I2C) and device - * based on the part family. - * - Only one device and interface can be active. - * Example: ADT7320 - SPI (Internal or Remote device) - * ADT7420 - I2C (Internal or Remote device) - * - * @param None - * - * @return new_dev - Return device selected - * Example: 1 - Internal(Main PCB) - * 2 - Remote (External PCB) - *******************************************************************************/ -uint8_t select_device() -{ - pc.printf("Please select interface by choosing a device:" EOL); - pc.printf(" 1- ADT7320 (SPI)" EOL); - pc.printf(" 2- ADT7420 (I2C)" EOL); - pc.printf(" Select an option: "); - - int invalid_check, new_interface = 0; - invalid_check = pc.scanf("%d", &new_interface); - - //Prompts for user input while correct interface is not selected - while (input_check(new_interface, 1, 2, invalid_check) == FAILURE) { - pc.printf("Please select interface by choosing a device:" EOL); - pc.printf(" 1- ADT7320 (SPI)" EOL); - pc.printf(" 2- ADT7420 (I2C)" EOL); - pc.printf(" Select an option: "); - invalid_check = pc.scanf("%d", &new_interface); - } - pc.printf("%d", new_interface); - - switch (new_interface) { - case 1: - pc.printf(" ADT7320 sensor selected!" EOL EOL); - init_params.act_device = ID_ADT7320; - break; - case 2: - pc.printf(" ADT7420 sensor selected!" EOL EOL); - init_params.act_device = ID_ADT7420; - break; - } - - pc.printf("Available devices:" EOL); - pc.printf(" 1- Internal (Main PCB)" EOL); - pc.printf(" 2- Remote (External PCB)" EOL); - pc.printf(" Select an option: "); - - int new_dev = 0; - invalid_check = pc.scanf("%d", &new_dev); - - //Prompts for user input while correct device is not selected - while (input_check(new_dev, 1, 2, invalid_check) == FAILURE) { - pc.printf("Device select:" EOL); - pc.printf(" 1- Internal (Main PCB)" EOL); - pc.printf(" 2- Remote (External PCB)" EOL); - pc.printf(" Select an option: "); - invalid_check = pc.scanf("%d", &new_dev); - } - - pc.printf("%d", new_dev); - - switch (new_dev) { - case 1: - pc.printf(" Internal sensor selected!"); - init_params.mbed_i2c_init.slave_address = INTERNAL_I2C; - init_params.mbed_spi_init.chip_select = INTERNAL_SPI; - break; - case 2: - pc.printf(" External sensor selected!"); - init_params.mbed_i2c_init.slave_address = EXTERNAL_I2C; - init_params.mbed_spi_init.chip_select = EXTERNAL_SPI; - break; - } - - return new_dev; -} - -/***************************************************************************//** - * @brief - Reads and prints the temperature in Celsius Degree - * - * @param None - * - * @return - Return SUCCESS flag - currently unused. - *******************************************************************************/ -static uint8_t read_temperature() -{ - float temp = adt7420_get_temperature(device); - - pc.printf("Current temperature:%.3f C", temp); - return SUCCESS; -} - -/***************************************************************************//** - * @brief -Set the device resolution for 13 or 16 bits - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t set_resolution() -{ - pc.printf(" Available resolutions:" EOL); - pc.printf(" 1- 13-bit" EOL); - pc.printf(" 2- 16-bit" EOL); - pc.printf(" Select an option: "); - - int new_res, invalid_check = 0; - invalid_check = pc.scanf("%d", &new_res); - - if (input_check(new_res, 1, 2, invalid_check) == FAILURE) { - return FAILURE; - } else { - pc.printf("%d" EOL, new_res); - new_res = (new_res == 1) ? 0 : 1; - adt7420_set_resolution(device, new_res); - pc.printf("Set resolution to %d-bit", (13 + 3 * new_res)); - return SUCCESS; - } -} - -/***************************************************************************//** - * @brief - Set the device operation mode - * (Continuous conversion, One-shot, SPS, Shutdown). - * - Consult datasheet for more information. - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t set_op_mode() -{ - pc.printf(" Available operation modes:" EOL); - pc.printf(" 1- Continuous conversion mode (default)" EOL); - pc.printf(" 2- One-shot mode" EOL); - pc.printf(" 3- 1 SPS mode" EOL); - pc.printf(" 4- Shutdown" EOL); - pc.printf(" Select a mode: "); - - int new_mode, invalid_check = 0; - invalid_check = pc.scanf("%d", &new_mode); - if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) { - return FAILURE; - } else { - pc.printf("%d" EOL, new_mode); - switch (new_mode) { - case 1: - adt7420_set_operation_mode(device, ADT7420_OP_MODE_CONT_CONV); - break; - case 2: - /*When One shot mode is set completes one conversion and immediately goes to shutdown mode*/ - adt7420_set_operation_mode(device, ADT7420_OP_MODE_ONE_SHOT); - pc.printf( EOL" One Shot mode enabled, device will enter shutdown mode once a conversion is complete." EOL); - pc.printf(" See page 10 in datasheet for details." EOL); - break; - case 3: - adt7420_set_operation_mode(device, ADT7420_OP_MODE_1_SPS); - break; - case 4: - adt7420_set_operation_mode(device, ADT7420_OP_MODE_SHUTDOWN); - break; - default: - pc.printf("Invalid option" EOL); - break; - } - return SUCCESS; - } -} - -/***************************************************************************//** - * @brief - Prints poll of temperature based on the frequency of readings and - * number of samples. - * - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t bunch_of_temps() -{ - pc.printf(" Enter number of desired samples: "); - int num_samples, invalid_check = 1; - - invalid_check = pc.scanf("%d", &num_samples); - if (input_check(num_samples, 1, 2000000, invalid_check) == FAILURE) { - return FAILURE; - } - pc.printf("%d" EOL, num_samples); - - pc.printf(" Enter a desired frequency in samples/sec (max 10): "); - int sample_freq = 1; - invalid_check = pc.scanf("%d", &sample_freq); - if (input_check(sample_freq, 1, 10, invalid_check) == FAILURE) { - return FAILURE; - } - sample_freq = constrain(sample_freq, 1, 10); - pc.printf("%d", sample_freq); - - uint32_t delay_sec = 1000000 / sample_freq; - - pc.printf(" Gathering %d seconds of samples" EOL, num_samples/sample_freq); - pc.printf("Press enter to continue and then press again to quit" EOL); - getchar(); - - for (int i = 0; i < num_samples; i++) { - if(pc.readable()) { - return SUCCESS; - } else { - pc.printf(" Sample:%d: Temperature:", i + 1); - float temp = adt7420_get_temperature(device); - pc.printf("%.4f" EOL, temp); - wait_us(delay_sec); - } - } - return SUCCESS; -} - -/***************************************************************************//** - * @brief - Reads back data store in device registers - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ - -static uint8_t readback_reg() -{ - pc.printf(" Available registers:" EOL); - pc.printf(" 1- Status" EOL); - pc.printf(" 2- Configuration" EOL); - pc.printf(" 3- Temperature" EOL); - pc.printf(" 4- ID" EOL); - pc.printf(" 5- Critical Temperature setpoint" EOL); - pc.printf(" 6- Hysteresis Temperature setpoint" EOL); - pc.printf(" 7- Temperature high setpoint" EOL); - pc.printf(" 8- Temperature low setpoint" EOL); - pc.printf(" Select a mode: "); - - uint16_t read_value = 0; - int new_mode, invalid_check = 0; - invalid_check = pc.scanf("%d", &new_mode); - if (input_check(new_mode, 1, 8, invalid_check) == FAILURE) { - return FAILURE; - } - pc.printf("%d" EOL, new_mode); - - switch (new_mode) { - case 1: - read_value = get_register_value(device, REG_STATUS); - break; - case 2: - read_value = get_register_value(device, REG_CONFIG); - break; - case 3: - read_value = get_register_value(device, REG_TEMP); - break; - case 4: - read_value = get_register_value(device, REG_ID); - break; - case 5: - read_value = get_register_value(device, REG_T_CRIT); - break; - case 6: - read_value = get_register_value(device, REG_HIST); - break; - case 7: - read_value = get_register_value(device, REG_T_HIGH); - break; - case 8: - read_value = get_register_value(device, REG_T_LOW); - break; - default: - break; - } - pc.printf("Read value: 0x%x" EOL, read_value); - - return SUCCESS; -} - -/***************************************************************************//** - * @brief - Resets device interface (SPI/I2C) (power-on reset) - * - * @param None - * - * @return - Return SUCCESS flag - currently unused. - *******************************************************************************/ -static uint8_t reset_interface() -{ - pc.printf(" Resetting interface..." EOL); - adt7420_reset_interface(device); - wait_us(RESET_DELAY); - return SUCCESS; -} - -/***************************************************************************//** - * @brief - Write to setpoint registers THIGH, TLOW, TCRIT and THYST. - - Values entered in Celsius and rounded to a near integer value. - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t write_to_setpoint_reg() -{ - pc.printf(" Available registers:" EOL); - pc.printf(" 1- Critical setpoint" EOL); - pc.printf(" 2- Hystersis setpoint" EOL); - pc.printf(" 3- Temperature high setpoint" EOL); - pc.printf(" 4- Temperature low setpoint" EOL); - pc.printf(" Select a mode: "); - - int new_mode, invalid_check = 0; - invalid_check = pc.scanf("%d", &new_mode); - if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) { - return FAILURE; - } - pc.printf("%d" EOL, new_mode); - - float temp_c; - - if(new_mode == 2) { - pc.printf("Enter value to write (0 to 15) Celsius:"); - invalid_check = pc.scanf("%f", &temp_c); - if(input_check(temp_c, MIN_HYST_TEMP, MAX_HYST_TEMP, invalid_check) == FAILURE) { - return FAILURE; - } - } else { - pc.printf("Enter value to write (in Celsius):"); - invalid_check = pc.scanf("%f", &temp_c); - if(input_check(temp_c, TEMP_MIN, TEMP_MAX, invalid_check) == FAILURE){ - return FAILURE; - } - } - - pc.printf(" %.2f", temp_c); - - int16_t write_value; - - if(new_mode == 2) - write_value = round(temp_c); - else - write_value = round(128 * temp_c); - - switch (new_mode) { - case 1: - if (adt7420_wr_setpoint_reg(device, REG_T_CRIT, write_value) == SUCCESS) - pc.printf(EOL "0x%x successfuly written" EOL, write_value); - else - pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value); - break; - case 2: - if (adt7420_wr_setpoint_reg(device, REG_HIST, write_value) == SUCCESS) - pc.printf(EOL "0x%x successfuly written (bits 7:4 are fixed at 0)" EOL, write_value); - else - pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value); - break; - case 3: - if (adt7420_wr_setpoint_reg(device, REG_T_HIGH, write_value) == SUCCESS) - pc.printf(EOL "0x%x successfuly written" EOL, write_value); - else - pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value); - break; - case 4: - if (adt7420_wr_setpoint_reg(device, REG_T_LOW, write_value) == SUCCESS) - pc.printf(EOL "0x%x successfuly written" EOL, write_value); - else - pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value); - break; - default: - pc.printf("Invalid selection - try again." EOL); - wait(2); - break; - } - return SUCCESS; -} - -/***************************************************************************//** - * @brief - Set the number of undertemperature/overtemperature faults - * that can occur before setting the INT and CT output pins - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t set_fault_queue() -{ - pc.printf(" Available fault queue options:" EOL); - pc.printf(" 1- 1 fault (default) " EOL); - pc.printf(" 2- 2 faults" EOL); - pc.printf(" 3- 3 faults" EOL); - pc.printf(" 4- 4 faults" EOL); - pc.printf(" Select a mode: "); - - int new_fault, invalid_check = 0; - invalid_check = pc.scanf("%d", &new_fault); - if (input_check(new_fault, 1, 4, invalid_check) == FAILURE) { - return FAILURE; - } else { - pc.printf("%d" EOL, new_fault); - - switch (new_fault) - { - case 1: - adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_1_FAULT); - break; - case 2: - adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_2_FAULTS); - break; - case 3: - adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_3_FAULTS); - break; - case 4: - adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_4_FAULTS); - break; - default: - pc.printf("Invalid option" EOL); - break; - } return SUCCESS; - } -} - -/***************************************************************************//** - * @brief - Set INT/CT Outputs pins to Comparator or Interrupt mode - * - * @param None - * - * @return - Return SUCCESS/FAILURE flags - *******************************************************************************/ -static uint8_t set_ct_int_config() -{ - int new_polarity = 0; - int new_mode, invalid_check = 0; - - pc.printf(" Choose INT/CT mode:" EOL); - pc.printf(" 1- Interrupt (default) " EOL); - pc.printf(" 2- Comparator " EOL); - pc.printf(" Select a mode: "); - invalid_check = pc.scanf("%d", &new_mode); - if (input_check(new_mode, 1, 2, invalid_check) == FAILURE) { - return FAILURE; - } else { - pc.printf("%d" EOL, new_mode); - new_mode = (new_mode == 1) ? 0 : 1; - adt7420_set_ct_int_mode(device, new_mode); - } - - pc.printf(EOL " Set output polarity for Critical and Over/Under Temperature pin:" EOL); - pc.printf(" (Feature available only for internal sensors)." EOL); - - if(init_params.mbed_i2c_init.slave_address == INTERNAL_I2C || - init_params.mbed_spi_init.chip_select == INTERNAL_SPI) { - - pc.printf(" 1- Active Low (default) " EOL); - pc.printf(" 2- Active High" EOL); - pc.printf(" Select a mode: "); - - invalid_check = pc.scanf("%d", &new_polarity); - if (input_check(new_polarity, 1, 2, invalid_check) == FAILURE) { - return FAILURE; - } else { - pc.printf("%d" EOL, new_polarity); - new_polarity = (new_polarity == 1) ? 0 : 1; - adt7420_set_ct_int_polarity(device, new_polarity); - } - } - return SUCCESS; -} - -/***************************************************************************//** - * @brief Reset microcontroller - * - * @param None - * - * @return None. - *******************************************************************************/ -static void microcontroller_reset() -{ - NVIC_SystemReset(); -} - -/***************************************************************************//** - * @brief Prints the active device every time the main menu is redrawn - * - * @param external_internal_selection - External or Internal Chip Selected - * - * @return None. - *******************************************************************************/ -static void print_active_device(int external_internal_selection) -{ - const char* devices[7] = {EOL EOL " Active Device: ADT7410 I2C" , - EOL EOL " Active Device: ADT7420 I2C", - EOL EOL " Active Device: ADT7422 I2C", - EOL EOL " Active Device: ADT7310 SPI", - EOL EOL " Active Device: ADT7311 SPI", - EOL EOL " Active Device: ADT7312 SPI", - EOL EOL " Active Device: ADT7320 SPI"}; - - const char* external_internal_print[] = {" - Internal Chip " EOL, - " - External Chip " EOL }; - - pc.printf("%s %s", devices[init_params.act_device], external_internal_print[external_internal_selection - 1]); -} - -/***************************************************************************//** - * @brief Checks is an input is a digit and within valid range - * - * @param input_val - Value inputed by user - * @param lowest_accepted_val - Lowest acceptable value - * @param highest_accepted_val - Highest acceptable value - * @param invalid_check - Checks if unexpected type of data was entered in scanf - * - * @return SUCCESS/FAILURE Flags. - *******************************************************************************/ - static int input_check(int input_val, - int lowest_accepted_val, - int highest_accepted_val, - int invalid_check) - { - if(invalid_check == 0 || input_val < lowest_accepted_val || input_val > highest_accepted_val) { - pc.printf(EOL EOL "***** Invalid entry: No changes made *****" EOL ); - wait(WAIT_MENU_TIME); - return FAILURE; - } - return SUCCESS; -} \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e mbed-os.lib --- a/mbed-os.lib Mon Dec 09 17:54:51 2019 +0000 +++ b/mbed-os.lib Fri Sep 24 15:22:13 2021 +0100 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-os/#9cab58358b338a3a7d7de258090bf0b500b2be97 +https://github.com/ARMmbed/mbed-os/#a2ada74770f043aff3e61e29d164a8e78274fcd4 \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e mbed_app.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_app.json Fri Sep 24 15:22:13 2021 +0100 @@ -0,0 +1,15 @@ +{ + "config": { + "usb_speed": { + "help": "USE_USB_OTG_FS or USE_USB_OTG_HS or USE_USB_HS_IN_FS", + "value": "USE_USB_OTG_HS" + } + }, + "requires": ["bare-metal", "drivers-usb", "events"], + "target_overrides": { + "*": { + "platform.default-serial-baud-rate": 115200, + "target.printf_lib": "std" + } + } +} \ No newline at end of file
diff -r 0228e21af1f0 -r 3e5f6cca357e platform_drivers.lib --- a/platform_drivers.lib Mon Dec 09 17:54:51 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://os.mbed.com/teams/AnalogDevices/code/platform_drivers/#efb143ea4191