I2C device discovery and printout of known device names

Committer:
loopsva
Date:
Thu Jan 10 17:44:10 2019 +0000
Revision:
0:df49b3ed3502
General I2C device updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:df49b3ed3502 1 #ifndef I2CDEVICES_H
loopsva 0:df49b3ed3502 2 #define I2CDEVICES_H
loopsva 0:df49b3ed3502 3
loopsva 0:df49b3ed3502 4 #include "DevI2C.h"
loopsva 0:df49b3ed3502 5
loopsva 0:df49b3ed3502 6 //if the use of low-level I2C routines is required, uncomment out the next two lines
loopsva 0:df49b3ed3502 7 //#define I2CLOWLEVEL 1
loopsva 0:df49b3ed3502 8 //#warning "using low level I2C routines"
loopsva 0:df49b3ed3502 9
loopsva 0:df49b3ed3502 10 /** Software routines that show the I2C devices connected to the I2C bus. The
loopsva 0:df49b3ed3502 11 * routine also sets flags that indicate certain I2C devices have been
loopsva 0:df49b3ed3502 12 * detected. Those flags are within a "typedef" structure.
loopsva 0:df49b3ed3502 13 *
loopsva 0:df49b3ed3502 14 * NOTE: Requires the external definition of the user console: "RawSerial pc;"
loopsva 0:df49b3ed3502 15 *
loopsva 0:df49b3ed3502 16 * @code
loopsva 0:df49b3ed3502 17 * #include "mbed.h"
loopsva 0:df49b3ed3502 18 * #include "i2cDevices.h"
loopsva 0:df49b3ed3502 19 *
loopsva 0:df49b3ed3502 20 * RawSerial pc(USBTX, USBRX);
loopsva 0:df49b3ed3502 21 * DigitalOut led1(LED1);
loopsva 0:df49b3ed3502 22 *
loopsva 0:df49b3ed3502 23 * #define SDA PTE0 //i2c bus for KL25Z
loopsva 0:df49b3ed3502 24 * #define SCL PTE1
loopsva 0:df49b3ed3502 25 *
loopsva 0:df49b3ed3502 26 * I2C i2c1(SDA, SCL);
loopsva 0:df49b3ed3502 27 * i2c_discovery i2c_d(SDA, SCL, "i2c_d");
loopsva 0:df49b3ed3502 28 * i2c_discovery::i2cDeviceFlags i2c_flags = {};
loopsva 0:df49b3ed3502 29 *
loopsva 0:df49b3ed3502 30 * int main() {
loopsva 0:df49b3ed3502 31 * pc.baud(230400);
loopsva 0:df49b3ed3502 32 * i2c1.frequency(400000);
loopsva 0:df49b3ed3502 33 * pc.print("\r\n\r\nbegin....\r\n");
loopsva 0:df49b3ed3502 34 * i2c_d.find_i2c(i2c_flags);
loopsva 0:df49b3ed3502 35 * if(i2c_flags.PCA9955_0 == true) {
loopsva 0:df49b3ed3502 36 * pc.printf("Device detected!\r\n");
loopsva 0:df49b3ed3502 37 * } else {
loopsva 0:df49b3ed3502 38 * pc.printf("Device not found!!!\r\n");
loopsva 0:df49b3ed3502 39 * }
loopsva 0:df49b3ed3502 40 * while(1) {
loopsva 0:df49b3ed3502 41 * led1 = !led1;
loopsva 0:df49b3ed3502 42 * wait(1.0);
loopsva 0:df49b3ed3502 43 * }
loopsva 0:df49b3ed3502 44 * }
loopsva 0:df49b3ed3502 45 *
loopsva 0:df49b3ed3502 46 * @endcode
loopsva 0:df49b3ed3502 47 */
loopsva 0:df49b3ed3502 48
loopsva 0:df49b3ed3502 49 //used to define terminal text output color
loopsva 0:df49b3ed3502 50 #define COLOR_TERM
loopsva 0:df49b3ed3502 51 #ifdef COLOR_TERM
loopsva 0:df49b3ed3502 52 #define DOBLUE "\033[0;34;2m"
loopsva 0:df49b3ed3502 53 #define DOMAGENTA "\033[0;35;2m"
loopsva 0:df49b3ed3502 54 #define DONONE "\033[0m"
loopsva 0:df49b3ed3502 55 #else
loopsva 0:df49b3ed3502 56 #define DOBLUE ""
loopsva 0:df49b3ed3502 57 #define DOMAGENTA ""
loopsva 0:df49b3ed3502 58 #define DONONE ""
loopsva 0:df49b3ed3502 59 #endif
loopsva 0:df49b3ed3502 60
loopsva 0:df49b3ed3502 61 //list of i2c device possibilities
loopsva 0:df49b3ed3502 62 #define I2C_0x02 "PCA9955-GGG"
loopsva 0:df49b3ed3502 63 #define I2C_0x06 "SHT1x"
loopsva 0:df49b3ed3502 64 #define I2C_0x0C "AK8975"
loopsva 0:df49b3ed3502 65
loopsva 0:df49b3ed3502 66 #define I2C_0x1C "MAG3110"
loopsva 0:df49b3ed3502 67
loopsva 0:df49b3ed3502 68 #define I2C_0x20 "VEML6040, VEML6075"
loopsva 0:df49b3ed3502 69
loopsva 0:df49b3ed3502 70 #define I2C_0x38 "MMA8451-0, FXOS8700CQ-2"
loopsva 0:df49b3ed3502 71 #define I2C_0x3A "MMA8451-1, FXOS8700CQ-1"
loopsva 0:df49b3ed3502 72 #define I2C_0x3C "FXOS8700CQ-0, LIS3MDL"
loopsva 0:df49b3ed3502 73 #define I2C_0x3E "FXOS8700CQ-3"
loopsva 0:df49b3ed3502 74
loopsva 0:df49b3ed3502 75 #define I2C_0x42 "MCP23017-b"
loopsva 0:df49b3ed3502 76 #define I2C_0x44 "MCP23017-c"
loopsva 0:df49b3ed3502 77 #define I2C_0x46 "MCP23017-d"
loopsva 0:df49b3ed3502 78
loopsva 0:df49b3ed3502 79 #define I2C_0x50 "MAX5387-ggg"
loopsva 0:df49b3ed3502 80 #define I2C_0x52 "MAX5387-ggv, VL53L0X"
loopsva 0:df49b3ed3502 81 #define I2C_0x54 "MAX5387-gvg"
loopsva 0:df49b3ed3502 82 #define I2C_0x56 "MAX5387-gvv"
loopsva 0:df49b3ed3502 83 #define I2C_0x58 "MAX5387-vgg"
loopsva 0:df49b3ed3502 84 #define I2C_0x5A "MAX5387-vgv"
loopsva 0:df49b3ed3502 85 #define I2C_0x5C "MAX5387-vvg"
loopsva 0:df49b3ed3502 86 #define I2C_0x5E "MAX5387-vvv"
loopsva 0:df49b3ed3502 87
loopsva 0:df49b3ed3502 88 #define I2C_0x70 "VEML6070-ld/c"
loopsva 0:df49b3ed3502 89 #define I2C_0x72 "VEML6070-hd"
loopsva 0:df49b3ed3502 90
loopsva 0:df49b3ed3502 91 #define I2C_0x80 "Si7005, Si7021, HTU21D, HDC1080, INA2xx/MAX7300-gg"
loopsva 0:df49b3ed3502 92 #define I2C_0x82 "INA2xx/MAX7300-gv"
loopsva 0:df49b3ed3502 93 #define I2C_0x84 "INA2xx/MAX7300-gd"
loopsva 0:df49b3ed3502 94 #define I2C_0x86 "INA2xx/MAX7300-gc"
loopsva 0:df49b3ed3502 95 #define I2C_0x88 "INA2xx/MAX7300-vg"
loopsva 0:df49b3ed3502 96 #define I2C_0x8A "INA2xx/MAX7300-vv"
loopsva 0:df49b3ed3502 97 #define I2C_0x8C "INA2xx/MAX7300-vd"
loopsva 0:df49b3ed3502 98 #define I2C_0x8E "INA2xx/MAX7300-vc"
loopsva 0:df49b3ed3502 99
loopsva 0:df49b3ed3502 100 #define I2C_0x90 "AD7416-a, LM75, INA2xx/MAX7300-dg"
loopsva 0:df49b3ed3502 101 #define I2C_0x92 "MAX9768, INA2xx/MAX7300-dv"
loopsva 0:df49b3ed3502 102 #define I2C_0x94 "INA2xx/MAX7300-dd"
loopsva 0:df49b3ed3502 103 #define I2C_0x96 "INA2xx/MAX7300-dc"
loopsva 0:df49b3ed3502 104 #define I2C_0x98 "INA2xx/MAX7300-cg"
loopsva 0:df49b3ed3502 105 #define I2C_0x9A "INA2xx/MAX7300-cv"
loopsva 0:df49b3ed3502 106 #define I2C_0x9C "INA2xx/MAX7300-cd"
loopsva 0:df49b3ed3502 107 #define I2C_0x9E "INA2xx/MAX7300-cc"
loopsva 0:df49b3ed3502 108
loopsva 0:df49b3ed3502 109 #define I2C_0xA0 "24FC512-000, 24AA02-b0"
loopsva 0:df49b3ed3502 110 #define I2C_0xA2 "24AA02-b1"
loopsva 0:df49b3ed3502 111 #define I2C_0xA4 "24AA02-b2"
loopsva 0:df49b3ed3502 112 #define I2C_0xA6 "24AA02-b3"
loopsva 0:df49b3ed3502 113 #define I2C_0xA8 "24AA02-b4"
loopsva 0:df49b3ed3502 114 #define I2C_0xAA "MMA8491, 24AA02-b5, BQ27xx0, BQ34Z100-G1"
loopsva 0:df49b3ed3502 115 #define I2C_0xAC "24AA02-b6, M24SR64-Y"
loopsva 0:df49b3ed3502 116 #define I2C_0xAE "24AA02-b7"
loopsva 0:df49b3ed3502 117
loopsva 0:df49b3ed3502 118 #define I2C_0xB4 "CCS811-0"
loopsva 0:df49b3ed3502 119 #define I2C_0xB6 "CCS811-1"
loopsva 0:df49b3ed3502 120 #define I2C_0xBA "LPS22HB"
loopsva 0:df49b3ed3502 121 #define I2C_0xBE "HTS221"
loopsva 0:df49b3ed3502 122
loopsva 0:df49b3ed3502 123 #define I2C_0xC0 "MPL3115A2, MLX90620-ram, PCA9955-0"
loopsva 0:df49b3ed3502 124 #define I2C_0xC2 "SCD30"
loopsva 0:df49b3ed3502 125
loopsva 0:df49b3ed3502 126 #define I2C_0xD0 "M41T11, DS1307, DS3232M, MCU9150-0"
loopsva 0:df49b3ed3502 127 #define I2C_0xD2 "MCU9150-1"
loopsva 0:df49b3ed3502 128 #define I2C_0xD4 "LSM6DSL"
loopsva 0:df49b3ed3502 129 #define I2C_0xDE "MCP7941x-rtc"
loopsva 0:df49b3ed3502 130
loopsva 0:df49b3ed3502 131 #define I2C_0xE0 "PCA9955-AllCall"
loopsva 0:df49b3ed3502 132 #define I2C_0xEC "MS5611-cs1, BME280-cs0, PCA9955-SubCall"
loopsva 0:df49b3ed3502 133 #define I2C_0xEE "MS5611-cs0, BME280-cs1, BMP-05"
loopsva 0:df49b3ed3502 134
loopsva 0:df49b3ed3502 135 /** Create an i2c controller class
loopsva 0:df49b3ed3502 136 *
loopsva 0:df49b3ed3502 137 * @param i2c class class
loopsva 0:df49b3ed3502 138 *
loopsva 0:df49b3ed3502 139 */
loopsva 0:df49b3ed3502 140 class i2c_discovery
loopsva 0:df49b3ed3502 141 {
loopsva 0:df49b3ed3502 142 public:
loopsva 0:df49b3ed3502 143 /** Structure which is used to exchange indicate certain
loopsva 0:df49b3ed3502 144 * devices of interest is detected or not by this routine.
loopsva 0:df49b3ed3502 145 */
loopsva 0:df49b3ed3502 146 typedef struct {
loopsva 0:df49b3ed3502 147 bool rtcDS_ok; /*!< i2c address 0xd0 */
loopsva 0:df49b3ed3502 148 bool ms5611_ok; /*!< i2c address 0xee */
loopsva 0:df49b3ed3502 149 bool bme280_cs0_ok; /*!< i2c address 0xec */
loopsva 0:df49b3ed3502 150 bool bme280_cs1_ok; /*!< i2c address 0xee */
loopsva 0:df49b3ed3502 151 bool mma8451cs1_ok; /*!< i2c address 0x3a */
loopsva 0:df49b3ed3502 152 bool HTU21D_ok; /*!< i2c address 0x80 */
loopsva 0:df49b3ed3502 153 bool INA219_MAX7300_gg_ok; /*!< i2c address 0x80 */
loopsva 0:df49b3ed3502 154 bool INA230_MAX7300_gg_ok; /*!< i2c address 0x80 */
loopsva 0:df49b3ed3502 155 bool PCA9955_GGG_ok; /*!< i2c address 0xc0 */
loopsva 0:df49b3ed3502 156 bool VEML60xx_ok; /*!< i2c address 0x20 */
loopsva 0:df49b3ed3502 157 bool VEML6070_ok; /*!< i2c address 0x70 */
loopsva 0:df49b3ed3502 158 bool eeprom000_ok; /*!< i2c address 0xa0 */
loopsva 0:df49b3ed3502 159 bool mlx90620_ok; /*!< i2c address 0xc0 */
loopsva 0:df49b3ed3502 160 bool SCD30_ok; /*!< i2c address 0xc2 */
loopsva 0:df49b3ed3502 161 bool bq27210_ok; /*!< i2c address 0xaa */
loopsva 0:df49b3ed3502 162 bool ccs811_0_ok; /*!< i2c address 0xb4 */
loopsva 0:df49b3ed3502 163 bool ccs811_1_ok; /*!< i2c address 0xb6 */
loopsva 0:df49b3ed3502 164 bool mcp7941x_ok; /*!< i2c address 0xde */
loopsva 0:df49b3ed3502 165 } i2cDeviceFlags;
loopsva 0:df49b3ed3502 166
loopsva 0:df49b3ed3502 167 /**
loopsva 0:df49b3ed3502 168 * Constructor, uses default I2C clock speed
loopsva 0:df49b3ed3502 169 * - Fixed at I2C address 0x80
loopsva 0:df49b3ed3502 170 * - I2C speed set to 400KHz
loopsva 0:df49b3ed3502 171 *
loopsva 0:df49b3ed3502 172 * @param sda - mbed I2C interface pin
loopsva 0:df49b3ed3502 173 * @param scl - mbed I2C interface pin
loopsva 0:df49b3ed3502 174 * @param name - name of i2c_discovery
loopsva 0:df49b3ed3502 175 */
loopsva 0:df49b3ed3502 176 i2c_discovery(PinName sda, PinName scl, const char* name);
loopsva 0:df49b3ed3502 177
loopsva 0:df49b3ed3502 178 /**
loopsva 0:df49b3ed3502 179 * Clear I2C device Flags
loopsva 0:df49b3ed3502 180 *
loopsva 0:df49b3ed3502 181 * @param i2cDeviceFlags pointer
loopsva 0:df49b3ed3502 182 *
loopsva 0:df49b3ed3502 183 * @return --none--
loopsva 0:df49b3ed3502 184 */
loopsva 0:df49b3ed3502 185 void clearFlags(i2cDeviceFlags& i2cFlags);
loopsva 0:df49b3ed3502 186
loopsva 0:df49b3ed3502 187 /**
loopsva 0:df49b3ed3502 188 * Go and search for I2C devices
loopsva 0:df49b3ed3502 189 *
loopsva 0:df49b3ed3502 190 * @param i2cDeviceFlags pointer
loopsva 0:df49b3ed3502 191 *
loopsva 0:df49b3ed3502 192 * @return count - number of i2c devices detected
loopsva 0:df49b3ed3502 193 */
loopsva 0:df49b3ed3502 194 int find_i2c(i2cDeviceFlags& i2cFlags);
loopsva 0:df49b3ed3502 195
loopsva 0:df49b3ed3502 196 private:
loopsva 0:df49b3ed3502 197
loopsva 0:df49b3ed3502 198 int showI2C(i2cDeviceFlags& i2cFlags, char addr);
loopsva 0:df49b3ed3502 199 int dispI2C(i2cDeviceFlags& i2cFlags);
loopsva 0:df49b3ed3502 200
loopsva 0:df49b3ed3502 201 protected:
loopsva 0:df49b3ed3502 202
loopsva 0:df49b3ed3502 203 DevI2C _i2c;
loopsva 0:df49b3ed3502 204
loopsva 0:df49b3ed3502 205 };
loopsva 0:df49b3ed3502 206
loopsva 0:df49b3ed3502 207 #endif