I2C

Dependencies:   TextLCD mbed

Fork of I2C_Debug_for_RealTerm by jim hamblen

Revision:
0:0c54b73b002c
Child:
1:be1498ba7fb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 08 03:16:34 2011 +0000
@@ -0,0 +1,128 @@
+#include "mbed.h"
+
+// The program sends and receives I2C commands using RealTerm's I2C tab feature
+// Run Realterm on PC and this program on mbed
+// In RealTerm connect to the mbed's USB virtual COM port
+// Switch to I2C tab
+// Type in I2C address & data to read and write and see the response
+// It is handy to debug complex I2C hardware setups
+// Prints "noack!" when no I2C device responds
+DigitalOut myled(LED1);
+Serial pc(USBTX, USBRX);
+I2C i2c(p9,p10);
+
+char data_length=0;
+int read=0;
+int write=0;
+
+//ugly code structure - should start over and fix this later
+//now that I understand syntax for command strings a bit more - but it works
+// Read in two ASCII characters and convert to a byte
+// ...unless a command character is found
+int getbyte(char *data) {
+    char charin=0;
+    charin = pc.getc();
+    if (charin == 'R') {
+        read=1;
+        if (getbyte(&data_length)==0) pc.printf("error");
+        return 2;
+    }
+    if (charin == 'P') return 3;
+    if (charin > 'F') return 0;
+    if (charin <='9') charin = charin - '0';
+    else charin = charin +10 - 'A';
+    *data = charin << 4;
+    charin = pc.getc();
+    if (charin > 'F') return 0;
+    if (charin <='9') charin = charin - '0';
+    else charin = charin +10 - 'A';
+    *data = *data | charin;
+    return 1;
+}
+int main() {
+
+    char command=0;
+    char address=0x40;
+    char data[255];
+    char cmd[255];
+    int cmd_count=0;
+    int more_cmd = 0;
+    int i=0;
+    myled=1;
+    data[0]=0;
+    data[1]=0;
+    i2c.frequency(75000);
+    i2c.start();
+    i2c.start();
+    pc.printf("\fmbed I2C ready\n\r");
+// loop forever waiting for PC serial commands
+    while (1) {
+        command = pc.getc();
+        switch (command) {
+            case 'S':
+                //Start - automatic start sent on read or write
+                data_length=0;
+                cmd_count=0;
+                read=0;
+                write=0;
+                // in case of multiple starts 
+                while (getbyte(&address)==0) {i2c.start();};
+                pc.printf(" - I2C address=%2.2X ", address);
+                //odd address means a read, otherwise a write
+                if ((address & 0x01) == 1) read=1;
+                else write=1;
+                if (read ==1) {
+                //read number of bytes to read
+                    if (getbyte(&data_length)==0) break;
+                }
+                if (write==1) {
+                    more_cmd =1;
+                    while (more_cmd==1) {
+                        if (getbyte(&cmd[cmd_count])>=2) {
+                            pc.printf(" write ");
+                            // write I2C command(s)
+                            if (i2c.write(address, cmd, cmd_count)!=0) pc.printf(" noack! ");
+                            for (i=0; i<cmd_count; i++)
+                                pc.printf(" command=%2.2X ", cmd[i]);
+                            cmd_count=0;
+                            more_cmd=0;
+                            write = 0;
+                        } else cmd_count++;
+                    }
+                    if (read==0) pc.printf("\n\r");;
+                }
+                break;
+            case 'P':
+                //Stop
+                if (read == 1) {
+                    pc.printf(" read ");
+                    // read I2C data
+                    if (i2c.read(address, data, data_length)!=0) pc.printf(" noack! ");
+                    read = 0;
+                    write = 0;
+                    // send I2C data back to PC serial port
+                    for (i=0; i<data_length; i++)
+                        pc.printf(" data=%2.2X ",data[i]);
+                }
+                pc.printf("\n\r");
+                data_length=0;
+                cmd_count=0;
+                i2c.stop();
+                break;
+            case 'R':
+                //automatic read after write - read number of bytes to read
+                if (getbyte(&data_length)==0) break;
+                break;
+            case '?':
+                //Status
+                pc.printf(" mbed ready \n\r");
+                break;
+            default:
+
+                myled = 0;
+                break;
+        }
+
+
+    }
+}
\ No newline at end of file