I2C device discovery and printout of known device names

Files at this revision

API Documentation at this revision

Comitter:
loopsva
Date:
Thu Jan 10 17:44:10 2019 +0000
Commit message:
General I2C device updates

Changed in this revision

i2cDevices.cpp Show annotated file Show diff for this revision Revisions of this file
i2cDevices.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r df49b3ed3502 i2cDevices.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i2cDevices.cpp	Thu Jan 10 17:44:10 2019 +0000
@@ -0,0 +1,751 @@
+#include "mbed.h"
+#include "i2cDevices.h"
+
+extern RawSerial pc;
+
+//--------------------------------------------------------------------------------------------------------------------------------------//
+//Constructor
+
+i2c_discovery::i2c_discovery(PinName sda, PinName scl, const char* name)  : _i2c(sda, scl) {
+        _i2c.frequency(100000);
+}
+
+//--------------------------------------------------------------------------------------------------------------------------------------//
+//Display detected i2c device name
+
+int i2c_discovery::showI2C(i2cDeviceFlags& i2cFlags, char addr) {
+    switch (addr) {
+#ifdef  I2C_0x02
+        case 0x02: 
+            pc.printf("%s\r\n", I2C_0x02);
+            i2cFlags.PCA9955_GGG_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x04
+        case 0x04: 
+            pc.printf("%s\r\n", I2C_0x04);
+            break;
+#endif
+#ifdef  I2C_0x06
+        case 0x06: 
+            pc.printf("%s\r\n", I2C_0x06);
+            break;
+#endif
+#ifdef  I2C_0x08
+        case 0x08: 
+            pc.printf("%s\r\n", I2C_0x08);
+            break;
+#endif
+#ifdef  I2C_0x0A
+        case 0x0A: 
+            pc.printf("%s\r\n", I2C_0x0A);
+            break;
+#endif
+#ifdef  I2C_0x0C
+        case 0x0C: 
+            pc.printf("%s\r\n", I2C_0x0C);
+            break;
+#endif
+#ifdef  I2C_0x0E
+        case 0x0E: 
+            pc.printf("%s\r\n", I2C_0x0E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x10
+        case 0x10: 
+            pc.printf("%s\r\n", I2C_0x10);
+            break;
+#endif
+#ifdef  I2C_0x12
+        case 0x12: 
+            pc.printf("%s\r\n", I2C_0x12);
+            break;
+#endif
+#ifdef  I2C_0x14
+        case 0x14: 
+            pc.printf("%s\r\n", I2C_0x14);
+            break;
+#endif
+#ifdef  I2C_0x16
+        case 0x16: 
+            pc.printf("%s\r\n", I2C_0x16);
+            break;
+#endif
+#ifdef  I2C_0x18
+        case 0x18: 
+            pc.printf("%s\r\n", I2C_0x18);
+            break;
+#endif
+#ifdef  I2C_0x1A
+        case 0x1A: 
+            pc.printf("%s\r\n", I2C_0x1A);
+            break;
+#endif
+#ifdef  I2C_0x1C
+        case 0x1C: 
+            pc.printf("%s\r\n", I2C_0x1C);
+            break;
+#endif
+#ifdef  I2C_0x1E
+        case 0x1E: 
+            pc.printf("%s\r\n", I2C_0x1E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x20
+        case 0x20: 
+            pc.printf("%s\r\n", I2C_0x20);
+            i2cFlags.VEML60xx_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x22
+        case 0x22: 
+            pc.printf("%s\r\n", I2C_0x22);
+            break;
+#endif
+#ifdef  I2C_0x24
+        case 0x24: 
+            pc.printf("%s\r\n", I2C_0x24);
+            break;
+#endif
+#ifdef  I2C_0x26
+        case 0x26: 
+            pc.printf("%s\r\n", I2C_0x26);
+            break;
+#endif
+#ifdef  I2C_0x28
+        case 0x28: 
+            pc.printf("%s\r\n", I2C_0x28);
+            break;
+#endif
+#ifdef  I2C_0x2A
+        case 0x2A: 
+            pc.printf("%s\r\n", I2C_0x2A);
+            break;
+#endif
+#ifdef  I2C_0x2C
+        case 0x2C: 
+            pc.printf("%s\r\n", I2C_0x2C);
+            break;
+#endif
+#ifdef  I2C_0x2E
+        case 0x2E: 
+            pc.printf("%s\r\n", I2C_0x2E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x30
+        case 0x30: 
+            pc.printf("%s\r\n", I2C_0x30);
+            break;
+#endif
+#ifdef  I2C_0x32
+        case 0x32: 
+            pc.printf("%s\r\n", I2C_0x32);
+            break;
+#endif
+#ifdef  I2C_0x34
+        case 0x34: 
+            pc.printf("%s\r\n", I2C_0x34);
+            break;
+#endif
+#ifdef  I2C_0x36
+        case 0x36: 
+            pc.printf("%s\r\n", I2C_0x36);
+            break;
+#endif
+#ifdef  I2C_0x38
+        case 0x38: 
+            pc.printf("%s\r\n", I2C_0x38);
+            i2cFlags.mma8451cs1_ok = true;
+            //fxos8700_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x3A
+        case 0x3A: 
+            pc.printf("%s\r\n", I2C_0x3A);
+            //fxos8700_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x3C
+        case 0x3C: 
+            pc.printf("%s\r\n", I2C_0x3C);
+            //fxos8700_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x3E
+        case 0x3E: 
+            pc.printf("%s\r\n", I2C_0x3E);
+            //fxos8700_ok = true;
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x40
+        case 0x40: 
+            pc.printf("%s\r\n", I2C_0x40);
+            break;
+#endif
+#ifdef  I2C_0x42
+        case 0x42: 
+            pc.printf("%s\r\n", I2C_0x42);
+            break;
+#endif
+#ifdef  I2C_0x44
+        case 0x44: 
+            pc.printf("%s\r\n", I2C_0x44);
+            break;
+#endif
+#ifdef  I2C_0x46
+        case 0x46: 
+            pc.printf("%s\r\n", I2C_0x46);
+            break;
+#endif
+#ifdef  I2C_0x48
+        case 0x48: 
+            pc.printf("%s\r\n", I2C_0x48);
+            break;
+#endif
+#ifdef  I2C_0x4A
+        case 0x4A: 
+            pc.printf("%s\r\n", I2C_0x4A);
+            break;
+#endif
+#ifdef  I2C_0x4C
+        case 0x4C: 
+            pc.printf("%s\r\n", I2C_0x4C);
+            break;
+#endif
+#ifdef  I2C_0x4E
+        case 0x4E: 
+            pc.printf("%s\r\n", I2C_0x4E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x50
+        case 0x50: 
+            pc.printf("%s\r\n", I2C_0x50);
+            break;
+#endif
+#ifdef  I2C_0x52
+        case 0x52: 
+            pc.printf("%s\r\n", I2C_0x52);
+            break;
+#endif
+#ifdef  I2C_0x54
+        case 0x54: 
+            pc.printf("%s\r\n", I2C_0x54);
+            break;
+#endif
+#ifdef  I2C_0x56
+        case 0x56: 
+            pc.printf("%s\r\n", I2C_0x56);
+            break;
+#endif
+#ifdef  I2C_0x58
+        case 0x58: 
+            pc.printf("%s\r\n", I2C_0x58);
+            break;
+#endif
+#ifdef  I2C_0x5A
+        case 0x5A: 
+            pc.printf("%s\r\n", I2C_0x5A);
+            break;
+#endif
+#ifdef  I2C_0x5C
+        case 0x5C: 
+            pc.printf("%s\r\n", I2C_0x5C);
+            break;
+#endif
+#ifdef  I2C_0x5E
+        case 0x5E: 
+            pc.printf("%s\r\n", I2C_0x5E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x60
+        case 0x60: 
+            pc.printf("%s\r\n", I2C_0x60);
+            break;
+#endif
+#ifdef  I2C_0x62
+        case 0x62: 
+            pc.printf("%s\r\n", I2C_0x62);
+            break;
+#endif
+#ifdef  I2C_0x64
+        case 0x64: 
+            pc.printf("%s\r\n", I2C_0x64);
+            break;
+#endif
+#ifdef  I2C_0x66
+        case 0x66: 
+            pc.printf("%s\r\n", I2C_0x66);
+            break;
+#endif
+#ifdef  I2C_0x68
+        case 0x68: 
+            pc.printf("%s\r\n", I2C_0x68);
+            break;
+#endif
+#ifdef  I2C_0x6A
+        case 0x6A: 
+            pc.printf("%s\r\n", I2C_0x6A);
+            break;
+#endif
+#ifdef  I2C_0x6C
+        case 0x6C: 
+            pc.printf("%s\r\n", I2C_0x6C);
+            break;
+#endif
+#ifdef  I2C_0x6E
+        case 0x6E: 
+            pc.printf("%s\r\n", I2C_0x6E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x70
+        case 0x70: 
+            pc.printf("%s\r\n", I2C_0x70);
+            i2cFlags.VEML6070_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x72
+        case 0x72: 
+            pc.printf("%s\r\n", I2C_0x72);
+            break;
+#endif
+#ifdef  I2C_0x74
+        case 0x74: 
+            pc.printf("%s\r\n", I2C_0x74);
+            break;
+#endif
+#ifdef  I2C_0x76
+        case 0x76: 
+            pc.printf("%s\r\n", I2C_0x76);
+            break;
+#endif
+#ifdef  I2C_0x78
+        case 0x78: 
+            pc.printf("%s\r\n", I2C_0x78);
+            break;
+#endif
+#ifdef  I2C_0x7A
+        case 0x7A: 
+            pc.printf("%s\r\n", I2C_0x7A);
+            break;
+#endif
+#ifdef  I2C_0x7C
+        case 0x7C: 
+            pc.printf("%s\r\n", I2C_0x7C);
+            break;
+#endif
+#ifdef  I2C_0x7E
+        case 0x7E: 
+            pc.printf("%s\r\n", I2C_0x7E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x80
+        case 0x80: 
+            pc.printf("%s\r\n", I2C_0x80);
+            i2cFlags.HTU21D_ok = true;
+            i2cFlags.INA219_MAX7300_gg_ok = true;
+            i2cFlags.INA230_MAX7300_gg_ok = true;
+            break;
+#endif
+#ifdef  I2C_0x82
+        case 0x82: 
+            pc.printf("%s\r\n", I2C_0x82);
+            break;
+#endif
+#ifdef  I2C_0x84
+        case 0x84: 
+            pc.printf("%s\r\n", I2C_0x84);
+            break;
+#endif
+#ifdef  I2C_0x86
+        case 0x86: 
+            pc.printf("%s\r\n", I2C_0x86);
+            break;
+#endif
+#ifdef  I2C_0x88
+        case 0x88: 
+            pc.printf("%s\r\n", I2C_0x88);
+            break;
+#endif
+#ifdef  I2C_0x8A
+        case 0x8A: 
+            pc.printf("%s\r\n", I2C_0x8A);
+            break;
+#endif
+#ifdef  I2C_0x8C
+        case 0x8C: 
+            pc.printf("%s\r\n", I2C_0x8C);
+            break;
+#endif
+#ifdef  I2C_0x8E
+        case 0x8E: 
+            pc.printf("%s\r\n", I2C_0x8E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0x90
+        case 0x90: 
+            pc.printf("%s\r\n", I2C_0x90);
+            break;
+#endif
+#ifdef  I2C_0x92
+        case 0x92: 
+            pc.printf("%s\r\n", I2C_0x92);
+            break;
+#endif
+#ifdef  I2C_0x94
+        case 0x94: 
+            pc.printf("%s\r\n", I2C_0x94);
+            break;
+#endif
+#ifdef  I2C_0x96
+        case 0x96: 
+            pc.printf("%s\r\n", I2C_0x96);
+            break;
+#endif
+#ifdef  I2C_0x98
+        case 0x98: 
+            pc.printf("%s\r\n", I2C_0x98);
+            break;
+#endif
+#ifdef  I2C_0x9A
+        case 0x9A: 
+            pc.printf("%s\r\n", I2C_0x9A);
+            break;
+#endif
+#ifdef  I2C_0x9C
+        case 0x9C: 
+            pc.printf("%s\r\n", I2C_0x9C);
+            break;
+#endif
+#ifdef  I2C_0x9E
+        case 0x9E: 
+            pc.printf("%s\r\n", I2C_0x9E);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xA0
+        case 0xA0: 
+            pc.printf("%s\r\n", I2C_0xA0);
+            i2cFlags.eeprom000_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xA2
+        case 0xA2: 
+            pc.printf("%s\r\n", I2C_0xA2);
+            break;
+#endif
+#ifdef  I2C_0xA4
+        case 0xA4: 
+            pc.printf("%s\r\n", I2C_0xA4);
+            break;
+#endif
+#ifdef  I2C_0xA6
+        case 0xA6: 
+            pc.printf("%s\r\n", I2C_0xA6);
+            break;
+#endif
+#ifdef  I2C_0xA8
+        case 0xA8: 
+            pc.printf("%s\r\n", I2C_0xA8);
+            break;
+#endif
+#ifdef  I2C_0xAA
+        case 0xAA: 
+            pc.printf("%s\r\n", I2C_0xAA);
+            i2cFlags.bq27210_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xAC
+        case 0xAC: 
+            pc.printf("%s\r\n", I2C_0xAC);
+            break;
+#endif
+#ifdef  I2C_0xAE
+        case 0xAE: 
+            pc.printf("%s\r\n", I2C_0xAE);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xB0
+        case 0xB0: 
+            pc.printf("%s\r\n", I2C_0xB0);
+            break;
+#endif
+#ifdef  I2C_0xB2
+        case 0xB2: 
+            pc.printf("%s\r\n", I2C_0xB2);
+            break;
+#endif
+#ifdef  I2C_0xB4
+        case 0xB4: 
+            pc.printf("%s\r\n", I2C_0xB4);
+            i2cFlags.ccs811_0_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xB6
+        case 0xB6: 
+            pc.printf("%s\r\n", I2C_0xB6);
+            i2cFlags.ccs811_1_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xB8
+        case 0xB8: 
+            pc.printf("%s\r\n", I2C_0xB8);
+            break;
+#endif
+#ifdef  I2C_0xBA
+        case 0xBA: 
+            pc.printf("%s\r\n", I2C_0xBA);
+            break;
+#endif
+#ifdef  I2C_0xBC
+        case 0xBC: 
+            pc.printf("%s\r\n", I2C_0xBC);
+            break;
+#endif
+#ifdef  I2C_0xBE
+        case 0xBE: 
+            pc.printf("%s\r\n", I2C_0xBE);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xC0
+        case 0xC0: 
+            pc.printf("%s\r\n", I2C_0xC0);
+            i2cFlags.mlx90620_ok = true;
+            //i2cFlags.PCA9955_GGG_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xC2
+        case 0xC2: 
+            pc.printf("%s\r\n", I2C_0xC2);
+            i2cFlags.SCD30_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xC4
+        case 0xC4: 
+            pc.printf("%s\r\n", I2C_0xC4);
+            break;
+#endif
+#ifdef  I2C_0xC6
+        case 0xC6: 
+            pc.printf("%s\r\n", I2C_0xC6);
+            break;
+#endif
+#ifdef  I2C_0xC8
+        case 0xC8: 
+            pc.printf("%s\r\n", I2C_0xC8);
+            break;
+#endif
+#ifdef  I2C_0xCA
+        case 0xCA: 
+            pc.printf("%s\r\n", I2C_0xCA);
+            break;
+#endif
+#ifdef  I2C_0xCC
+        case 0xCC: 
+            pc.printf("%s\r\n", I2C_0xCC);
+            break;
+#endif
+#ifdef  I2C_0xCE
+        case 0xCE: 
+            pc.printf("%s\r\n", I2C_0xCE);
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xD0
+        case 0xD0: 
+            pc.printf("%s\r\n", I2C_0xD0);
+            i2cFlags.rtcDS_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xD2
+        case 0xD2: 
+            pc.printf("%s\r\n", I2C_0xD2);
+            break;
+#endif
+#ifdef  I2C_0xD4
+        case 0xD4: 
+            pc.printf("%s\r\n", I2C_0xD4);
+            break;
+#endif
+#ifdef  I2C_0xD6
+        case 0xD6: 
+            pc.printf("%s\r\n", I2C_0xD6);
+            break;
+#endif
+#ifdef  I2C_0xD8
+        case 0xD8: 
+            pc.printf("%s\r\n", I2C_0xD8);
+            break;
+#endif
+#ifdef  I2C_0xDA
+        case 0xDA: 
+            pc.printf("%s\r\n", I2C_0xDA);
+            break;
+#endif
+#ifdef  I2C_0xDC
+        case 0xDC: 
+            pc.printf("%s\r\n", I2C_0xDC);
+            break;
+#endif
+#ifdef  I2C_0xDE
+        case 0xDE: 
+            pc.printf("%s\r\n", I2C_0xDE);
+            i2cFlags.mcp7941x_ok = true;
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xE0
+        case 0xE0: 
+            pc.printf("%s\r\n", I2C_0xE0);
+            break;
+#endif
+#ifdef  I2C_0xE2
+        case 0xE2: 
+            pc.printf("%s\r\n", I2C_0xE2);
+            break;
+#endif
+#ifdef  I2C_0xE4
+        case 0xE4: 
+            pc.printf("%s\r\n", I2C_0xE4);
+            break;
+#endif
+#ifdef  I2C_0xE6
+        case 0xE6: 
+            pc.printf("%s\r\n", I2C_0xE6);
+            break;
+#endif
+#ifdef  I2C_0xE8
+        case 0xE8: 
+            pc.printf("%s\r\n", I2C_0xE8);
+            break;
+#endif
+#ifdef  I2C_0xEA
+        case 0xEA: 
+            pc.printf("%s\r\n", I2C_0xEA);
+            break;
+#endif
+#ifdef  I2C_0xEC
+        case 0xEC: 
+            pc.printf("%s\r\n", I2C_0xEC);
+            i2cFlags.bme280_cs0_ok = true;
+            break;
+#endif
+#ifdef  I2C_0xEE
+        case 0xEE: 
+            pc.printf("%s\r\n", I2C_0xEE);
+            i2cFlags.ms5611_ok = true;
+            i2cFlags.bme280_cs1_ok = true;
+            break;
+#endif
+//----------------------------------------
+#ifdef  I2C_0xF0
+        case 0xF0: 
+            pc.printf("%s\r\n", I2C_0xF0);
+            break;
+#endif
+#ifdef  I2C_0xF2
+        case 0xF2: 
+            pc.printf("%s\r\n", I2C_0xF2);
+            break;
+#endif
+#ifdef  I2C_0xF4
+        case 0xF4: 
+            pc.printf("%s\r\n", I2C_0xF4);
+            break;
+#endif
+#ifdef  I2C_0xF6
+        case 0xF6: 
+            pc.printf("%s\r\n", I2C_0xF6);
+            break;
+#endif
+#ifdef  I2C_0xF8
+        case 0xF8: 
+            pc.printf("%s\r\n", I2C_0xF8);
+            break;
+#endif
+#ifdef  I2C_0xFA
+        case 0xFA: 
+            pc.printf("%s\r\n", I2C_0xFA);
+            break;
+#endif
+#ifdef  I2C_0xFC
+        case 0xFC: 
+            pc.printf("%s\r\n", I2C_0xFC);
+            break;
+#endif
+#ifdef  I2C_0xFE
+        case 0xFE: 
+            pc.printf("%s\r\n", I2C_0xFE);
+            break;
+#endif
+//----------------------------------------   
+        default:
+            pc.printf("%sunknown%s\r\n", DOMAGENTA, DONONE);
+            break;
+    }
+    return(0);    
+}
+
+//------------------------------------------------------------------------------
+// Clear I2C device flags
+
+void i2c_discovery::clearFlags(i2cDeviceFlags& i2cFlags) {
+    i2cFlags.rtcDS_ok = false;
+    i2cFlags.ms5611_ok = false;
+    i2cFlags.bme280_cs0_ok = false;
+    i2cFlags.bme280_cs1_ok = false;
+    i2cFlags.mma8451cs1_ok = false;
+    i2cFlags.HTU21D_ok = false;
+    i2cFlags.PCA9955_GGG_ok = false;
+    i2cFlags.VEML60xx_ok = false;
+    i2cFlags.VEML6070_ok = false;
+    i2cFlags.eeprom000_ok = false;
+    i2cFlags.INA219_MAX7300_gg_ok = false;
+    i2cFlags.INA230_MAX7300_gg_ok = false;
+    i2cFlags.bq27210_ok = false;
+    i2cFlags.SCD30_ok = false;
+    i2cFlags.ccs811_0_ok = false;
+    i2cFlags.ccs811_1_ok = false;
+    i2cFlags.mcp7941x_ok = false;
+}
+    
+//------------------------------------------------------------------------------
+// Detect I2C device chain.  If i2c chain > 1, return illegal number 255.  Else, 
+// return the total number of i2c devices detected
+
+int i2c_discovery::dispI2C(i2cDeviceFlags& i2cFlags) {
+    //i2c_discovery::clearFlags(i2cFlags);
+    int count = 0;
+    for (int address = 2; address < 256; address +=2) {
+        char xBuf[2] = { 0, 0 };
+        int x2c = _i2c.write(address, xBuf, 1, false);
+        if(x2c == 0) {
+            pc.printf(" - i2c device found at address 0x%02X  %s", address, DOBLUE);
+            showI2C(i2cFlags, address);
+            pc.printf("%s", DONONE);
+            count++;
+        }
+    }
+    return(count);
+}
+
+//------------------------------------------------------------------------------
+// Detect I2C device chain
+
+int i2c_discovery::find_i2c(i2cDeviceFlags& i2cFlags) {
+    pc.printf("Searching for devices on i2c bus...\n");
+    int count = dispI2C(i2cFlags);
+    pc.printf("   - %s%2d%s device(s) found on i2c bus\n", DOBLUE, count, DONONE);
+    return(count);
+}
+
diff -r 000000000000 -r df49b3ed3502 i2cDevices.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i2cDevices.h	Thu Jan 10 17:44:10 2019 +0000
@@ -0,0 +1,207 @@
+#ifndef I2CDEVICES_H
+#define I2CDEVICES_H
+
+#include "DevI2C.h"
+
+//if the use of low-level I2C routines is required, uncomment out the next two lines 
+//#define I2CLOWLEVEL     1   
+//#warning "using low level I2C routines"
+
+/** Software routines that show the I2C devices connected to the I2C bus. The
+ *  routine also sets flags that indicate certain I2C devices have been 
+ *  detected.  Those flags are within a "typedef" structure.
+ *
+ * NOTE: Requires the external definition of the user console: "RawSerial pc;"
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "i2cDevices.h"
+ *
+ * RawSerial pc(USBTX, USBRX);
+ * DigitalOut led1(LED1);
+ *
+ * #define SDA         PTE0     //i2c bus for KL25Z
+ * #define SCL         PTE1
+ *
+ * I2C i2c1(SDA, SCL);
+ * i2c_discovery i2c_d(SDA, SCL, "i2c_d");
+ * i2c_discovery::i2cDeviceFlags i2c_flags = {};
+ *
+ * int main() {
+ *     pc.baud(230400);
+ *     i2c1.frequency(400000);
+ *     pc.print("\r\n\r\nbegin....\r\n");
+ *     i2c_d.find_i2c(i2c_flags);
+ *     if(i2c_flags.PCA9955_0 == true) {
+ *         pc.printf("Device detected!\r\n");
+ *     } else {
+ *         pc.printf("Device not found!!!\r\n");
+ *     }
+ *     while(1) {
+ *         led1 = !led1;
+ *         wait(1.0);
+ *     }
+ * }
+ *
+ * @endcode
+ */
+
+//used to define terminal text output color
+#define COLOR_TERM
+#ifdef COLOR_TERM
+    #define DOBLUE      "\033[0;34;2m"
+    #define DOMAGENTA   "\033[0;35;2m"
+    #define DONONE      "\033[0m"
+#else
+    #define DOBLUE      ""
+    #define DOMAGENTA   ""
+    #define DONONE      ""
+#endif
+
+//list of i2c device possibilities
+#define I2C_0x02    "PCA9955-GGG"
+#define I2C_0x06    "SHT1x"
+#define I2C_0x0C    "AK8975"
+
+#define I2C_0x1C    "MAG3110"
+
+#define I2C_0x20    "VEML6040, VEML6075"
+
+#define I2C_0x38    "MMA8451-0, FXOS8700CQ-2"
+#define I2C_0x3A    "MMA8451-1, FXOS8700CQ-1"
+#define I2C_0x3C    "FXOS8700CQ-0, LIS3MDL"
+#define I2C_0x3E    "FXOS8700CQ-3"
+
+#define I2C_0x42    "MCP23017-b"
+#define I2C_0x44    "MCP23017-c"
+#define I2C_0x46    "MCP23017-d"
+
+#define I2C_0x50    "MAX5387-ggg"
+#define I2C_0x52    "MAX5387-ggv, VL53L0X"
+#define I2C_0x54    "MAX5387-gvg"
+#define I2C_0x56    "MAX5387-gvv"
+#define I2C_0x58    "MAX5387-vgg"
+#define I2C_0x5A    "MAX5387-vgv"
+#define I2C_0x5C    "MAX5387-vvg"
+#define I2C_0x5E    "MAX5387-vvv"
+
+#define I2C_0x70    "VEML6070-ld/c"
+#define I2C_0x72    "VEML6070-hd"
+
+#define I2C_0x80    "Si7005, Si7021, HTU21D, HDC1080, INA2xx/MAX7300-gg"
+#define I2C_0x82    "INA2xx/MAX7300-gv"
+#define I2C_0x84    "INA2xx/MAX7300-gd"
+#define I2C_0x86    "INA2xx/MAX7300-gc"
+#define I2C_0x88    "INA2xx/MAX7300-vg"
+#define I2C_0x8A    "INA2xx/MAX7300-vv"
+#define I2C_0x8C    "INA2xx/MAX7300-vd"
+#define I2C_0x8E    "INA2xx/MAX7300-vc"
+
+#define I2C_0x90    "AD7416-a, LM75, INA2xx/MAX7300-dg"
+#define I2C_0x92    "MAX9768, INA2xx/MAX7300-dv"
+#define I2C_0x94    "INA2xx/MAX7300-dd"
+#define I2C_0x96    "INA2xx/MAX7300-dc"
+#define I2C_0x98    "INA2xx/MAX7300-cg"
+#define I2C_0x9A    "INA2xx/MAX7300-cv"
+#define I2C_0x9C    "INA2xx/MAX7300-cd"
+#define I2C_0x9E    "INA2xx/MAX7300-cc"
+
+#define I2C_0xA0    "24FC512-000, 24AA02-b0"
+#define I2C_0xA2    "24AA02-b1"
+#define I2C_0xA4    "24AA02-b2"
+#define I2C_0xA6    "24AA02-b3"
+#define I2C_0xA8    "24AA02-b4"
+#define I2C_0xAA    "MMA8491, 24AA02-b5, BQ27xx0, BQ34Z100-G1"
+#define I2C_0xAC    "24AA02-b6, M24SR64-Y"
+#define I2C_0xAE    "24AA02-b7"
+
+#define I2C_0xB4    "CCS811-0"
+#define I2C_0xB6    "CCS811-1"
+#define I2C_0xBA    "LPS22HB"
+#define I2C_0xBE    "HTS221"
+
+#define I2C_0xC0    "MPL3115A2, MLX90620-ram, PCA9955-0"
+#define I2C_0xC2    "SCD30"
+
+#define I2C_0xD0    "M41T11, DS1307, DS3232M, MCU9150-0"
+#define I2C_0xD2    "MCU9150-1"
+#define I2C_0xD4    "LSM6DSL"
+#define I2C_0xDE    "MCP7941x-rtc"
+
+#define I2C_0xE0    "PCA9955-AllCall"
+#define I2C_0xEC    "MS5611-cs1, BME280-cs0, PCA9955-SubCall"
+#define I2C_0xEE    "MS5611-cs0, BME280-cs1, BMP-05"
+
+/** Create an i2c controller class
+ *
+ * @param i2c class class
+ *
+ */
+class i2c_discovery
+{
+    public:
+    /** Structure which is used to exchange indicate certain
+     *  devices of interest is detected or not by this routine.
+     */    
+    typedef struct {
+        bool rtcDS_ok;          /*!< i2c address 0xd0 */
+        bool ms5611_ok;         /*!< i2c address 0xee */
+        bool bme280_cs0_ok;     /*!< i2c address 0xec */
+        bool bme280_cs1_ok;     /*!< i2c address 0xee */
+        bool mma8451cs1_ok;     /*!< i2c address 0x3a */
+        bool HTU21D_ok;         /*!< i2c address 0x80 */
+        bool INA219_MAX7300_gg_ok; /*!< i2c address 0x80 */
+        bool INA230_MAX7300_gg_ok; /*!< i2c address 0x80 */
+        bool PCA9955_GGG_ok;    /*!< i2c address 0xc0 */
+        bool VEML60xx_ok;       /*!< i2c address 0x20 */
+        bool VEML6070_ok;       /*!< i2c address 0x70 */
+        bool eeprom000_ok;      /*!< i2c address 0xa0 */
+        bool mlx90620_ok;       /*!< i2c address 0xc0 */
+        bool SCD30_ok;          /*!< i2c address 0xc2 */
+        bool bq27210_ok;        /*!< i2c address 0xaa */
+        bool ccs811_0_ok;       /*!< i2c address 0xb4 */
+        bool ccs811_1_ok;       /*!< i2c address 0xb6 */
+        bool mcp7941x_ok;       /*!< i2c address 0xde */
+    } i2cDeviceFlags;
+
+    /**
+     * Constructor, uses default I2C clock speed
+     * - Fixed at I2C address 0x80
+     * - I2C speed set to 400KHz
+     *
+     * @param sda - mbed I2C interface pin
+     * @param scl - mbed I2C interface pin
+     * @param name - name of i2c_discovery
+     */
+    i2c_discovery(PinName sda, PinName scl, const char* name);
+    
+    /**
+     * Clear I2C device Flags
+     * 
+     * @param i2cDeviceFlags pointer
+     *
+     * @return --none--
+    */    
+    void clearFlags(i2cDeviceFlags& i2cFlags);
+    
+    /**
+     * Go and search for I2C devices
+     * 
+     * @param i2cDeviceFlags pointer
+     *
+     * @return count - number of i2c devices detected
+    */     
+    int find_i2c(i2cDeviceFlags& i2cFlags);
+    
+    private:
+
+    int showI2C(i2cDeviceFlags& i2cFlags, char addr);
+    int dispI2C(i2cDeviceFlags& i2cFlags);
+    
+    protected:
+    
+    DevI2C _i2c;
+
+};
+
+#endif