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
testSensor.cpp
- Committer:
- Rhyme
- Date:
- 2017-12-28
- Revision:
- 19:dfd1f76515c5
- Parent:
- 18:ee6f43cbfcc1
File content as of revision 19:dfd1f76515c5:
/** testSensor * I2C and I2C sensor test program * For the initial release, * following MSU sensors are supported * FXOS8700CQ * HIH6130 * MAG3110 * MMA8451Q * MMA8452Q * MPL3115A2 * MAX44000 * MAX44005 (not tested) * MAX44008 * * For untested sensor(s) or I2C devices * open / close / read / write * commands are avilable * please refer to the help message and source code * for details. */ #include "mbed.h" #include <string.h> #include <ctype.h> #include "vt100.h" #include "MSS.h" #include "MSU.h" #include "dumb_i2c.h" #define TEST_LOOP 10 DUMB_I2C *i2c = 0 ; vt100 *tty = 0 ; int test_loop = TEST_LOOP ; int interval = 100 ; /* ms wait interval */ void doSWReset(void) { printf("Software Reset\n") ; SCB->AIRCR = 0x05FA0004 ; } void doClose(void) { if (i2c != 0) { printf("Closing I2C at 0x%02X ... ", i2c->address()) ; delete i2c ; i2c = 0 ; printf("Done\n") ; } } void doOpen(void) { uint8_t address ; scanf("%X", &address) ; if (i2c != 0) { doClose() ; } printf("Opening I2C at 0x%02X ... ", address) ; i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ; printf("Done\n") ; } void doRead(void) { int addr ; int len ; uint8_t *data ; int result ; if (i2c == 0) { printf("I2C is not opened\n") ; return ; } scanf("%X %X", &addr, &len) ; if (len > 0) { data = new uint8_t[len] ; } // i2c->read(addr, data, len) ; printf("0x%02X : ", (unsigned int)addr) ; for (int i = 0 ; i < len ; i++ ) { result = i2c->read(addr+i, &data[i], 1) ; if (result == 0) { printf("%02X ", data[i]) ; if (((i+1) < len)&&(((i+1)%0x10) == 0)) { printf("\n") ; printf("0x%02X : ", (unsigned int)(addr + i + 1)) ; } } else { printf("failed to read 0x%02X\n", addr+i) ; } } printf("\n") ; } void doWrite(void) { int addr ; uint8_t len ; uint8_t data ; int ack ; if (i2c == 0) { printf("I2C is not opened\n") ; return ; } scanf("%X %X", &addr, &data) ; ack = i2c->write(addr, &data, 1) ; if (ack != 0) { printf("NAK at writing data[0x%02X] to address[0x%02X]\n", data, addr ) ; } } void doStatus(void) { if (i2c == 0) { printf("i2c is not opened\n") ; } else { printf("i2c device at 0x%02X is opened at %d Hz\n", i2c->address(), i2c->frequency()) ; } printf("test loop number = %d\n", test_loop) ; printf("loop interval = %d ms\n", interval) ; } void doHelp(void) { printf("Simple I2C test program %s for %s\n", __DATE__, BOARD_NAME) ; printf("\n === usage ===\n") ; printf("open <7bit addr> : open i2c device at <7bit addr>\n") ; printf("close : close currently opened i2c\n") ; printf("read <addr> <len> : read <len> data from <addr>\n") ; printf("write <addr> <data> : write <data> to register <addr>\n") ; printf("frequency <freq> : change frequency to <freq> Hz\n") ; printf("bus : bus scan for existing I2C addresses\n") ; printf("test <sensor or address> : test a sensor\n") ; printf("loop <number> : specify loop count for test\n") ; printf("interval <numver> : ms interval for each loop\n") ; printf("status : print current status\n") ; printf("demo : mulitple sensor demo\n") ; printf("help : print this help\n") ; printf("zzz : cause software reset\n") ; printf("\nPlease set local-echo to see what you are typing.\n") ; printf("\n") ; } void doFreq(void) { int freq = 0 ; scanf("%d", &freq) ; if (i2c != 0) { i2c->frequency(freq) ; } } void print_sensor_name(int address) { int i ; for(i = 0; i2c_sensor[i].address != 0 ; i++) { if (i2c_sensor[i].address == address) { printf("%s ", i2c_sensor[i].name) ; } } } void doBusScan(void) { int address ; uint8_t data[10] ; int num_data = 1 ; int result ; if (i2c != 0) { printf("Closing I2C at 0x%02X ... ", i2c->address()) ; delete i2c ; i2c = 0 ; printf("Done\n") ; } for (address = 1; address < 127 ; address++) { i2c = new DUMB_I2C(PIN_SDA, PIN_SCL, address) ; num_data = 2 ; result = i2c->read(0, data, num_data) ; /* data[0] = address << 1 ; i2c->start() ; result = i2c->write(0, data, 1) ; i2c->stop() ; */ if (result == 0) { printf("%02X : ", address) ; print_sensor_name(address) ; printf("\n") ; } delete i2c ; i2c = 0 ; } printf("\n") ; } void setTestLoop(void) { int num ; scanf("%d", &num) ; if (num < 0) { num = 1 ; } test_loop = num ; printf("test loop count set to %d\n", test_loop) ; } void setTestInterval(void) { int num ; scanf("%d", &num) ; if (num < 0) num = 100 ; interval = num ; printf("wait %d ms for each loop\n", interval) ; } void str2upper(char *str) { while(str && *str) { if (('a' <= *str) && (*str <= 'z')) { *str -= 'a' - 'A' ; } str++ ; } } void doTestSensor(void) { int i ; int address = 0 ; char name[32] ; scanf("%s", name) ; str2upper(name) ; if (('0' <= *name)&&(*name <= '9')) { /* assume it's the address */ sscanf(name, "%X", &address) ; for (i = 0 ; i < *(i2c_sensor[i].name) != 0 ; i++ ) { if (i2c_sensor[i].address == address) { strcpy(name, i2c_sensor[i].name) ; break ; } } } else { for (i = 0 ; i2c_sensor[i].address != 0 ; i++) { if (strcmp(name, i2c_sensor[i].name) == 0) { /* found */ break ; } } } if (i2c_sensor[i].name != 0) { /* name found */ i2c_sensor[i].test_func() ; } } void doCommand(char *str) { switch(*str) { case 'o': case 'O': /* open */ doOpen() ; break ; case 'c': case 'C': /* close */ doClose() ; break ; case 'd': case 'D': /* demo */ doDemo() ; break ; case 'r': case 'R': /* read */ doRead() ; break ; case 'w': case 'W': /* write */ doWrite() ; break ; case 's': case 'S': /* status */ doStatus() ; break ; case 'f': case 'F': /* Frequency */ doFreq() ; break ; case 't': case 'T': /* test sensor */ doTestSensor() ; break ; case 'l': case 'L': /* set test_loop */ setTestLoop() ; break ; case 'i': case 'I': /* set interval */ setTestInterval() ; break ; case 'b': case 'B': /* Bus Scan */ doBusScan() ; break ; case 'z': case 'Z': /* Software Reset */ doSWReset() ; break ; default: doHelp() ; break ; } } int main() { char cmd[32] ; uint32_t baud = 115200 ; #if defined (TARGET_MAX32600MBED) baud = 57600 ; #endif tty = new vt100(baud) ; tty->cls() ; doHelp() ; while(1) { printf("> ") ; scanf("%s", cmd) ; doCommand(cmd) ; } }