mbed API implementation for AT30TSE75X , EEPROM + Temperature sensor.

Files at this revision

API Documentation at this revision

Comitter:
akhilpanayam
Date:
Tue Mar 22 04:58:03 2016 +0000
Commit message:
Initial Commit with implementations.

Changed in this revision

AT30TSE75X.cpp Show annotated file Show diff for this revision Revisions of this file
AT30TSE75X.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AT30TSE75X.cpp	Tue Mar 22 04:58:03 2016 +0000
@@ -0,0 +1,73 @@
+#include "AT30TSE75X.h"
+
+AT30TSE75X::AT30TSE75X(PinName sda, PinName scl) : at30tse75x_i2c(sda, scl), resolution(AT30TSE_CONFIG_RES_9_bit) {
+    at30tse75x_i2c.frequency(10000);
+}
+AT30TSE75X::~AT30TSE75X() { }
+
+float AT30TSE75X::read_temp() {
+    uint8_t bufferwrite[1];
+    uint8_t buffer[2];
+    float temperature;
+    uint16_t data;
+    buffer[0] = 0;
+    buffer[1] = 0;
+
+    at30tse75x_i2c.read((AT30TSE_TEMPERATURE_TWI_ADDR << 1 ),(char *)buffer,AT30TSE_TEMPERATURE_REG_SIZE,false);
+
+
+    data = (buffer[0] << 8) | buffer[1];
+    int8_t sign = 1;
+
+    /* Check if negative and clear sign bit. */
+    if (data & (1 << 15)) {
+        sign *= -1;
+        data &= ~(1 << 15);
+    }
+
+    /* Convert to temperature. */
+    switch (this->resolution) {
+    case AT30TSE_CONFIG_RES_9_bit:
+        data = (data >> 7);
+        (temperature) = data * sign * 0.5;
+        break;
+
+    case AT30TSE_CONFIG_RES_10_bit:
+        data = (data >> 6);
+        (temperature) = data * sign * 0.25;
+        break;
+
+    case AT30TSE_CONFIG_RES_11_bit:
+        data = (data >> 5);
+        (temperature) = data * sign * 0.125;
+        break;
+
+    case AT30TSE_CONFIG_RES_12_bit:
+        data = (data >> 4);
+        (temperature) = data * sign * 0.0625;
+        break;
+
+    default:
+        break;
+    }
+    return temperature;
+}
+
+uint8_t AT30TSE75X:: read_eeprom(uint8_t *data, uint8_t length, uint8_t word_addr, uint8_t page) {  
+    uint8_t buff[20];
+    buff[0]  = (word_addr & 0x0F) | ((0x0F & page) << 4);
+        
+    at30tse75x_i2c.write((int)(AT30TSE_EEPROM_TWI_ADDR << 1),(char *)buff,1,false);
+    return at30tse75x_i2c.read((int)(AT30TSE_EEPROM_TWI_ADDR << 1),(char *)data,length,false);  
+}
+
+uint8_t AT30TSE75X:: write_eeprom(uint8_t *data, uint8_t length, uint8_t word_addr, uint8_t page)
+{
+    uint8_t buff[length+1];;
+    buff[0] = (word_addr & 0x0F) | ((0x0F & page) << 4);
+    for(int i = 0; i < length; i++)
+    {
+        buff[i+1] = *data++;
+    }
+    return  at30tse75x_i2c.write((int)(AT30TSE_EEPROM_TWI_ADDR << 1),(char *)buff,(length + 1),false);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AT30TSE75X.h	Tue Mar 22 04:58:03 2016 +0000
@@ -0,0 +1,71 @@
+#ifndef AT30TSE75X_H
+#define AT30TSE75X_H
+
+#include "mbed.h"
+
+#define AT30TSE_TEMPERATURE_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_TEMP | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x07))
+
+/* AT30TSE75x Device Type ID for Temperature Sensor: 0b1001xxx */
+#define AT30TSE75X_DEVICE_TYPE_ID_TEMP    0x48
+/* AT30TSE75x Device Type ID for EEPROM: 0b1010xxx */
+#define AT30TSE75X_DEVICE_TYPE_ID_EEPROM  0x50
+
+#define BOARD_AT30TSE_DEVICE_ADDR  0x07 /* 0b111 */ /*CAn be varied according to the condition of A0, A1, A2*/
+
+#define AT30TSE_CONFIG_RES_9_bit    0
+#define AT30TSE_CONFIG_RES_10_bit   1
+#define AT30TSE_CONFIG_RES_11_bit   2
+#define AT30TSE_CONFIG_RES_12_bit   3
+
+#define AT30TSE_TEMPERATURE_REG_SIZE    2
+
+#if (BOARD_USING_AT30TSE != AT30TSE752) && \
+(BOARD_USING_AT30TSE != AT30TSE754) && \
+(BOARD_USING_AT30TSE != AT30TSE758) && \
+(BOARD_USING_AT30TSE != AT30TS75)
+/* Using AT30TSE758 in Default */
+#define BOARD_USING_AT30TSE  AT30TSE758
+#endif
+
+/* Setting the AT30TSE75x Temperature Sensor Address */
+#define AT30TSE_TEMPERATURE_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_TEMP | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x07))
+
+#define AT30TSE752                      1
+#define AT30TSE754                      2
+#define AT30TSE758                      3
+#define AT30TS75                        4
+
+#if BOARD_USING_AT30TSE == AT30TSE752
+#define AT30TSE_EEPROM_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_EEPROM | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x07))
+#elif BOARD_USING_AT30TSE == AT30TSE754
+#define AT30TSE_EEPROM_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_EEPROM | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x06))
+#elif BOARD_USING_AT30TSE == AT30TSE758
+#define AT30TSE_EEPROM_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_EEPROM | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x04))
+#elif BOARD_USING_AT30TSE != AT30TS75
+/* Using AT30TSE758 in Default */
+#define AT30TSE_EEPROM_TWI_ADDR  (AT30TSE75X_DEVICE_TYPE_ID_EEPROM | \
+(BOARD_AT30TSE_DEVICE_ADDR & 0x04))
+#endif
+
+class AT30TSE75X
+{
+public:
+  AT30TSE75X(PinName sda, PinName scl);
+  ~AT30TSE75X();
+
+  float read_temp();
+  uint8_t read_eeprom(uint8_t *data, uint8_t length, uint8_t word_addr, uint8_t page);
+  uint8_t write_eeprom(uint8_t *data, uint8_t length, uint8_t word_addr, uint8_t page);
+  
+  I2C at30tse75x_i2c;
+private:
+  uint8_t resolution;
+
+};
+
+#endif
\ No newline at end of file