UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip

Dependencies:   mbed

UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip

Features

up to 4x I2C master

  • for LPC824 implement, we can use up to 4 channels of I2C masters
    • 1x Fm+ and 3x Fm I2C channels
  • for LPC1768 implement, we can use up to 2 channels of I2C masters
    • 2x Fm I2C channels
  • for LPC11U35 implement, only one channel for I2C master, but program uses USB CDC class for UART communication (means no external USB-Serial converter chip)
    • 1x Fm+ I2C channels

1x SPI master

up to 2x 8bit GPIO

Tested Platforms

LPC824

LPC1768

LPC11U35

Quote:

LPC11U35 implement requires importing USBDevice library to use USBSerial class

visit https://github.com/K4zuki/tinyI2C for more information

main.cpp

Committer:
k4zuki
Date:
2014-10-17
Revision:
38:9d12c615c8ea
Child:
39:5817c3e6ce1e

File content as of revision 38:9d12c615c8ea:

/*
#include "mbed.h"
#include "USBSerial.h"
 
//Virtual serial port over USB
USBSerial serial;
 
int main(void) {
 
    while(1)
    {
        serial.printf("I am a virtual serial port!\r\n");
        wait(0.005);
    }
}
*/
///*
#include "mbed.h"
//#define isuse_USB_SERIAL

#ifdef isuse_USB_SERIAL
#include "USBSerial.h"
USBSerial pc;
#else 
Serial pc(USBTX,USBRX);
#endif
I2C dev1(p9,p10);
I2C dev2(p9,p10);
//I2C dev3(A5,A4);
//I2C dev4(A5,A4);
I2C* dev=&dev1;
BusOut bus(LED1,LED2,LED3,LED4);
//InterruptIn adint(D9);
//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
//S 0x53 I2C-bus START
//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
void adcomplete()
{
}

int main()
{
#ifndef isuse_USB_SERIAL
    pc.baud(115200);
#endif
//    adc.baud(38400);
    dev1.frequency(100000);//100k
//    adint.fall(&adcomplete);

    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',
    };
//    uint8_t registers[]={0x80,0x90,};

//    reg.start();
//    reg.write(0xD0);
//    reg.write(data);
//
//    reg.write(0xD0|0x01);
//    data=reg.read(ack);
//    reg.stop();
//"C0P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C1P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C2P"
//"S(0x80)(4)(0xDEADBEAF)P"
//"C3P"
//"S(0x80)(4)(0xDEADBEAF)P"

    int i=0;
    while(1) {
        while(true) {
            read=pc.getc();
            recieve[i]=read;
//            ser.printf("%02X,",read);
            i++;
            if(read == 'P') {
                plength=i;
//                ser.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,");
                            dev=&dev1;
                            break;
                        case I2C1adr:
                            bus=0x02;
//                            pc.printf("ch1 is selected,");
//                            pc.printf("ch1 is not implemented,");
                            channel='1';
                            dev=&dev2;
                            break;
                        case I2C2adr:
                            bus=0x04;
//                            pc.printf("ch2 is not implemented,");
                            channel='0';
                            //dev=&dev3;
                            break;
                        case I2C3adr:
                            bus=0x08;
//                            pc.printf("ch0 is not implemented,");
                            channel='0';
                            //dev=&dev4;
                            break;
                        default:
                            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);
                    dev->start();
                    dev->write(address);
                    if( (address&0x01)) {//read
//                        pc.printf("read from ch%c,",channel);
                        for(int j=0; j<length; j++) {
                            pc.putc(dev->read(0));
//                            send[j]=dev->read(0);
//                            pc.printf("%02X,",dev->read(0));
                        }
                        i+=(3);
                    } else {//write
//                        pc.printf("write to ch%c, ",channel);
                        for(int j=0; j<length; j++) {
//                            send[j]=recieve[4+j];
//                            pc.printf("%02X,",recieve[3+j]);
                            dev->write(recieve[3+j]);
                        }
                        i+=(3+length);
                    }
                    break;
                case 'P':
                    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;
            }
        }
//        pc.printf(send);
        i=0;

    }
}
//*/