Skovbrynet
/
I2C_Debug_LCD
I2C
Fork of I2C_Debug_for_RealTerm by
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; } } }