I2C

Dependencies:   TextLCD mbed

Fork of I2C_Debug_for_RealTerm by jim hamblen

Committer:
4180_1
Date:
Mon Mar 14 00:50:34 2011 +0000
Revision:
2:fa8c916b42a9
Parent:
1:be1498ba7fb4
Child:
3:8e2db72d0d7d
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 }