MSS
/
testI2C
Simple I2C test program. open/close/read/write supported.
Diff: main.cpp
- Revision:
- 2:218e22a54982
- Parent:
- 1:e105ceaee6ac
--- a/main.cpp Tue Apr 05 02:11:20 2016 +0000 +++ b/main.cpp Tue Apr 05 06:53:27 2016 +0000 @@ -35,6 +35,7 @@ int addr ; int len ; uint8_t *data ; + int result ; if (i2c == 0) { printf("I2C is not opened\n") ; return ; @@ -46,12 +47,16 @@ // i2c->read(addr, data, len) ; printf("0x%02X : ", (unsigned int)addr) ; for (int i = 0 ; i < len ; i++ ) { - i2c->read(addr+i, &data[i], 1) ; - printf("%02X ", data[i]) ; - if (((i+1) < len)&&(((i+1)%0x10) == 0)) { - printf("\n") ; - printf("0x%02X : ", (unsigned int)(addr + i + 1)) ; - } + 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") ; } @@ -61,12 +66,17 @@ int addr ; uint8_t len ; uint8_t data ; - if (i2c == 0) { + int ack ; + if (i2c == 0) { printf("I2C is not opened\n") ; return ; } scanf("%X %X", &addr, &data) ; - i2c->write(addr, &data, 1) ; + 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) @@ -88,6 +98,7 @@ 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("status : print current status\n") ; printf("help : print this help\n") ; printf("\nPlease set local-echo to see what you are typing.\n") ; @@ -103,21 +114,47 @@ } } +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) ; + } + delete i2c ; + i2c = 0 ; + } + printf("\n") ; +} + void doCommand(char *str) { switch(*str) { case 'o': case 'O': /* open */ - doOpen() ; break ; + doOpen() ; break ; case 'c': case 'C': /* close */ - doClose() ; break ; + doClose() ; break ; case 'r': case 'R': /* read */ - doRead() ; break ; + doRead() ; break ; case 'w': case 'W': /* write */ - doWrite() ; break ; + doWrite() ; break ; case 's': case 'S': /* status */ - doStatus() ; break ; + doStatus() ; break ; case 'f': case 'F': /* Frequency */ - doFreq() ; break ; + doFreq() ; break ; + case 'b': case 'B': /* Bus Scan */ + doBusScan() ; break ; default: doHelp() ; break ; }