I2C device discovery and printout of known device names
i2cDevices.h@0:df49b3ed3502, 2019-01-10 (annotated)
- Committer:
- loopsva
- Date:
- Thu Jan 10 17:44:10 2019 +0000
- Revision:
- 0:df49b3ed3502
General I2C device updates
Who changed what in which revision?
User | Revision | Line number | New 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 |