I2C
Dependencies: mbed
Fork of I2C_Debug_for_RealTerm by
main.cpp
- Committer:
- 4180_1
- Date:
- 2011-03-14
- Revision:
- 2:fa8c916b42a9
- Parent:
- 1:be1498ba7fb4
File content as of revision 2:fa8c916b42a9:
#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 "No Ack!" when no I2C device responds to the address
//
// See Instructions at http://mbed.org/users/4180_1/notebook/i2c-debug-for-realterm/
//
DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);
I2C i2c(p9,p10);
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
pc.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') pc.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;
pc.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) {
pc.printf(" write ");
if (i2c.write(address,cmd,cmd_count)!=0) pc.printf(" No Ack! ");
for (i=0; i<cmd_count; i++)
pc.printf(" cmd=%2.2X ", cmd[i]);
}
// Do the I2C read
if (read==1) {
pc.printf(" read ");
if (i2c.read(address, data, data_count) != 0) pc.printf(" No Ack! ");
for (i=0; i<data_count; i++)
pc.printf(" data=%2.2X ",data[i]);
}
// reset values for next I2C operation
i2c.stop();
pc.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 '?':
pc.printf(" mbed ready \n\r");
break;
// Unknown or unimplemented command
default:
pc.printf(" unknown command \n\r");
break;
}
previous_command = last_command;
}
}
}
