Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of I2C_Debug_for_RealTerm by
Diff: main.cpp
- 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
