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

Revision:
1:9450e20cf688
Child:
4:c10b1aa9925c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testSensor.cpp	Tue Apr 26 05:39:37 2016 +0000
@@ -0,0 +1,237 @@
+/** 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 ;
+
+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()) ;
+    }
+}
+
+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>       : test a sensor\n") ;
+    printf("loop <number>       : specify loop count for test\n") ;
+    printf("status              : print current status\n") ;
+    printf("help                : print this help\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 ;
+    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) ;
+        result = i2c->read(address, &data, 1) ;
+        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 doTestSensor(void) 
+{
+    int i ;
+    char name[32] ;
+    scanf("%s", name) ;
+    for (i = 0 ; i2c_sensor[i].address != 0 ; i++) {
+        if (strcmp(name, i2c_sensor[i].name) == 0) { /* found */
+            i2c_sensor[i].test_func() ;
+            break ;
+        }
+    }
+}
+    
+void doCommand(char *str)
+{
+    switch(*str) {
+    case 'o': case 'O': /* open */
+        doOpen()    ; break ;
+    case 'c': case 'C': /* close */
+        doClose()   ; 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 'b': case 'B': /* Bus Scan */
+        doBusScan() ; break ;
+    default:
+        doHelp() ; break ;
+    }
+}
+
+int main() {
+    char cmd[32] ;
+    tty = new vt100() ;
+    tty->cls() ;
+    doHelp() ;
+    while(1) {
+        printf("> ") ;
+        scanf("%s", cmd) ;
+        doCommand(cmd) ;
+    }
+}