I2C sensor test program, derived from testI2C program. Simple test for FXOS8700CQ, HIH6130, MAG3110, MMA8451Q, MMA8452Q, MPL3115A2, MAX44000, MAX44005, MAX44008, MAX30101 included beside simple I2C read/write from testI2C.

Dependencies:   FXOS8700CQ HIH6130 IS31SE5000 MAG3110 MAX44000 MAX44005 MAX44008 MMA8451Q MMA8452Q MPL3115A2 VEML6040 VEML6075 mbed vt100 LM75B FXAS21002 MAX30101 VCNL4020 VCNL4100

Committer:
Rhyme
Date:
Wed Feb 08 05:48:17 2017 +0000
Revision:
9:d4f76e6fa35f
Parent:
4:c10b1aa9925c
Child:
12:b3dff3bbb1eb
Vishay Sensor requires to be read 2 bytes each, so it was causing bus scan hang when read only 1 byte. So kludge approach was reading 2 bytes only for the address 0x10 (Vishay)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 1:9450e20cf688 1 /** testSensor
Rhyme 1:9450e20cf688 2 * I2C and I2C sensor test program
Rhyme 1:9450e20cf688 3 * For the initial release,
Rhyme 1:9450e20cf688 4 * following MSU sensors are supported
Rhyme 1:9450e20cf688 5 * FXOS8700CQ
Rhyme 1:9450e20cf688 6 * HIH6130
Rhyme 1:9450e20cf688 7 * MAG3110
Rhyme 1:9450e20cf688 8 * MMA8451Q
Rhyme 1:9450e20cf688 9 * MMA8452Q
Rhyme 1:9450e20cf688 10 * MPL3115A2
Rhyme 1:9450e20cf688 11 * MAX44000
Rhyme 1:9450e20cf688 12 * MAX44005 (not tested)
Rhyme 1:9450e20cf688 13 * MAX44008
Rhyme 1:9450e20cf688 14 *
Rhyme 1:9450e20cf688 15 * For untested sensor(s) or I2C devices
Rhyme 1:9450e20cf688 16 * open / close / read / write
Rhyme 1:9450e20cf688 17 * commands are avilable
Rhyme 1:9450e20cf688 18 * please refer to the help message and source code
Rhyme 1:9450e20cf688 19 * for details.
Rhyme 1:9450e20cf688 20 */
Rhyme 1:9450e20cf688 21 #include "mbed.h"
Rhyme 1:9450e20cf688 22 #include <string.h>
Rhyme 1:9450e20cf688 23 #include <ctype.h>
Rhyme 1:9450e20cf688 24 #include "vt100.h"
Rhyme 1:9450e20cf688 25 #include "MSS.h"
Rhyme 1:9450e20cf688 26 #include "MSU.h"
Rhyme 1:9450e20cf688 27 #include "dumb_i2c.h"
Rhyme 1:9450e20cf688 28 #define TEST_LOOP 10
Rhyme 1:9450e20cf688 29
Rhyme 1:9450e20cf688 30 DUMB_I2C *i2c = 0 ;
Rhyme 1:9450e20cf688 31 vt100 *tty = 0 ;
Rhyme 1:9450e20cf688 32 int test_loop = TEST_LOOP ;
Rhyme 9:d4f76e6fa35f 33 int interval = 100 ; /* ms wait interval */
Rhyme 1:9450e20cf688 34
Rhyme 1:9450e20cf688 35 void doClose(void)
Rhyme 1:9450e20cf688 36 {
Rhyme 1:9450e20cf688 37 if (i2c != 0) {
Rhyme 1:9450e20cf688 38 printf("Closing I2C at 0x%02X ... ", i2c->address()) ;
Rhyme 1:9450e20cf688 39 delete i2c ;
Rhyme 1:9450e20cf688 40 i2c = 0 ;
Rhyme 1:9450e20cf688 41 printf("Done\n") ;
Rhyme 1:9450e20cf688 42 }
Rhyme 1:9450e20cf688 43 }
Rhyme 1:9450e20cf688 44
Rhyme 1:9450e20cf688 45 void doOpen(void)
Rhyme 1:9450e20cf688 46 {
Rhyme 1:9450e20cf688 47 uint8_t address ;
Rhyme 1:9450e20cf688 48 scanf("%X", &address) ;
Rhyme 1:9450e20cf688 49 if (i2c != 0) {
Rhyme 1:9450e20cf688 50 doClose() ;
Rhyme 1:9450e20cf688 51 }
Rhyme 1:9450e20cf688 52 printf("Opening I2C at 0x%02X ... ", address) ;
Rhyme 1:9450e20cf688 53 i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ;
Rhyme 1:9450e20cf688 54 printf("Done\n") ;
Rhyme 1:9450e20cf688 55 }
Rhyme 1:9450e20cf688 56
Rhyme 1:9450e20cf688 57 void doRead(void)
Rhyme 1:9450e20cf688 58 {
Rhyme 1:9450e20cf688 59 int addr ;
Rhyme 1:9450e20cf688 60 int len ;
Rhyme 1:9450e20cf688 61 uint8_t *data ;
Rhyme 1:9450e20cf688 62 int result ;
Rhyme 1:9450e20cf688 63 if (i2c == 0) {
Rhyme 1:9450e20cf688 64 printf("I2C is not opened\n") ;
Rhyme 1:9450e20cf688 65 return ;
Rhyme 1:9450e20cf688 66 }
Rhyme 1:9450e20cf688 67 scanf("%X %X", &addr, &len) ;
Rhyme 1:9450e20cf688 68 if (len > 0) {
Rhyme 1:9450e20cf688 69 data = new uint8_t[len] ;
Rhyme 1:9450e20cf688 70 }
Rhyme 1:9450e20cf688 71 // i2c->read(addr, data, len) ;
Rhyme 1:9450e20cf688 72 printf("0x%02X : ", (unsigned int)addr) ;
Rhyme 1:9450e20cf688 73 for (int i = 0 ; i < len ; i++ ) {
Rhyme 1:9450e20cf688 74 result = i2c->read(addr+i, &data[i], 1) ;
Rhyme 1:9450e20cf688 75 if (result == 0) {
Rhyme 1:9450e20cf688 76 printf("%02X ", data[i]) ;
Rhyme 1:9450e20cf688 77 if (((i+1) < len)&&(((i+1)%0x10) == 0)) {
Rhyme 1:9450e20cf688 78 printf("\n") ;
Rhyme 1:9450e20cf688 79 printf("0x%02X : ", (unsigned int)(addr + i + 1)) ;
Rhyme 1:9450e20cf688 80 }
Rhyme 1:9450e20cf688 81 } else {
Rhyme 1:9450e20cf688 82 printf("failed to read 0x%02X\n", addr+i) ;
Rhyme 1:9450e20cf688 83 }
Rhyme 1:9450e20cf688 84 }
Rhyme 1:9450e20cf688 85 printf("\n") ;
Rhyme 1:9450e20cf688 86 }
Rhyme 1:9450e20cf688 87
Rhyme 1:9450e20cf688 88 void doWrite(void)
Rhyme 1:9450e20cf688 89 {
Rhyme 1:9450e20cf688 90 int addr ;
Rhyme 1:9450e20cf688 91 uint8_t len ;
Rhyme 1:9450e20cf688 92 uint8_t data ;
Rhyme 1:9450e20cf688 93 int ack ;
Rhyme 1:9450e20cf688 94 if (i2c == 0) {
Rhyme 1:9450e20cf688 95 printf("I2C is not opened\n") ;
Rhyme 1:9450e20cf688 96 return ;
Rhyme 1:9450e20cf688 97 }
Rhyme 1:9450e20cf688 98 scanf("%X %X", &addr, &data) ;
Rhyme 1:9450e20cf688 99 ack = i2c->write(addr, &data, 1) ;
Rhyme 1:9450e20cf688 100 if (ack != 0) {
Rhyme 1:9450e20cf688 101 printf("NAK at writing data[0x%02X] to address[0x%02X]\n",
Rhyme 1:9450e20cf688 102 data, addr ) ;
Rhyme 1:9450e20cf688 103 }
Rhyme 1:9450e20cf688 104 }
Rhyme 1:9450e20cf688 105
Rhyme 1:9450e20cf688 106 void doStatus(void)
Rhyme 1:9450e20cf688 107 {
Rhyme 1:9450e20cf688 108 if (i2c == 0) {
Rhyme 1:9450e20cf688 109 printf("i2c is not opened\n") ;
Rhyme 1:9450e20cf688 110 } else {
Rhyme 1:9450e20cf688 111 printf("i2c device at 0x%02X is opened at %d Hz\n",
Rhyme 1:9450e20cf688 112 i2c->address(), i2c->frequency()) ;
Rhyme 1:9450e20cf688 113 }
Rhyme 9:d4f76e6fa35f 114 printf("test loop number = %d\n", test_loop) ;
Rhyme 9:d4f76e6fa35f 115 printf("loop interval = %d ms\n", interval) ;
Rhyme 1:9450e20cf688 116 }
Rhyme 1:9450e20cf688 117
Rhyme 1:9450e20cf688 118 void doHelp(void)
Rhyme 1:9450e20cf688 119 {
Rhyme 1:9450e20cf688 120 printf("Simple I2C test program %s for %s\n", __DATE__, BOARD_NAME) ;
Rhyme 1:9450e20cf688 121 printf("\n === usage ===\n") ;
Rhyme 1:9450e20cf688 122 printf("open <7bit addr> : open i2c device at <7bit addr>\n") ;
Rhyme 1:9450e20cf688 123 printf("close : close currently opened i2c\n") ;
Rhyme 1:9450e20cf688 124 printf("read <addr> <len> : read <len> data from <addr>\n") ;
Rhyme 1:9450e20cf688 125 printf("write <addr> <data> : write <data> to register <addr>\n") ;
Rhyme 1:9450e20cf688 126 printf("frequency <freq> : change frequency to <freq> Hz\n") ;
Rhyme 1:9450e20cf688 127 printf("bus : bus scan for existing I2C addresses\n") ;
Rhyme 1:9450e20cf688 128 printf("test <sensor> : test a sensor\n") ;
Rhyme 1:9450e20cf688 129 printf("loop <number> : specify loop count for test\n") ;
Rhyme 9:d4f76e6fa35f 130 printf("interval <numver> : ms interval for each loop\n") ;
Rhyme 1:9450e20cf688 131 printf("status : print current status\n") ;
Rhyme 1:9450e20cf688 132 printf("help : print this help\n") ;
Rhyme 1:9450e20cf688 133 printf("\nPlease set local-echo to see what you are typing.\n") ;
Rhyme 1:9450e20cf688 134 printf("\n") ;
Rhyme 1:9450e20cf688 135 }
Rhyme 1:9450e20cf688 136
Rhyme 1:9450e20cf688 137 void doFreq(void)
Rhyme 1:9450e20cf688 138 {
Rhyme 1:9450e20cf688 139 int freq = 0 ;
Rhyme 1:9450e20cf688 140 scanf("%d", &freq) ;
Rhyme 1:9450e20cf688 141 if (i2c != 0) {
Rhyme 1:9450e20cf688 142 i2c->frequency(freq) ;
Rhyme 1:9450e20cf688 143 }
Rhyme 1:9450e20cf688 144 }
Rhyme 1:9450e20cf688 145
Rhyme 1:9450e20cf688 146
Rhyme 1:9450e20cf688 147 void print_sensor_name(int address)
Rhyme 1:9450e20cf688 148 {
Rhyme 1:9450e20cf688 149 int i ;
Rhyme 1:9450e20cf688 150 for(i = 0; i2c_sensor[i].address != 0 ; i++) {
Rhyme 1:9450e20cf688 151 if (i2c_sensor[i].address == address) {
Rhyme 1:9450e20cf688 152 printf("%s ", i2c_sensor[i].name) ;
Rhyme 1:9450e20cf688 153 }
Rhyme 1:9450e20cf688 154 }
Rhyme 1:9450e20cf688 155 }
Rhyme 1:9450e20cf688 156
Rhyme 1:9450e20cf688 157 void doBusScan(void)
Rhyme 1:9450e20cf688 158 {
Rhyme 1:9450e20cf688 159 int address ;
Rhyme 9:d4f76e6fa35f 160 uint8_t data[10] ;
Rhyme 9:d4f76e6fa35f 161 int num_data = 1 ;
Rhyme 1:9450e20cf688 162 int result ;
Rhyme 1:9450e20cf688 163 if (i2c != 0) {
Rhyme 1:9450e20cf688 164 printf("Closing I2C at 0x%02X ... ", i2c->address()) ;
Rhyme 1:9450e20cf688 165 delete i2c ;
Rhyme 1:9450e20cf688 166 i2c = 0 ;
Rhyme 1:9450e20cf688 167 printf("Done\n") ;
Rhyme 1:9450e20cf688 168 }
Rhyme 1:9450e20cf688 169
Rhyme 1:9450e20cf688 170 for (address = 1; address < 127 ; address++) {
Rhyme 1:9450e20cf688 171 i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ;
Rhyme 9:d4f76e6fa35f 172 // result = i2c->read(address, &data, 1) ;
Rhyme 9:d4f76e6fa35f 173 if (address == 0x10) {
Rhyme 9:d4f76e6fa35f 174 num_data = 2 ;
Rhyme 9:d4f76e6fa35f 175 } else {
Rhyme 9:d4f76e6fa35f 176 num_data = 1 ;
Rhyme 9:d4f76e6fa35f 177 }
Rhyme 9:d4f76e6fa35f 178 result = i2c->read(0, data, num_data) ;
Rhyme 1:9450e20cf688 179 if (result == 0) {
Rhyme 1:9450e20cf688 180 printf("%02X : ", address) ;
Rhyme 1:9450e20cf688 181 print_sensor_name(address) ;
Rhyme 1:9450e20cf688 182 printf("\n") ;
Rhyme 1:9450e20cf688 183 }
Rhyme 1:9450e20cf688 184 delete i2c ;
Rhyme 1:9450e20cf688 185 i2c = 0 ;
Rhyme 1:9450e20cf688 186 }
Rhyme 1:9450e20cf688 187 printf("\n") ;
Rhyme 1:9450e20cf688 188 }
Rhyme 1:9450e20cf688 189
Rhyme 1:9450e20cf688 190 void setTestLoop(void)
Rhyme 1:9450e20cf688 191 {
Rhyme 1:9450e20cf688 192 int num ;
Rhyme 1:9450e20cf688 193 scanf("%d", &num) ;
Rhyme 1:9450e20cf688 194 if (num < 0) { num = 1 ; }
Rhyme 1:9450e20cf688 195 test_loop = num ;
Rhyme 1:9450e20cf688 196 printf("test loop count set to %d\n", test_loop) ;
Rhyme 1:9450e20cf688 197 }
Rhyme 1:9450e20cf688 198
Rhyme 9:d4f76e6fa35f 199 void setTestInterval(void)
Rhyme 9:d4f76e6fa35f 200 {
Rhyme 9:d4f76e6fa35f 201 int num ;
Rhyme 9:d4f76e6fa35f 202 scanf("%d", &num) ;
Rhyme 9:d4f76e6fa35f 203 if (num < 0) num = 100 ;
Rhyme 9:d4f76e6fa35f 204 interval = num ;
Rhyme 9:d4f76e6fa35f 205 printf("wait %d ms for each loop\n", interval) ;
Rhyme 9:d4f76e6fa35f 206 }
Rhyme 9:d4f76e6fa35f 207
Rhyme 4:c10b1aa9925c 208 void str2upper(char *str)
Rhyme 4:c10b1aa9925c 209 {
Rhyme 4:c10b1aa9925c 210 while(str && *str) {
Rhyme 4:c10b1aa9925c 211 if (('a' <= *str) && (*str <= 'z')) {
Rhyme 4:c10b1aa9925c 212 *str -= 'a' - 'A' ;
Rhyme 4:c10b1aa9925c 213 }
Rhyme 4:c10b1aa9925c 214 str++ ;
Rhyme 4:c10b1aa9925c 215 }
Rhyme 4:c10b1aa9925c 216 }
Rhyme 4:c10b1aa9925c 217
Rhyme 1:9450e20cf688 218 void doTestSensor(void)
Rhyme 1:9450e20cf688 219 {
Rhyme 1:9450e20cf688 220 int i ;
Rhyme 1:9450e20cf688 221 char name[32] ;
Rhyme 1:9450e20cf688 222 scanf("%s", name) ;
Rhyme 4:c10b1aa9925c 223 str2upper(name) ;
Rhyme 1:9450e20cf688 224 for (i = 0 ; i2c_sensor[i].address != 0 ; i++) {
Rhyme 1:9450e20cf688 225 if (strcmp(name, i2c_sensor[i].name) == 0) { /* found */
Rhyme 1:9450e20cf688 226 i2c_sensor[i].test_func() ;
Rhyme 1:9450e20cf688 227 break ;
Rhyme 1:9450e20cf688 228 }
Rhyme 1:9450e20cf688 229 }
Rhyme 1:9450e20cf688 230 }
Rhyme 1:9450e20cf688 231
Rhyme 1:9450e20cf688 232 void doCommand(char *str)
Rhyme 1:9450e20cf688 233 {
Rhyme 1:9450e20cf688 234 switch(*str) {
Rhyme 1:9450e20cf688 235 case 'o': case 'O': /* open */
Rhyme 1:9450e20cf688 236 doOpen() ; break ;
Rhyme 1:9450e20cf688 237 case 'c': case 'C': /* close */
Rhyme 1:9450e20cf688 238 doClose() ; break ;
Rhyme 1:9450e20cf688 239 case 'r': case 'R': /* read */
Rhyme 1:9450e20cf688 240 doRead() ; break ;
Rhyme 1:9450e20cf688 241 case 'w': case 'W': /* write */
Rhyme 1:9450e20cf688 242 doWrite() ; break ;
Rhyme 1:9450e20cf688 243 case 's': case 'S': /* status */
Rhyme 1:9450e20cf688 244 doStatus() ; break ;
Rhyme 1:9450e20cf688 245 case 'f': case 'F': /* Frequency */
Rhyme 1:9450e20cf688 246 doFreq() ; break ;
Rhyme 1:9450e20cf688 247 case 't': case 'T': /* test sensor */
Rhyme 1:9450e20cf688 248 doTestSensor() ; break ;
Rhyme 1:9450e20cf688 249 case 'l': case 'L': /* set test_loop */
Rhyme 1:9450e20cf688 250 setTestLoop() ; break ;
Rhyme 9:d4f76e6fa35f 251 case 'i': case 'I': /* set interval */
Rhyme 9:d4f76e6fa35f 252 setTestInterval() ; break ;
Rhyme 1:9450e20cf688 253 case 'b': case 'B': /* Bus Scan */
Rhyme 1:9450e20cf688 254 doBusScan() ; break ;
Rhyme 1:9450e20cf688 255 default:
Rhyme 1:9450e20cf688 256 doHelp() ; break ;
Rhyme 1:9450e20cf688 257 }
Rhyme 1:9450e20cf688 258 }
Rhyme 1:9450e20cf688 259
Rhyme 1:9450e20cf688 260 int main() {
Rhyme 1:9450e20cf688 261 char cmd[32] ;
Rhyme 1:9450e20cf688 262 tty = new vt100() ;
Rhyme 1:9450e20cf688 263 tty->cls() ;
Rhyme 1:9450e20cf688 264 doHelp() ;
Rhyme 1:9450e20cf688 265 while(1) {
Rhyme 1:9450e20cf688 266 printf("> ") ;
Rhyme 1:9450e20cf688 267 scanf("%s", cmd) ;
Rhyme 1:9450e20cf688 268 doCommand(cmd) ;
Rhyme 1:9450e20cf688 269 }
Rhyme 1:9450e20cf688 270 }