I2C

Dependencies:   TextLCD mbed

Fork of I2C_Debug_for_RealTerm by jim hamblen

main.cpp

Committer:
Tuxitheone
Date:
2016-02-29
Revision:
3:8e2db72d0d7d
Parent:
2:fa8c916b42a9

File content as of revision 3:8e2db72d0d7d:

#include "mbed.h"
#include "TextLCD.h"

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);
I2C i2c(p9,p10);
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD20x2);        // 4bit bus: rs, e, d4-d7

int main() {
    char last_command=0;
    char previous_command=0;
    char current_char=0;
    char address=0;
    char data [255];
    char current_byte=0;
    char cmd[255];
    int cmd_count=0;
    int data_count=0;
    int read=0;
    int write=0;
    int first_data_byte=0;
    int i=0;

    myled=1;
    i2c.frequency(75000);
    i2c.start();
    i2c.stop();
    // Send a start message to RealTerm
    lcd.printf("\fmbed I2C debug tool ready\n\r");
    // Scan for I2C devices that reply with ack
    for (i=0; i<=254; i=i+2) {
        if (i2c.read(i, &data[0], 1) ==0) printf("I2C device detected at address=%2.2X\n\r", i);
    }
    data[0]=0;
    i2c.start();
    i2c.stop();
// Loop processing command strings from RealTerm
    while (1) {
        current_char = pc.getc();
        // Is it a two character ASCII string data byte value
        if ((current_char <='F') && (current_char !='?')) {
            // convert to a binary byte
            if (current_char <='9') current_byte = current_char - '0';
            else current_byte =current_char +10 -'A';
            current_char = pc.getc();
            if (current_char >'F') lcd.printf("error|\n\r");
            if (current_char <='9') current_byte = (current_byte <<4) | (current_char - '0');
            else current_byte = (current_byte <<4)|(current_char +10 -'A');
            // first byte after S command is the I2C address
            if (first_data_byte==1) {
                first_data_byte=0;
                address=current_byte;
                lcd.printf(" -I2C address=%2.2X ", address);
                //Odd I2C address is a read and even is a write
                if ((address & 0x01) == 0) write=1;
                else read=1;
            } else
                // Read in cmd bytes for write
                if ((last_command == 'S')&&(read==0)) {
                    cmd[cmd_count]=current_byte;
                    cmd_count++;
                }
            // number of bytes for a read
            if ((last_command =='R')||(read==1)) data_count=current_byte;
        } else {
            // Not a number - it is a command character
            last_command = current_char;
            switch (last_command) {
                    // Start
                case 'S':
                    if (previous_command == 'S') i2c.start();
                    first_data_byte=1;
                    break;
                    // Stop
                case 'P':
                    // Do the I2C write
                    if (write==1) {
                        lcd.printf(" write ");
                        if (i2c.write(address,cmd,cmd_count)!=0) lcd.printf(" No Ack! ");
                        for (i=0; i<cmd_count; i++)
                            lcd.printf(" cmd=%2.2X ", cmd[i]);
                    }
                    // Do the I2C read
                    if (read==1) {
                        lcd.printf(" read ");
                        if (i2c.read(address, data, data_count) != 0) lcd.printf(" No Ack! ");
                        for (i=0; i<data_count; i++)
                            lcd.printf(" data=%2.2X ",data[i]);
                    }
                    // reset values for next I2C operation
                    i2c.stop();
                    lcd.printf("\n\r");
                    read=0;
                    data_count=0;
                    cmd_count=0;
                    write=0;
                    first_data_byte=0;
                    break;
                    // Read after write
                case 'R':
                    read=1;
                    break;
                    // Status request
                case '?':
                    lcd.printf(" mbed ready \n\r");
                    break;
                    // Unknown or unimplemented command
                default:
                    lcd.printf(" unknown command \n\r");
                    break;
            }
            previous_command = last_command;
        }
    }
}