I2C

Dependencies:   TextLCD mbed

Fork of I2C_Debug_for_RealTerm by jim hamblen

main.cpp

Committer:
4180_1
Date:
2011-03-08
Revision:
0:0c54b73b002c
Child:
1:be1498ba7fb4

File content as of revision 0:0c54b73b002c:

#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;
        }


    }
}