From 2e82814c186e99b012b71ded1803889c9a1bca1f Mon Sep 17 00:00:00 2001 From: asterix Date: Mon, 5 Oct 2009 19:24:08 +0000 Subject: [PATCH] Add driver to read temperature from lm75 chip. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3033 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/cfg/cfg_lm75.h | 57 +++++++++++++++++++++++++++++ bertos/drv/lm75.c | 84 +++++++++++++++++++++++++++++++++++++++++++ bertos/drv/lm75.h | 58 ++++++++++++++++++++++++++++++ bertos/hw/hw_lm75.h | 49 +++++++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 bertos/cfg/cfg_lm75.h create mode 100644 bertos/drv/lm75.c create mode 100644 bertos/drv/lm75.h create mode 100644 bertos/hw/hw_lm75.h diff --git a/bertos/cfg/cfg_lm75.h b/bertos/cfg/cfg_lm75.h new file mode 100644 index 00000000..91b347ad --- /dev/null +++ b/bertos/cfg/cfg_lm75.h @@ -0,0 +1,57 @@ +/** + * \file + * + * + * \brief Configuration file for the LM75 sensor temperature. + * + * \author Daniele Basile + */ + +#ifndef CFG_LM75_H +#define CFG_LM75_H + +/** + * Module logging level. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_level" + */ +#define LM75_LOG_LEVEL LOG_LVL_WARN + +/** + * Module logging format. + * + * $WIZ$ type = "enum" + * $WIZ$ value_list = "log_format" + */ +#define LM75_LOG_FORMAT LOG_FMT_TERSE + +#endif /* CFG_AX25_H */ diff --git a/bertos/drv/lm75.c b/bertos/drv/lm75.c new file mode 100644 index 00000000..845fa3a4 --- /dev/null +++ b/bertos/drv/lm75.c @@ -0,0 +1,84 @@ +/** + * \file + * + * + * \brief LM75 sensor temperature family. + * + * \author Daniele Basile + * + */ + +#include "lm75.h" + +#include "hw/hw_lm75.h" + +#include "cfg/cfg_lm75.h" + +#include + +// Define logging setting (for cfg/log.h module). +#define LOG_LEVEL LM75_LOG_LEVEL +#define LOG_FORMAT LM75_LOG_FORMAT + +#include + +#include + +#define SELECT_ADDRESS(addr) LM75_ADDRESS_BYTE | (addr << 1) + +deci_celsius_t lm75_read(addr_t sens_addr) +{ + uint8_t data[2]; + int16_t degree; + int16_t deci_degree; + + i2c_start_w(SELECT_ADDRESS(sens_addr)); + i2c_put(LM75_PAD_BYTE); + i2c_start_r(SELECT_ADDRESS(sens_addr)); + i2c_recv(&data, sizeof(data)); + + degree = (uint16_t)data[0]; + deci_degree = (uint16_t)(((data[1] >> 7) & 1 ) * 5); + + LOG_INFO("[%d.%d C]\n", degree, deci_degree); + + return degree * 10 + deci_degree; +} + +void lm75_init(void) +{ + i2c_init(); + LOG_INFO("Init I2C module.\n"); + + LM75_HW_INIT(); +} + + diff --git a/bertos/drv/lm75.h b/bertos/drv/lm75.h new file mode 100644 index 00000000..8c7ee4e3 --- /dev/null +++ b/bertos/drv/lm75.h @@ -0,0 +1,58 @@ +/** + * \file + * + * + * \brief LM75 sensor temperature family. + * + * \author Daniele Basile + * + * $WIZ$ module_name = "lm75" + * $WIZ$ module_depends = "timer", "i2c" + * $WIZ$ module_configuration = "bertos/cfg/cfg_lm75.h" + * $WIZ$ module_hw = "bertos/hw/hw_lm75.h" + */ + +#ifndef DRV_LM75_H +#define DRV_LM75_H + +#include + +#define LM75_ADDRESS_BYTE 0x91 +#define LM75_PAD_BYTE 0x0 + +typedef int16_t deci_celsius_t; +typedef uint8_t addr_t; + +deci_celsius_t lm75_read(addr_t sens_addr); + +void lm75_init(void); + +#endif /* DRV_LM75_H */ diff --git a/bertos/hw/hw_lm75.h b/bertos/hw/hw_lm75.h new file mode 100644 index 00000000..290dae09 --- /dev/null +++ b/bertos/hw/hw_lm75.h @@ -0,0 +1,49 @@ +/** + * \file + * + * + * \brief Hardware macro definition. + * + * \author Daniele Basile + */ + +#ifndef HW_LM75_H +#define HW_LM75_H + +#warning TODO:This is an example implentation, you must implement it! + +#define LM75_HW_INIT() \ + do { \ + /* Pin init */\ + } while (0) + +#endif /* HW_LM75_H */ + -- 2.25.1