
I2C
Dependencies: mbed
Fork of I2C_Debug_for_RealTerm by
Revision 0:0c54b73b002c, committed 2011-03-08
- Comitter:
- 4180_1
- Date:
- Tue Mar 08 03:16:34 2011 +0000
- Child:
- 1:be1498ba7fb4
- Commit message:
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Mar 08 03:16:34 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912