I2C

Dependencies:   TextLCD mbed

Fork of I2C_Debug_for_RealTerm by jim hamblen

Committer:
4180_1
Date:
Fri Mar 11 03:25:42 2011 +0000
Revision:
1:be1498ba7fb4
Parent:
0:0c54b73b002c
Child:
2:fa8c916b42a9
ver 2

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 1:be1498ba7fb4 18 char current_char=0;
4180_1 1:be1498ba7fb4 19 char address=0;
4180_1 1:be1498ba7fb4 20 char data [255];
4180_1 1:be1498ba7fb4 21 char current_byte=0;
4180_1 0:0c54b73b002c 22 char cmd[255];
4180_1 0:0c54b73b002c 23 int cmd_count=0;
4180_1 1:be1498ba7fb4 24 int data_count=0;
4180_1 1:be1498ba7fb4 25 int read=0;
4180_1 1:be1498ba7fb4 26 int write=0;
4180_1 1:be1498ba7fb4 27 int first_data_byte=0;
4180_1 0:0c54b73b002c 28 int i=0;
4180_1 1:be1498ba7fb4 29
4180_1 0:0c54b73b002c 30 myled=1;
4180_1 0:0c54b73b002c 31 i2c.frequency(75000);
4180_1 0:0c54b73b002c 32 i2c.start();
4180_1 1:be1498ba7fb4 33 i2c.stop();
4180_1 0:0c54b73b002c 34 i2c.start();
4180_1 1:be1498ba7fb4 35 i2c.stop();
4180_1 1:be1498ba7fb4 36 // Send a start message to RealTerm
4180_1 1:be1498ba7fb4 37 pc.printf("\fmbed I2C debug tool ready\n\r");
4180_1 1:be1498ba7fb4 38 // Loop processing command strings from RealTerm
4180_1 0:0c54b73b002c 39 while (1) {
4180_1 1:be1498ba7fb4 40 current_char = pc.getc();
4180_1 1:be1498ba7fb4 41 // Is it a two character ASCII string data byte value
4180_1 1:be1498ba7fb4 42 if (current_char <='F') {
4180_1 1:be1498ba7fb4 43 // convert to a binary byte
4180_1 1:be1498ba7fb4 44 if (current_char <='9') current_byte = current_char - '0';
4180_1 1:be1498ba7fb4 45 else current_byte =current_char +10 -'A';
4180_1 1:be1498ba7fb4 46 current_char = pc.getc();
4180_1 1:be1498ba7fb4 47 if (current_char >'F') pc.printf("error|\n\r");
4180_1 1:be1498ba7fb4 48 if (current_char <='9') current_byte = (current_byte <<4) | (current_char - '0');
4180_1 1:be1498ba7fb4 49 else current_byte = (current_byte <<4)|(current_char +10 -'A');
4180_1 1:be1498ba7fb4 50 // first byte after S command is the I2C address
4180_1 1:be1498ba7fb4 51 if (first_data_byte==1) {
4180_1 1:be1498ba7fb4 52 first_data_byte=0;
4180_1 1:be1498ba7fb4 53 address=current_byte;
4180_1 1:be1498ba7fb4 54 pc.printf(" -I2C address=%2.2X ", address);
4180_1 1:be1498ba7fb4 55 //Odd I2C address is a read and even is a write
4180_1 1:be1498ba7fb4 56 if ((address & 0x01) == 0) write=1;
4180_1 1:be1498ba7fb4 57 else read=1;
4180_1 1:be1498ba7fb4 58 } else
4180_1 1:be1498ba7fb4 59 // Read in cmd bytes for write
4180_1 1:be1498ba7fb4 60 if ((last_command == 'S')&&(read==0)) {
4180_1 1:be1498ba7fb4 61 cmd[cmd_count]=current_byte;
4180_1 1:be1498ba7fb4 62 cmd_count++;
4180_1 0:0c54b73b002c 63 }
4180_1 1:be1498ba7fb4 64 // number of bytes for a read
4180_1 1:be1498ba7fb4 65 if ((last_command =='R')||(read==1)) data_count=current_byte;
4180_1 1:be1498ba7fb4 66 } else {
4180_1 1:be1498ba7fb4 67 // Not a number - it is a command character
4180_1 1:be1498ba7fb4 68 last_command = current_char;
4180_1 1:be1498ba7fb4 69 switch (last_command) {
4180_1 1:be1498ba7fb4 70 // Start
4180_1 1:be1498ba7fb4 71 case 'S':
4180_1 1:be1498ba7fb4 72 first_data_byte=1;
4180_1 1:be1498ba7fb4 73 break;
4180_1 1:be1498ba7fb4 74 // Stop
4180_1 1:be1498ba7fb4 75 case 'P':
4180_1 1:be1498ba7fb4 76 // Do the I2C write
4180_1 1:be1498ba7fb4 77 if (write==1) {
4180_1 1:be1498ba7fb4 78 pc.printf(" write ");
4180_1 1:be1498ba7fb4 79 if (i2c.write(address,cmd,cmd_count)!=0) pc.printf(" No Ack! ");
4180_1 1:be1498ba7fb4 80 for (i=0; i<cmd_count; i++)
4180_1 1:be1498ba7fb4 81 pc.printf(" cmd=%2.2X ", cmd[i]);
4180_1 0:0c54b73b002c 82 }
4180_1 1:be1498ba7fb4 83 // Do the I2C read
4180_1 1:be1498ba7fb4 84 if (read==1) {
4180_1 1:be1498ba7fb4 85 pc.printf(" read ");
4180_1 1:be1498ba7fb4 86 if (i2c.read(address, data, data_count) != 0) pc.printf(" No Ack! ");
4180_1 1:be1498ba7fb4 87 for (i=0; i<data_count; i++)
4180_1 1:be1498ba7fb4 88 pc.printf(" data=%2.2X ",data[i]);
4180_1 1:be1498ba7fb4 89 }
4180_1 1:be1498ba7fb4 90 // reset values for next I2C operation
4180_1 1:be1498ba7fb4 91 i2c.stop();
4180_1 1:be1498ba7fb4 92 pc.printf("\n\r");
4180_1 1:be1498ba7fb4 93 read=0;
4180_1 1:be1498ba7fb4 94 data_count=0;
4180_1 1:be1498ba7fb4 95 cmd_count=0;
4180_1 1:be1498ba7fb4 96 write=0;
4180_1 1:be1498ba7fb4 97 first_data_byte=0;
4180_1 1:be1498ba7fb4 98 break;
4180_1 1:be1498ba7fb4 99 // Read after write
4180_1 1:be1498ba7fb4 100 case 'R':
4180_1 1:be1498ba7fb4 101 read=1;
4180_1 1:be1498ba7fb4 102 break;
4180_1 1:be1498ba7fb4 103 // Status request
4180_1 1:be1498ba7fb4 104 case '?':
4180_1 1:be1498ba7fb4 105 pc.printf(" mbed ready \n\r");
4180_1 1:be1498ba7fb4 106 break;
4180_1 1:be1498ba7fb4 107 // Unknown or unimplemented command
4180_1 1:be1498ba7fb4 108 default:
4180_1 1:be1498ba7fb4 109 pc.printf("unknown command");
4180_1 1:be1498ba7fb4 110 break;
4180_1 1:be1498ba7fb4 111 }
4180_1 0:0c54b73b002c 112 }
4180_1 0:0c54b73b002c 113 }
4180_1 0:0c54b73b002c 114 }