Simple I2C test program. open/close/read/write supported.

Dependencies:   mbed vt100

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Tue Apr 05 06:53:27 2016 +0000
Parent:
1:e105ceaee6ac
Commit message:
condition check for read/write and bus scan added;

Changed in this revision

dumb_i2c.cpp Show annotated file Show diff for this revision Revisions of this file
dumb_i2c.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/dumb_i2c.cpp	Tue Apr 05 02:11:20 2016 +0000
+++ b/dumb_i2c.cpp	Tue Apr 05 06:53:27 2016 +0000
@@ -25,29 +25,37 @@
     return(freq) ;
 }
 
-void DUMB_I2C::read(int addr, uint8_t *data, int len) 
+int DUMB_I2C::read(int addr, uint8_t *data, int len) 
 {
-    readRegs(addr, data, len) ;
+    int result ;
+    result = readRegs(addr, data, len) ;
+    return( result ) ;
 }
 
-void DUMB_I2C::write(int addr, uint8_t *data, int len) 
+int DUMB_I2C::write(int addr, uint8_t *data, int len) 
 {
     uint8_t *buf ;
+    int ack ;
     buf = new uint8_t[len+1] ;
     buf[0] = addr ;
     for (int i = 0 ; i < len ; i++ ) {
         buf[i+1] = data[i] ;
     }
-    writeRegs(buf, len+1) ;
+    ack = writeRegs(buf, len+1) ;
     delete buf ;
+    return( ack ) ;
 }
 
-void DUMB_I2C::readRegs(int addr, uint8_t * data, int len) {
+int DUMB_I2C::readRegs(int addr, uint8_t * data, int len) {
+    int result ;
     char t[1] = {addr};
     m_i2c.write(m_addr, t, 1, true);
-    m_i2c.read(m_addr, (char *)data, len);
+    result = m_i2c.read(m_addr, (char *)data, len);
+    return( result ) ;
 }
 
-void DUMB_I2C::writeRegs(uint8_t * data, int len) {
-    m_i2c.write(m_addr, (char *)data, len);
+int DUMB_I2C::writeRegs(uint8_t * data, int len) {
+    int ack ;
+    ack = m_i2c.write(m_addr, (char *)data, len);
+    return( ack ) ;
 }
\ No newline at end of file
--- a/dumb_i2c.h	Tue Apr 05 02:11:20 2016 +0000
+++ b/dumb_i2c.h	Tue Apr 05 06:53:27 2016 +0000
@@ -21,14 +21,14 @@
   void frequency(uint32_t f) ;
   uint32_t frequency(void) ;
   uint8_t address(void) ;
-  void read(int addr, uint8_t *data, int len) ;
-  void write(int addr, uint8_t *data, int len) ;
+  int read(int addr, uint8_t *data, int len) ;
+  int write(int addr, uint8_t *data, int len) ;
 private:
   I2C m_i2c;
   int m_addr;
   uint32_t freq ;
-  void readRegs(int addr, uint8_t * data, int len);
-  void writeRegs(uint8_t * data, int len);
+  int readRegs(int addr, uint8_t * data, int len);
+  int writeRegs(uint8_t * data, int len);
 };
 
 #endif /* _DUMB_I2C_H_ */
\ No newline at end of file
--- 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 ;
     }