only for LPC824 chip to match hardware I2C channels(2->4)

Dependencies:   mbed

main.cpp

Committer:
k4zuki
Date:
2014-10-29
Revision:
9:78c43e2448d6
Parent:
7:46655bc3288b
Child:
10:5406bc1bb50b

File content as of revision 9:78c43e2448d6:

#include "mbed.h"

Serial pc(USBTX,USBRX);
/*
    D5 = P0_28,
    D6 = P0_16, // LED_GREEN
    D7 = P0_17,
    D8 = P0_13,
    D9 = P0_27, // LED_BLUE
    D10 = P0_15,
    D11 = P0_26,
    D12 = P0_25,
    D13 = P0_24,
*/
I2C dev1(I2C_SDA,I2C_SCL);//11,10 hard coded
I2C dev2(A0,A1);//6,14
I2C dev3(A2,A3);//23,22
I2C dev4(A4,A5);//21,20
BusOut bus(LED1,LED2,LED3,LED4);
//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
//DigitalOut led3(LED3);
//DigitalOut led4(LED4);

//Table 3. ASCII commands supported by SC18IM700
//ASCII command Hex value Command function
//[X] S 0x53 I2C-bus START
//[X] P 0x50 I2C-bus STOP
//[_] R 0x52 read SC18IM700 internal register
//[_] W 0x57 write to SC18IM700 internal register
//[_] I 0x49 read GPIO port
//[_] O 0x4F write to GPIO port
//[_] Z 0x5A power down
//[X] C 0x43 change channel

int main()
{
    I2C* dev=&dev1;
    pc.baud(9600);
    dev1.frequency(100000);//100k
    dev2.frequency(100000);//100k
    dev3.frequency(100000);//100k
    dev4.frequency(100000);//100k

//    int data=0x50;
//    int ack=0;
    int plength=0;
    char recieve[256];
//    char send[256];
    char read=0;
    int address=0,length=0,channel=0;
    enum reg {
        I2C0adr='0',
        I2C1adr='1',
        I2C2adr='2',
        I2C3adr='3',
    };
//"C0P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C1P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C2P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C3P"
//"S(0x80)(4)(0xDEADBEAF)P"
//dev1.start();
//dev1.write(address);
//dev1.stop();

    int i=0;
    while(1) {
        while(true) {
////            led1=0;
            read=pc.getc();
            recieve[i]=read;
//pc.printf("%02X,",read); //debug
            i++;
            if(read == 'P') {
                plength=i;
////                led1=1;
//pc.printf("P\n\r");
                break;
            }
        }
        i=0;
        while(i<plength) {
            switch(recieve[i]) {
                case 'C':
                    channel=recieve[i+1];
                    switch(channel) {
                        case I2C0adr:
                            bus=~0x01;
//pc.printf("ch0 is selected,");
                            channel='0';
                            dev=&dev1;
                            break;
                        case I2C1adr:
                            bus=~0x02;
//pc.printf("ch1 is selected,");
                            channel='1';
                            dev=&dev2;
                            break;
                        case I2C2adr:
                            bus=~0x04;
//pc.printf("ch2 is selected,");
                            channel='2';
                            dev=&dev3;
                            break;
                        case I2C3adr:
                            bus=~0x08;
//pc.printf("ch3 is selected,");
                            channel='3';
                            dev=&dev4;
                            break;
                        default:
//pc.printf("ch? is not implemented,");
                            channel='0';
                            dev=&dev1;
                            break;
                    }
                    i+=(2);
                    break;
                case 'S':
                    address=recieve[i+1];
                    length=recieve[i+2];
//pc.printf("addr=%02X, length=%d,",address,length);
//dev1.start();
//dev1.write(address);
                    dev->start();
                    dev->write(address);
                    if( (address&0x01)) {//read
//pc.printf("read from ch%c,",channel);
                        for(int j=0; j<length; j++) {
                            pc.printf("%02X,",dev->read(1));
//pc.printf("%02X,",dev1.read(0));
                        }
                        i+=(3);
                    } else {//write
//pc.printf("write to ch%c, ",channel);
                        for(int j=0; j<length; j++) {
//pc.printf("%02X,",recieve[3+j]);
//dev1.write(recieve[3+j]);
                            dev->write(recieve[3+j]);
                        }
                        i+=(3+length);
                    }
                    break;
                case 'P':
//dev1.stop();
                    dev->stop();
                    i=plength;
                    pc.printf("ok\n\r");
                    break;
                case 'R':
                    pc.printf("command R is not implemented\n\r");
                    i=plength;
                    break;
                case 'W':
                    pc.printf("command W is not implemented\n\r");
                    i=plength;
                    break;
                case 'I':
                    pc.printf("command I is not implemented\n\r");
                    i=plength;
                    break;
                case 'O':
                    pc.printf("command O is not implemented\n\r");
                    i=plength;
                    break;
                case 'Z':
                    pc.printf("command Z is not implemented\n\r");
                    i=plength;
                    break;
                default:
                    pc.printf("command ? is not implemented\n\r");
                    i=plength;
                    break;
            }
        }
        i=0;

    }
}