I2C debug program for use with RealTerm. Sends I2C commands to P9 and P10. Run program on mbed. Start RealTerm, select the mbed virtual com port under the port tab, then open RealTerm's I2C command tab. Reset mbed. See http://mbed.org/users/4180_1/notebook/i2c-debug-for-realterm/ for instructions

Dependencies:   mbed

Committer:
4180_1
Date:
Mon Mar 14 00:50:34 2011 +0000
Revision:
2:fa8c916b42a9
Parent:
1:be1498ba7fb4
ver3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
4180_1 0:0c54b73b002c 1 #include "mbed.h"
4180_1 0:0c54b73b002c 2 // The program sends and receives I2C commands using RealTerm's I2C tab feature
4180_1 0:0c54b73b002c 3 // Run Realterm on PC and this program on mbed
4180_1 0:0c54b73b002c 4 // In RealTerm connect to the mbed's USB virtual COM port
4180_1 0:0c54b73b002c 5 // Switch to I2C tab
4180_1 0:0c54b73b002c 6 // Type in I2C address & data to read and write and see the response
4180_1 0:0c54b73b002c 7 // It is handy to debug complex I2C hardware setups
4180_1 1:be1498ba7fb4 8 // Prints "No Ack!" when no I2C device responds to the address
4180_1 1:be1498ba7fb4 9 //
4180_1 1:be1498ba7fb4 10 // See Instructions at http://mbed.org/users/4180_1/notebook/i2c-debug-for-realterm/
4180_1 1:be1498ba7fb4 11 //
4180_1 0:0c54b73b002c 12 DigitalOut myled(LED1);
4180_1 0:0c54b73b002c 13 Serial pc(USBTX, USBRX);
4180_1 0:0c54b73b002c 14 I2C i2c(p9,p10);
4180_1 0:0c54b73b002c 15
4180_1 0:0c54b73b002c 16 int main() {
4180_1 1:be1498ba7fb4 17 char last_command=0;
4180_1 2:fa8c916b42a9 18 char previous_command=0;
4180_1 1:be1498ba7fb4 19 char current_char=0;
4180_1 1:be1498ba7fb4 20 char address=0;
4180_1 1:be1498ba7fb4 21 char data [255];
4180_1 1:be1498ba7fb4 22 char current_byte=0;
4180_1 0:0c54b73b002c 23 char cmd[255];
4180_1 0:0c54b73b002c 24 int cmd_count=0;
4180_1 1:be1498ba7fb4 25 int data_count=0;
4180_1 1:be1498ba7fb4 26 int read=0;
4180_1 1:be1498ba7fb4 27 int write=0;
4180_1 1:be1498ba7fb4 28 int first_data_byte=0;
4180_1 0:0c54b73b002c 29 int i=0;
4180_1 1:be1498ba7fb4 30
4180_1 0:0c54b73b002c 31 myled=1;
4180_1 0:0c54b73b002c 32 i2c.frequency(75000);
4180_1 0:0c54b73b002c 33 i2c.start();
4180_1 1:be1498ba7fb4 34 i2c.stop();
4180_1 2:fa8c916b42a9 35 // Send a start message to RealTerm
4180_1 2:fa8c916b42a9 36 pc.printf("\fmbed I2C debug tool ready\n\r");
4180_1 2:fa8c916b42a9 37 // Scan for I2C devices that reply with ack
4180_1 2:fa8c916b42a9 38 for (i=0; i<=254; i=i+2) {
4180_1 2:fa8c916b42a9 39 if (i2c.read(i, &data[0], 1) ==0) printf("I2C device detected at address=%2.2X\n\r", i);
4180_1 2:fa8c916b42a9 40 }
4180_1 2:fa8c916b42a9 41 data[0]=0;
4180_1 0:0c54b73b002c 42 i2c.start();
4180_1 1:be1498ba7fb4 43 i2c.stop();
4180_1 1:be1498ba7fb4 44 // Loop processing command strings from RealTerm
4180_1 0:0c54b73b002c 45 while (1) {
4180_1 1:be1498ba7fb4 46 current_char = pc.getc();
4180_1 1:be1498ba7fb4 47 // Is it a two character ASCII string data byte value
4180_1 2:fa8c916b42a9 48 if ((current_char <='F') && (current_char !='?')) {
4180_1 1:be1498ba7fb4 49 // convert to a binary byte
4180_1 1:be1498ba7fb4 50 if (current_char <='9') current_byte = current_char - '0';
4180_1 1:be1498ba7fb4 51 else current_byte =current_char +10 -'A';
4180_1 1:be1498ba7fb4 52 current_char = pc.getc();
4180_1 1:be1498ba7fb4 53 if (current_char >'F') pc.printf("error|\n\r");
4180_1 1:be1498ba7fb4 54 if (current_char <='9') current_byte = (current_byte <<4) | (current_char - '0');
4180_1 1:be1498ba7fb4 55 else current_byte = (current_byte <<4)|(current_char +10 -'A');
4180_1 1:be1498ba7fb4 56 // first byte after S command is the I2C address
4180_1 1:be1498ba7fb4 57 if (first_data_byte==1) {
4180_1 1:be1498ba7fb4 58 first_data_byte=0;
4180_1 1:be1498ba7fb4 59 address=current_byte;
4180_1 1:be1498ba7fb4 60 pc.printf(" -I2C address=%2.2X ", address);
4180_1 1:be1498ba7fb4 61 //Odd I2C address is a read and even is a write
4180_1 1:be1498ba7fb4 62 if ((address & 0x01) == 0) write=1;
4180_1 1:be1498ba7fb4 63 else read=1;
4180_1 1:be1498ba7fb4 64 } else
4180_1 1:be1498ba7fb4 65 // Read in cmd bytes for write
4180_1 1:be1498ba7fb4 66 if ((last_command == 'S')&&(read==0)) {
4180_1 1:be1498ba7fb4 67 cmd[cmd_count]=current_byte;
4180_1 1:be1498ba7fb4 68 cmd_count++;
4180_1 0:0c54b73b002c 69 }
4180_1 1:be1498ba7fb4 70 // number of bytes for a read
4180_1 1:be1498ba7fb4 71 if ((last_command =='R')||(read==1)) data_count=current_byte;
4180_1 1:be1498ba7fb4 72 } else {
4180_1 1:be1498ba7fb4 73 // Not a number - it is a command character
4180_1 1:be1498ba7fb4 74 last_command = current_char;
4180_1 1:be1498ba7fb4 75 switch (last_command) {
4180_1 1:be1498ba7fb4 76 // Start
4180_1 1:be1498ba7fb4 77 case 'S':
4180_1 2:fa8c916b42a9 78 if (previous_command == 'S') i2c.start();
4180_1 1:be1498ba7fb4 79 first_data_byte=1;
4180_1 1:be1498ba7fb4 80 break;
4180_1 1:be1498ba7fb4 81 // Stop
4180_1 1:be1498ba7fb4 82 case 'P':
4180_1 1:be1498ba7fb4 83 // Do the I2C write
4180_1 1:be1498ba7fb4 84 if (write==1) {
4180_1 1:be1498ba7fb4 85 pc.printf(" write ");
4180_1 1:be1498ba7fb4 86 if (i2c.write(address,cmd,cmd_count)!=0) pc.printf(" No Ack! ");
4180_1 1:be1498ba7fb4 87 for (i=0; i<cmd_count; i++)
4180_1 1:be1498ba7fb4 88 pc.printf(" cmd=%2.2X ", cmd[i]);
4180_1 0:0c54b73b002c 89 }
4180_1 1:be1498ba7fb4 90 // Do the I2C read
4180_1 1:be1498ba7fb4 91 if (read==1) {
4180_1 1:be1498ba7fb4 92 pc.printf(" read ");
4180_1 1:be1498ba7fb4 93 if (i2c.read(address, data, data_count) != 0) pc.printf(" No Ack! ");
4180_1 1:be1498ba7fb4 94 for (i=0; i<data_count; i++)
4180_1 1:be1498ba7fb4 95 pc.printf(" data=%2.2X ",data[i]);
4180_1 1:be1498ba7fb4 96 }
4180_1 1:be1498ba7fb4 97 // reset values for next I2C operation
4180_1 1:be1498ba7fb4 98 i2c.stop();
4180_1 1:be1498ba7fb4 99 pc.printf("\n\r");
4180_1 1:be1498ba7fb4 100 read=0;
4180_1 1:be1498ba7fb4 101 data_count=0;
4180_1 1:be1498ba7fb4 102 cmd_count=0;
4180_1 1:be1498ba7fb4 103 write=0;
4180_1 1:be1498ba7fb4 104 first_data_byte=0;
4180_1 1:be1498ba7fb4 105 break;
4180_1 1:be1498ba7fb4 106 // Read after write
4180_1 1:be1498ba7fb4 107 case 'R':
4180_1 1:be1498ba7fb4 108 read=1;
4180_1 1:be1498ba7fb4 109 break;
4180_1 1:be1498ba7fb4 110 // Status request
4180_1 1:be1498ba7fb4 111 case '?':
4180_1 1:be1498ba7fb4 112 pc.printf(" mbed ready \n\r");
4180_1 1:be1498ba7fb4 113 break;
4180_1 1:be1498ba7fb4 114 // Unknown or unimplemented command
4180_1 1:be1498ba7fb4 115 default:
4180_1 2:fa8c916b42a9 116 pc.printf(" unknown command \n\r");
4180_1 1:be1498ba7fb4 117 break;
4180_1 1:be1498ba7fb4 118 }
4180_1 2:fa8c916b42a9 119 previous_command = last_command;
4180_1 0:0c54b73b002c 120 }
4180_1 0:0c54b73b002c 121 }
4180_1 0:0c54b73b002c 122 }