I2C device discovery and printout of known device names
Revision 0:df49b3ed3502, committed 2019-01-10
- 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