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:
Thu Dec 28 07:32:28 2017 +0000
Revision:
19:dfd1f76515c5
Parent:
18:ee6f43cbfcc1
test of AK9752, AK9753, AK009970N added

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 17:514f67d94d12 35 void doSWReset(void)
Rhyme 17:514f67d94d12 36 {
Rhyme 17:514f67d94d12 37 printf("Software Reset\n") ;
Rhyme 17:514f67d94d12 38 SCB->AIRCR = 0x05FA0004 ;
Rhyme 17:514f67d94d12 39 }
Rhyme 17:514f67d94d12 40
Rhyme 1:9450e20cf688 41 void doClose(void)
Rhyme 1:9450e20cf688 42 {
Rhyme 1:9450e20cf688 43 if (i2c != 0) {
Rhyme 1:9450e20cf688 44 printf("Closing I2C at 0x%02X ... ", i2c->address()) ;
Rhyme 1:9450e20cf688 45 delete i2c ;
Rhyme 1:9450e20cf688 46 i2c = 0 ;
Rhyme 1:9450e20cf688 47 printf("Done\n") ;
Rhyme 1:9450e20cf688 48 }
Rhyme 1:9450e20cf688 49 }
Rhyme 1:9450e20cf688 50
Rhyme 1:9450e20cf688 51 void doOpen(void)
Rhyme 1:9450e20cf688 52 {
Rhyme 1:9450e20cf688 53 uint8_t address ;
Rhyme 1:9450e20cf688 54 scanf("%X", &address) ;
Rhyme 1:9450e20cf688 55 if (i2c != 0) {
Rhyme 1:9450e20cf688 56 doClose() ;
Rhyme 1:9450e20cf688 57 }
Rhyme 1:9450e20cf688 58 printf("Opening I2C at 0x%02X ... ", address) ;
Rhyme 1:9450e20cf688 59 i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ;
Rhyme 1:9450e20cf688 60 printf("Done\n") ;
Rhyme 1:9450e20cf688 61 }
Rhyme 1:9450e20cf688 62
Rhyme 1:9450e20cf688 63 void doRead(void)
Rhyme 1:9450e20cf688 64 {
Rhyme 1:9450e20cf688 65 int addr ;
Rhyme 1:9450e20cf688 66 int len ;
Rhyme 1:9450e20cf688 67 uint8_t *data ;
Rhyme 1:9450e20cf688 68 int result ;
Rhyme 1:9450e20cf688 69 if (i2c == 0) {
Rhyme 1:9450e20cf688 70 printf("I2C is not opened\n") ;
Rhyme 1:9450e20cf688 71 return ;
Rhyme 1:9450e20cf688 72 }
Rhyme 1:9450e20cf688 73 scanf("%X %X", &addr, &len) ;
Rhyme 1:9450e20cf688 74 if (len > 0) {
Rhyme 1:9450e20cf688 75 data = new uint8_t[len] ;
Rhyme 1:9450e20cf688 76 }
Rhyme 1:9450e20cf688 77 // i2c->read(addr, data, len) ;
Rhyme 1:9450e20cf688 78 printf("0x%02X : ", (unsigned int)addr) ;
Rhyme 1:9450e20cf688 79 for (int i = 0 ; i < len ; i++ ) {
Rhyme 1:9450e20cf688 80 result = i2c->read(addr+i, &data[i], 1) ;
Rhyme 1:9450e20cf688 81 if (result == 0) {
Rhyme 1:9450e20cf688 82 printf("%02X ", data[i]) ;
Rhyme 1:9450e20cf688 83 if (((i+1) < len)&&(((i+1)%0x10) == 0)) {
Rhyme 1:9450e20cf688 84 printf("\n") ;
Rhyme 1:9450e20cf688 85 printf("0x%02X : ", (unsigned int)(addr + i + 1)) ;
Rhyme 1:9450e20cf688 86 }
Rhyme 1:9450e20cf688 87 } else {
Rhyme 1:9450e20cf688 88 printf("failed to read 0x%02X\n", addr+i) ;
Rhyme 1:9450e20cf688 89 }
Rhyme 1:9450e20cf688 90 }
Rhyme 1:9450e20cf688 91 printf("\n") ;
Rhyme 1:9450e20cf688 92 }
Rhyme 1:9450e20cf688 93
Rhyme 1:9450e20cf688 94 void doWrite(void)
Rhyme 1:9450e20cf688 95 {
Rhyme 1:9450e20cf688 96 int addr ;
Rhyme 1:9450e20cf688 97 uint8_t len ;
Rhyme 1:9450e20cf688 98 uint8_t data ;
Rhyme 1:9450e20cf688 99 int ack ;
Rhyme 1:9450e20cf688 100 if (i2c == 0) {
Rhyme 1:9450e20cf688 101 printf("I2C is not opened\n") ;
Rhyme 1:9450e20cf688 102 return ;
Rhyme 1:9450e20cf688 103 }
Rhyme 1:9450e20cf688 104 scanf("%X %X", &addr, &data) ;
Rhyme 1:9450e20cf688 105 ack = i2c->write(addr, &data, 1) ;
Rhyme 1:9450e20cf688 106 if (ack != 0) {
Rhyme 1:9450e20cf688 107 printf("NAK at writing data[0x%02X] to address[0x%02X]\n",
Rhyme 1:9450e20cf688 108 data, addr ) ;
Rhyme 1:9450e20cf688 109 }
Rhyme 1:9450e20cf688 110 }
Rhyme 1:9450e20cf688 111
Rhyme 1:9450e20cf688 112 void doStatus(void)
Rhyme 1:9450e20cf688 113 {
Rhyme 1:9450e20cf688 114 if (i2c == 0) {
Rhyme 1:9450e20cf688 115 printf("i2c is not opened\n") ;
Rhyme 1:9450e20cf688 116 } else {
Rhyme 1:9450e20cf688 117 printf("i2c device at 0x%02X is opened at %d Hz\n",
Rhyme 1:9450e20cf688 118 i2c->address(), i2c->frequency()) ;
Rhyme 1:9450e20cf688 119 }
Rhyme 9:d4f76e6fa35f 120 printf("test loop number = %d\n", test_loop) ;
Rhyme 9:d4f76e6fa35f 121 printf("loop interval = %d ms\n", interval) ;
Rhyme 1:9450e20cf688 122 }
Rhyme 1:9450e20cf688 123
Rhyme 1:9450e20cf688 124 void doHelp(void)
Rhyme 1:9450e20cf688 125 {
Rhyme 1:9450e20cf688 126 printf("Simple I2C test program %s for %s\n", __DATE__, BOARD_NAME) ;
Rhyme 1:9450e20cf688 127 printf("\n === usage ===\n") ;
Rhyme 1:9450e20cf688 128 printf("open <7bit addr> : open i2c device at <7bit addr>\n") ;
Rhyme 1:9450e20cf688 129 printf("close : close currently opened i2c\n") ;
Rhyme 1:9450e20cf688 130 printf("read <addr> <len> : read <len> data from <addr>\n") ;
Rhyme 1:9450e20cf688 131 printf("write <addr> <data> : write <data> to register <addr>\n") ;
Rhyme 1:9450e20cf688 132 printf("frequency <freq> : change frequency to <freq> Hz\n") ;
Rhyme 1:9450e20cf688 133 printf("bus : bus scan for existing I2C addresses\n") ;
Rhyme 12:b3dff3bbb1eb 134 printf("test <sensor or address> : test a sensor\n") ;
Rhyme 1:9450e20cf688 135 printf("loop <number> : specify loop count for test\n") ;
Rhyme 9:d4f76e6fa35f 136 printf("interval <numver> : ms interval for each loop\n") ;
Rhyme 1:9450e20cf688 137 printf("status : print current status\n") ;
Rhyme 14:1e6e4fdf90d0 138 printf("demo : mulitple sensor demo\n") ;
Rhyme 1:9450e20cf688 139 printf("help : print this help\n") ;
Rhyme 17:514f67d94d12 140 printf("zzz : cause software reset\n") ;
Rhyme 1:9450e20cf688 141 printf("\nPlease set local-echo to see what you are typing.\n") ;
Rhyme 1:9450e20cf688 142 printf("\n") ;
Rhyme 1:9450e20cf688 143 }
Rhyme 1:9450e20cf688 144
Rhyme 1:9450e20cf688 145 void doFreq(void)
Rhyme 1:9450e20cf688 146 {
Rhyme 1:9450e20cf688 147 int freq = 0 ;
Rhyme 1:9450e20cf688 148 scanf("%d", &freq) ;
Rhyme 1:9450e20cf688 149 if (i2c != 0) {
Rhyme 1:9450e20cf688 150 i2c->frequency(freq) ;
Rhyme 1:9450e20cf688 151 }
Rhyme 1:9450e20cf688 152 }
Rhyme 1:9450e20cf688 153
Rhyme 1:9450e20cf688 154
Rhyme 1:9450e20cf688 155 void print_sensor_name(int address)
Rhyme 1:9450e20cf688 156 {
Rhyme 1:9450e20cf688 157 int i ;
Rhyme 1:9450e20cf688 158 for(i = 0; i2c_sensor[i].address != 0 ; i++) {
Rhyme 1:9450e20cf688 159 if (i2c_sensor[i].address == address) {
Rhyme 1:9450e20cf688 160 printf("%s ", i2c_sensor[i].name) ;
Rhyme 1:9450e20cf688 161 }
Rhyme 1:9450e20cf688 162 }
Rhyme 1:9450e20cf688 163 }
Rhyme 1:9450e20cf688 164
Rhyme 1:9450e20cf688 165 void doBusScan(void)
Rhyme 1:9450e20cf688 166 {
Rhyme 1:9450e20cf688 167 int address ;
Rhyme 9:d4f76e6fa35f 168 uint8_t data[10] ;
Rhyme 9:d4f76e6fa35f 169 int num_data = 1 ;
Rhyme 1:9450e20cf688 170 int result ;
Rhyme 1:9450e20cf688 171 if (i2c != 0) {
Rhyme 1:9450e20cf688 172 printf("Closing I2C at 0x%02X ... ", i2c->address()) ;
Rhyme 1:9450e20cf688 173 delete i2c ;
Rhyme 1:9450e20cf688 174 i2c = 0 ;
Rhyme 1:9450e20cf688 175 printf("Done\n") ;
Rhyme 1:9450e20cf688 176 }
Rhyme 1:9450e20cf688 177
Rhyme 1:9450e20cf688 178 for (address = 1; address < 127 ; address++) {
Rhyme 1:9450e20cf688 179 i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ;
Rhyme 17:514f67d94d12 180 num_data = 2 ;
Rhyme 9:d4f76e6fa35f 181 result = i2c->read(0, data, num_data) ;
Rhyme 18:ee6f43cbfcc1 182 /*
Rhyme 18:ee6f43cbfcc1 183 data[0] = address << 1 ;
Rhyme 18:ee6f43cbfcc1 184 i2c->start() ;
Rhyme 18:ee6f43cbfcc1 185 result = i2c->write(0, data, 1) ;
Rhyme 18:ee6f43cbfcc1 186 i2c->stop() ;
Rhyme 18:ee6f43cbfcc1 187 */
Rhyme 1:9450e20cf688 188 if (result == 0) {
Rhyme 1:9450e20cf688 189 printf("%02X : ", address) ;
Rhyme 1:9450e20cf688 190 print_sensor_name(address) ;
Rhyme 1:9450e20cf688 191 printf("\n") ;
Rhyme 1:9450e20cf688 192 }
Rhyme 1:9450e20cf688 193 delete i2c ;
Rhyme 1:9450e20cf688 194 i2c = 0 ;
Rhyme 1:9450e20cf688 195 }
Rhyme 1:9450e20cf688 196 printf("\n") ;
Rhyme 1:9450e20cf688 197 }
Rhyme 1:9450e20cf688 198
Rhyme 1:9450e20cf688 199 void setTestLoop(void)
Rhyme 1:9450e20cf688 200 {
Rhyme 1:9450e20cf688 201 int num ;
Rhyme 1:9450e20cf688 202 scanf("%d", &num) ;
Rhyme 1:9450e20cf688 203 if (num < 0) { num = 1 ; }
Rhyme 1:9450e20cf688 204 test_loop = num ;
Rhyme 1:9450e20cf688 205 printf("test loop count set to %d\n", test_loop) ;
Rhyme 1:9450e20cf688 206 }
Rhyme 1:9450e20cf688 207
Rhyme 9:d4f76e6fa35f 208 void setTestInterval(void)
Rhyme 9:d4f76e6fa35f 209 {
Rhyme 9:d4f76e6fa35f 210 int num ;
Rhyme 9:d4f76e6fa35f 211 scanf("%d", &num) ;
Rhyme 9:d4f76e6fa35f 212 if (num < 0) num = 100 ;
Rhyme 9:d4f76e6fa35f 213 interval = num ;
Rhyme 9:d4f76e6fa35f 214 printf("wait %d ms for each loop\n", interval) ;
Rhyme 9:d4f76e6fa35f 215 }
Rhyme 9:d4f76e6fa35f 216
Rhyme 4:c10b1aa9925c 217 void str2upper(char *str)
Rhyme 4:c10b1aa9925c 218 {
Rhyme 4:c10b1aa9925c 219 while(str && *str) {
Rhyme 4:c10b1aa9925c 220 if (('a' <= *str) && (*str <= 'z')) {
Rhyme 4:c10b1aa9925c 221 *str -= 'a' - 'A' ;
Rhyme 4:c10b1aa9925c 222 }
Rhyme 4:c10b1aa9925c 223 str++ ;
Rhyme 4:c10b1aa9925c 224 }
Rhyme 4:c10b1aa9925c 225 }
Rhyme 4:c10b1aa9925c 226
Rhyme 1:9450e20cf688 227 void doTestSensor(void)
Rhyme 1:9450e20cf688 228 {
Rhyme 1:9450e20cf688 229 int i ;
Rhyme 12:b3dff3bbb1eb 230 int address = 0 ;
Rhyme 1:9450e20cf688 231 char name[32] ;
Rhyme 1:9450e20cf688 232 scanf("%s", name) ;
Rhyme 4:c10b1aa9925c 233 str2upper(name) ;
Rhyme 12:b3dff3bbb1eb 234 if (('0' <= *name)&&(*name <= '9')) { /* assume it's the address */
Rhyme 12:b3dff3bbb1eb 235 sscanf(name, "%X", &address) ;
Rhyme 12:b3dff3bbb1eb 236 for (i = 0 ; i < *(i2c_sensor[i].name) != 0 ; i++ ) {
Rhyme 12:b3dff3bbb1eb 237 if (i2c_sensor[i].address == address) {
Rhyme 12:b3dff3bbb1eb 238 strcpy(name, i2c_sensor[i].name) ;
Rhyme 12:b3dff3bbb1eb 239 break ;
Rhyme 12:b3dff3bbb1eb 240 }
Rhyme 12:b3dff3bbb1eb 241 }
Rhyme 12:b3dff3bbb1eb 242 } else {
Rhyme 12:b3dff3bbb1eb 243 for (i = 0 ; i2c_sensor[i].address != 0 ; i++) {
Rhyme 12:b3dff3bbb1eb 244 if (strcmp(name, i2c_sensor[i].name) == 0) { /* found */
Rhyme 12:b3dff3bbb1eb 245 break ;
Rhyme 12:b3dff3bbb1eb 246 }
Rhyme 1:9450e20cf688 247 }
Rhyme 1:9450e20cf688 248 }
Rhyme 12:b3dff3bbb1eb 249 if (i2c_sensor[i].name != 0) { /* name found */
Rhyme 12:b3dff3bbb1eb 250 i2c_sensor[i].test_func() ;
Rhyme 12:b3dff3bbb1eb 251 }
Rhyme 12:b3dff3bbb1eb 252
Rhyme 1:9450e20cf688 253 }
Rhyme 1:9450e20cf688 254
Rhyme 1:9450e20cf688 255 void doCommand(char *str)
Rhyme 1:9450e20cf688 256 {
Rhyme 1:9450e20cf688 257 switch(*str) {
Rhyme 1:9450e20cf688 258 case 'o': case 'O': /* open */
Rhyme 1:9450e20cf688 259 doOpen() ; break ;
Rhyme 1:9450e20cf688 260 case 'c': case 'C': /* close */
Rhyme 1:9450e20cf688 261 doClose() ; break ;
Rhyme 14:1e6e4fdf90d0 262 case 'd': case 'D': /* demo */
Rhyme 14:1e6e4fdf90d0 263 doDemo() ; break ;
Rhyme 1:9450e20cf688 264 case 'r': case 'R': /* read */
Rhyme 1:9450e20cf688 265 doRead() ; break ;
Rhyme 1:9450e20cf688 266 case 'w': case 'W': /* write */
Rhyme 1:9450e20cf688 267 doWrite() ; break ;
Rhyme 1:9450e20cf688 268 case 's': case 'S': /* status */
Rhyme 1:9450e20cf688 269 doStatus() ; break ;
Rhyme 1:9450e20cf688 270 case 'f': case 'F': /* Frequency */
Rhyme 1:9450e20cf688 271 doFreq() ; break ;
Rhyme 1:9450e20cf688 272 case 't': case 'T': /* test sensor */
Rhyme 1:9450e20cf688 273 doTestSensor() ; break ;
Rhyme 1:9450e20cf688 274 case 'l': case 'L': /* set test_loop */
Rhyme 1:9450e20cf688 275 setTestLoop() ; break ;
Rhyme 9:d4f76e6fa35f 276 case 'i': case 'I': /* set interval */
Rhyme 9:d4f76e6fa35f 277 setTestInterval() ; break ;
Rhyme 1:9450e20cf688 278 case 'b': case 'B': /* Bus Scan */
Rhyme 1:9450e20cf688 279 doBusScan() ; break ;
Rhyme 17:514f67d94d12 280 case 'z': case 'Z': /* Software Reset */
Rhyme 17:514f67d94d12 281 doSWReset() ; break ;
Rhyme 1:9450e20cf688 282 default:
Rhyme 1:9450e20cf688 283 doHelp() ; break ;
Rhyme 1:9450e20cf688 284 }
Rhyme 1:9450e20cf688 285 }
Rhyme 1:9450e20cf688 286
Rhyme 1:9450e20cf688 287 int main() {
Rhyme 1:9450e20cf688 288 char cmd[32] ;
Rhyme 13:91e4be27e7c1 289 uint32_t baud = 115200 ;
Rhyme 13:91e4be27e7c1 290 #if defined (TARGET_MAX32600MBED)
Rhyme 13:91e4be27e7c1 291 baud = 57600 ;
Rhyme 13:91e4be27e7c1 292 #endif
Rhyme 13:91e4be27e7c1 293 tty = new vt100(baud) ;
Rhyme 1:9450e20cf688 294 tty->cls() ;
Rhyme 1:9450e20cf688 295 doHelp() ;
Rhyme 1:9450e20cf688 296 while(1) {
Rhyme 1:9450e20cf688 297 printf("> ") ;
Rhyme 1:9450e20cf688 298 scanf("%s", cmd) ;
Rhyme 1:9450e20cf688 299 doCommand(cmd) ;
Rhyme 1:9450e20cf688 300 }
Rhyme 1:9450e20cf688 301 }