I2C-Library for various sensors

Files at this revision

API Documentation at this revision

Comitter:
JOEV
Date:
Wed Jul 31 13:38:00 2019 +0000
Commit message:
abcdef

Changed in this revision

twi_master.cpp Show annotated file Show diff for this revision Revisions of this file
twi_master.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 782435d2cc06 twi_master.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/twi_master.cpp	Wed Jul 31 13:38:00 2019 +0000
@@ -0,0 +1,110 @@
+/**
+ * @brief Implementation of TWI_Master class.
+ * 
+ * @file twi_master.cpp
+ * @author Joel von Rotz
+ * @date 18.07.2018
+ */
+#include "mbed.h"
+#include "twi_master.h"
+
+/**
+ * @brief Construct a new TWI_Master object. The given parameters should be all the necessary things to start
+ * interacting with the other libraries.
+ * 
+ * @param sda SDA-Pin
+ * @param scl SCL-Pin
+ * @param frequency     I2C-frequency (default: 400kHz)
+ */
+TWI_Master::TWI_Master(PinName sda, PinName scl, uint32_t frequency) : 
+        m_i2c_sensor(sda, scl)
+{
+    m_i2c_sensor.frequency(frequency);
+}
+
+/**
+ * @brief Writes data into specified address (changes every bit)
+ * 
+ * @param slave_address     register-address which will be written to 
+ * @param data              8-bit value that overwrites the register-value
+ */
+void        TWI_Master::i2c_write(uint8_t i2c_address, uint8_t slave_address, const uint8_t data)
+{
+    char writeArray[2] = {slave_address, data};
+    m_i2c_sensor.write(i2c_address, writeArray, 2, false);
+}
+
+/**
+ * @brief Writes bits by masking the necessary bits. The data variables will be normally masked with the mask 
+ * <code><strong>(data & mask)</strong></code>, the register will be masked by the inverted mask <code><strong>(register_value & ~mask)</strong></code>.
+ * What will be written to the register will be <code><strong> new_register_data = (data | register_value) </strong></code>.
+ * 
+ * @param slave_address     register-address that will be edited
+ * @param data              8-bit value that edit the editable bits (which are determined by the mask) 
+ * @param mask              Bits that want to be changed, all the other bits will be saved. 
+ */
+void        TWI_Master::i2c_writeBits(uint8_t i2c_address, uint8_t slave_address, const uint8_t data, uint8_t mask)
+{
+    char current_value;
+    char writeArray[2] = {slave_address, data};
+
+    //Get current value of desired register and mask it with mask-value
+    current_value = i2c_read(i2c_address, slave_address);
+    current_value &= ~mask;
+
+    //Combine Data with the new data (additionaly masking the data) and send it to the Sensor
+    writeArray[1] = current_value | (data & mask);
+
+    m_i2c_sensor.write(i2c_address, writeArray, 2, false);
+}
+
+/**
+ * @brief Reads multiple registers
+ * 
+ * @param slave_address     the start register-address
+ * @param data              array, which the functions saves the data to
+ * @param length            the length of the read-sequence
+ */
+void        TWI_Master::i2c_readSeries(uint8_t i2c_address, uint8_t slave_address, uint8_t *data, uint8_t length)
+{
+    char *data_array;
+    data_array = reinterpret_cast<char*>(data);
+
+    const char temp_address = slave_address;
+
+    m_i2c_sensor.write(i2c_address, &temp_address, 1, true);
+    m_i2c_sensor.read(i2c_address, data_array,length, false);
+}
+
+/**
+ * @brief Reads one register from the specified register-address.
+ * 
+ * @param slave_address     the desired register-address for reading
+ * @return uint8_t          returns read data
+ */
+uint8_t     TWI_Master::i2c_read(uint8_t i2c_address, uint8_t slave_address)
+{
+    char data;
+    const char temp_address = slave_address;
+    m_i2c_sensor.write(i2c_address, &temp_address, 1, true);
+    m_i2c_sensor.read(i2c_address, &data, 1, false);
+    return data;
+}
+
+/**
+ * @brief Reads one register from the specified address and masks it with
+ * the given mask.
+ * 
+ * @param slave_address     the desired register-address for reading
+ * @param mask              the mask for the desired bits
+ * @return uint8_t          returns the masked data
+ */
+uint8_t     TWI_Master::i2c_readBits(uint8_t i2c_address, uint8_t slave_address, uint8_t mask)
+{
+    char data;
+    const char temp_address = slave_address;
+    m_i2c_sensor.write(i2c_address, &temp_address, 1, true);
+    m_i2c_sensor.read(i2c_address, &data, 1, false);
+    return data & mask;
+}
+
diff -r 000000000000 -r 782435d2cc06 twi_master.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/twi_master.h	Wed Jul 31 13:38:00 2019 +0000
@@ -0,0 +1,37 @@
+/**
+ * @brief 
+ * 
+ * @file twi_master.h
+ * @author Joel von Rotz
+ * @date 18.07.2018
+ */
+#ifndef TWI_MASTER_H
+#define TWI_MASTER_H
+#include "mbed.h"
+
+/**
+ * @brief <strong>TWI_Master</strong> is used for interacting with different libraries of I2C sensors, which I wrote.
+ * This library has been inspired by the <a href="https://github.com/adafruit/Adafruit_Sensor">Adafruit Sensor-Library</a> 
+ * and the <a href="https://github.com/jrowberg/i2cdevlib/">I2Cdevlib</a> by jrowberg.
+ * \n\n
+ * It is not an I2C driver, since the existing I2C functions are used and new things, such as masking and individual 
+ * bit changes, are built in around them.
+ * \n\n
+ */
+class TWI_Master
+{
+public:
+    TWI_Master(PinName sda, PinName scl, uint32_t frequency = 400000);
+    void        i2c_write(uint8_t i2c_address, uint8_t slave_address, const uint8_t data);
+    void        i2c_writeBits(uint8_t i2c_address, uint8_t slave_address, const uint8_t data, uint8_t mask);
+    uint8_t     i2c_readBits(uint8_t i2c_address, uint8_t slave_address, uint8_t mask);
+    void        i2c_readSeries(uint8_t i2c_address, uint8_t slave_address, uint8_t *data, uint8_t length);
+    uint8_t     i2c_read(uint8_t i2c_address, uint8_t slave_address);
+
+private:
+    I2C         m_i2c_sensor;
+    uint32_t    m_i2c_frequency;
+};
+
+#endif
+