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

Committer:
k4zuki
Date:
Fri Oct 17 20:25:23 2014 +0000
Revision:
38:9d12c615c8ea
Child:
39:5817c3e6ce1e
first version to publish; "tested" python code to use this program attached;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 38:9d12c615c8ea 1 /*
k4zuki 38:9d12c615c8ea 2 #include "mbed.h"
k4zuki 38:9d12c615c8ea 3 #include "USBSerial.h"
k4zuki 38:9d12c615c8ea 4
k4zuki 38:9d12c615c8ea 5 //Virtual serial port over USB
k4zuki 38:9d12c615c8ea 6 USBSerial serial;
k4zuki 38:9d12c615c8ea 7
k4zuki 38:9d12c615c8ea 8 int main(void) {
k4zuki 38:9d12c615c8ea 9
k4zuki 38:9d12c615c8ea 10 while(1)
k4zuki 38:9d12c615c8ea 11 {
k4zuki 38:9d12c615c8ea 12 serial.printf("I am a virtual serial port!\r\n");
k4zuki 38:9d12c615c8ea 13 wait(0.005);
k4zuki 38:9d12c615c8ea 14 }
k4zuki 38:9d12c615c8ea 15 }
k4zuki 38:9d12c615c8ea 16 */
k4zuki 38:9d12c615c8ea 17 ///*
k4zuki 38:9d12c615c8ea 18 #include "mbed.h"
k4zuki 38:9d12c615c8ea 19 //#define isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 20
k4zuki 38:9d12c615c8ea 21 #ifdef isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 22 #include "USBSerial.h"
k4zuki 38:9d12c615c8ea 23 USBSerial pc;
k4zuki 38:9d12c615c8ea 24 #else
k4zuki 38:9d12c615c8ea 25 Serial pc(USBTX,USBRX);
k4zuki 38:9d12c615c8ea 26 #endif
k4zuki 38:9d12c615c8ea 27 I2C dev1(p9,p10);
k4zuki 38:9d12c615c8ea 28 I2C dev2(p9,p10);
k4zuki 38:9d12c615c8ea 29 //I2C dev3(A5,A4);
k4zuki 38:9d12c615c8ea 30 //I2C dev4(A5,A4);
k4zuki 38:9d12c615c8ea 31 I2C* dev=&dev1;
k4zuki 38:9d12c615c8ea 32 BusOut bus(LED1,LED2,LED3,LED4);
k4zuki 38:9d12c615c8ea 33 //InterruptIn adint(D9);
k4zuki 38:9d12c615c8ea 34 //DigitalOut led1(LED1);
k4zuki 38:9d12c615c8ea 35 //DigitalOut led2(LED2);
k4zuki 38:9d12c615c8ea 36 //DigitalOut led3(LED3);
k4zuki 38:9d12c615c8ea 37 //DigitalOut led4(LED4);
k4zuki 38:9d12c615c8ea 38
k4zuki 38:9d12c615c8ea 39 //Table 3. ASCII commands supported by SC18IM700
k4zuki 38:9d12c615c8ea 40 //ASCII command Hex value Command function
k4zuki 38:9d12c615c8ea 41 //S 0x53 I2C-bus START
k4zuki 38:9d12c615c8ea 42 //P 0x50 I2C-bus STOP
k4zuki 38:9d12c615c8ea 43 //R 0x52 read SC18IM700 internal register
k4zuki 38:9d12c615c8ea 44 //W 0x57 write to SC18IM700 internal register
k4zuki 38:9d12c615c8ea 45 //I 0x49 read GPIO port
k4zuki 38:9d12c615c8ea 46 //O 0x4F write to GPIO port
k4zuki 38:9d12c615c8ea 47 //Z 0x5A power down
k4zuki 38:9d12c615c8ea 48 void adcomplete()
k4zuki 38:9d12c615c8ea 49 {
k4zuki 38:9d12c615c8ea 50 }
k4zuki 38:9d12c615c8ea 51
k4zuki 38:9d12c615c8ea 52 int main()
k4zuki 38:9d12c615c8ea 53 {
k4zuki 38:9d12c615c8ea 54 #ifndef isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 55 pc.baud(115200);
k4zuki 38:9d12c615c8ea 56 #endif
k4zuki 38:9d12c615c8ea 57 // adc.baud(38400);
k4zuki 38:9d12c615c8ea 58 dev1.frequency(100000);//100k
k4zuki 38:9d12c615c8ea 59 // adint.fall(&adcomplete);
k4zuki 38:9d12c615c8ea 60
k4zuki 38:9d12c615c8ea 61 int data=0x50;
k4zuki 38:9d12c615c8ea 62 int ack=0;
k4zuki 38:9d12c615c8ea 63 int plength=0;
k4zuki 38:9d12c615c8ea 64 char recieve[256];
k4zuki 38:9d12c615c8ea 65 char send[256];
k4zuki 38:9d12c615c8ea 66 char read=0;
k4zuki 38:9d12c615c8ea 67 int address=0,length=0,channel=0;
k4zuki 38:9d12c615c8ea 68 enum reg {
k4zuki 38:9d12c615c8ea 69 I2C0adr='0',
k4zuki 38:9d12c615c8ea 70 I2C1adr='1',
k4zuki 38:9d12c615c8ea 71 I2C2adr='2',
k4zuki 38:9d12c615c8ea 72 I2C3adr='3',
k4zuki 38:9d12c615c8ea 73 };
k4zuki 38:9d12c615c8ea 74 // uint8_t registers[]={0x80,0x90,};
k4zuki 38:9d12c615c8ea 75
k4zuki 38:9d12c615c8ea 76 // reg.start();
k4zuki 38:9d12c615c8ea 77 // reg.write(0xD0);
k4zuki 38:9d12c615c8ea 78 // reg.write(data);
k4zuki 38:9d12c615c8ea 79 //
k4zuki 38:9d12c615c8ea 80 // reg.write(0xD0|0x01);
k4zuki 38:9d12c615c8ea 81 // data=reg.read(ack);
k4zuki 38:9d12c615c8ea 82 // reg.stop();
k4zuki 38:9d12c615c8ea 83 //"C0P"
k4zuki 38:9d12c615c8ea 84 //"S(0x80)(4)(0xDEADBEAF)P"
k4zuki 38:9d12c615c8ea 85 //"C1P"
k4zuki 38:9d12c615c8ea 86 //"S(0x80)(4)(0xDEADBEAF)P"
k4zuki 38:9d12c615c8ea 87 //"C2P"
k4zuki 38:9d12c615c8ea 88 //"S(0x80)(4)(0xDEADBEAF)P"
k4zuki 38:9d12c615c8ea 89 //"C3P"
k4zuki 38:9d12c615c8ea 90 //"S(0x80)(4)(0xDEADBEAF)P"
k4zuki 38:9d12c615c8ea 91
k4zuki 38:9d12c615c8ea 92 int i=0;
k4zuki 38:9d12c615c8ea 93 while(1) {
k4zuki 38:9d12c615c8ea 94 while(true) {
k4zuki 38:9d12c615c8ea 95 read=pc.getc();
k4zuki 38:9d12c615c8ea 96 recieve[i]=read;
k4zuki 38:9d12c615c8ea 97 // ser.printf("%02X,",read);
k4zuki 38:9d12c615c8ea 98 i++;
k4zuki 38:9d12c615c8ea 99 if(read == 'P') {
k4zuki 38:9d12c615c8ea 100 plength=i;
k4zuki 38:9d12c615c8ea 101 // ser.printf("P\n\r");
k4zuki 38:9d12c615c8ea 102 break;
k4zuki 38:9d12c615c8ea 103 }
k4zuki 38:9d12c615c8ea 104 }
k4zuki 38:9d12c615c8ea 105 i=0;
k4zuki 38:9d12c615c8ea 106 while(i<plength) {
k4zuki 38:9d12c615c8ea 107 switch(recieve[i]) {
k4zuki 38:9d12c615c8ea 108 case 'C':
k4zuki 38:9d12c615c8ea 109 channel=recieve[i+1];
k4zuki 38:9d12c615c8ea 110 switch(channel) {
k4zuki 38:9d12c615c8ea 111 case I2C0adr:
k4zuki 38:9d12c615c8ea 112 bus=0x01;
k4zuki 38:9d12c615c8ea 113 // pc.printf("ch0 is selected,");
k4zuki 38:9d12c615c8ea 114 dev=&dev1;
k4zuki 38:9d12c615c8ea 115 break;
k4zuki 38:9d12c615c8ea 116 case I2C1adr:
k4zuki 38:9d12c615c8ea 117 bus=0x02;
k4zuki 38:9d12c615c8ea 118 // pc.printf("ch1 is selected,");
k4zuki 38:9d12c615c8ea 119 // pc.printf("ch1 is not implemented,");
k4zuki 38:9d12c615c8ea 120 channel='1';
k4zuki 38:9d12c615c8ea 121 dev=&dev2;
k4zuki 38:9d12c615c8ea 122 break;
k4zuki 38:9d12c615c8ea 123 case I2C2adr:
k4zuki 38:9d12c615c8ea 124 bus=0x04;
k4zuki 38:9d12c615c8ea 125 // pc.printf("ch2 is not implemented,");
k4zuki 38:9d12c615c8ea 126 channel='0';
k4zuki 38:9d12c615c8ea 127 //dev=&dev3;
k4zuki 38:9d12c615c8ea 128 break;
k4zuki 38:9d12c615c8ea 129 case I2C3adr:
k4zuki 38:9d12c615c8ea 130 bus=0x08;
k4zuki 38:9d12c615c8ea 131 // pc.printf("ch0 is not implemented,");
k4zuki 38:9d12c615c8ea 132 channel='0';
k4zuki 38:9d12c615c8ea 133 //dev=&dev4;
k4zuki 38:9d12c615c8ea 134 break;
k4zuki 38:9d12c615c8ea 135 default:
k4zuki 38:9d12c615c8ea 136 channel='0';
k4zuki 38:9d12c615c8ea 137 dev=&dev1;
k4zuki 38:9d12c615c8ea 138 break;
k4zuki 38:9d12c615c8ea 139 }
k4zuki 38:9d12c615c8ea 140 i+=(2);
k4zuki 38:9d12c615c8ea 141 break;
k4zuki 38:9d12c615c8ea 142 case 'S':
k4zuki 38:9d12c615c8ea 143 address=recieve[i+1];
k4zuki 38:9d12c615c8ea 144 length=recieve[i+2];
k4zuki 38:9d12c615c8ea 145 // pc.printf("addr=%02X, length=%d,",address,length);
k4zuki 38:9d12c615c8ea 146 dev->start();
k4zuki 38:9d12c615c8ea 147 dev->write(address);
k4zuki 38:9d12c615c8ea 148 if( (address&0x01)) {//read
k4zuki 38:9d12c615c8ea 149 // pc.printf("read from ch%c,",channel);
k4zuki 38:9d12c615c8ea 150 for(int j=0; j<length; j++) {
k4zuki 38:9d12c615c8ea 151 pc.putc(dev->read(0));
k4zuki 38:9d12c615c8ea 152 // send[j]=dev->read(0);
k4zuki 38:9d12c615c8ea 153 // pc.printf("%02X,",dev->read(0));
k4zuki 38:9d12c615c8ea 154 }
k4zuki 38:9d12c615c8ea 155 i+=(3);
k4zuki 38:9d12c615c8ea 156 } else {//write
k4zuki 38:9d12c615c8ea 157 // pc.printf("write to ch%c, ",channel);
k4zuki 38:9d12c615c8ea 158 for(int j=0; j<length; j++) {
k4zuki 38:9d12c615c8ea 159 // send[j]=recieve[4+j];
k4zuki 38:9d12c615c8ea 160 // pc.printf("%02X,",recieve[3+j]);
k4zuki 38:9d12c615c8ea 161 dev->write(recieve[3+j]);
k4zuki 38:9d12c615c8ea 162 }
k4zuki 38:9d12c615c8ea 163 i+=(3+length);
k4zuki 38:9d12c615c8ea 164 }
k4zuki 38:9d12c615c8ea 165 break;
k4zuki 38:9d12c615c8ea 166 case 'P':
k4zuki 38:9d12c615c8ea 167 dev->stop();
k4zuki 38:9d12c615c8ea 168 i=plength;
k4zuki 38:9d12c615c8ea 169 pc.printf("ok\n\r");
k4zuki 38:9d12c615c8ea 170 break;
k4zuki 38:9d12c615c8ea 171 case 'R':
k4zuki 38:9d12c615c8ea 172 pc.printf("command R is not implemented\n\r");
k4zuki 38:9d12c615c8ea 173 i=plength;
k4zuki 38:9d12c615c8ea 174 break;
k4zuki 38:9d12c615c8ea 175 case 'W':
k4zuki 38:9d12c615c8ea 176 pc.printf("command W is not implemented\n\r");
k4zuki 38:9d12c615c8ea 177 i=plength;
k4zuki 38:9d12c615c8ea 178 break;
k4zuki 38:9d12c615c8ea 179 case 'I':
k4zuki 38:9d12c615c8ea 180 pc.printf("command I is not implemented\n\r");
k4zuki 38:9d12c615c8ea 181 i=plength;
k4zuki 38:9d12c615c8ea 182 break;
k4zuki 38:9d12c615c8ea 183 case 'O':
k4zuki 38:9d12c615c8ea 184 pc.printf("command O is not implemented\n\r");
k4zuki 38:9d12c615c8ea 185 i=plength;
k4zuki 38:9d12c615c8ea 186 break;
k4zuki 38:9d12c615c8ea 187 case 'Z':
k4zuki 38:9d12c615c8ea 188 pc.printf("command Z is not implemented\n\r");
k4zuki 38:9d12c615c8ea 189 i=plength;
k4zuki 38:9d12c615c8ea 190 break;
k4zuki 38:9d12c615c8ea 191 default:
k4zuki 38:9d12c615c8ea 192 pc.printf("command ? is not implemented\n\r");
k4zuki 38:9d12c615c8ea 193 i=plength;
k4zuki 38:9d12c615c8ea 194 break;
k4zuki 38:9d12c615c8ea 195 }
k4zuki 38:9d12c615c8ea 196 }
k4zuki 38:9d12c615c8ea 197 // pc.printf(send);
k4zuki 38:9d12c615c8ea 198 i=0;
k4zuki 38:9d12c615c8ea 199
k4zuki 38:9d12c615c8ea 200 }
k4zuki 38:9d12c615c8ea 201 }
k4zuki 38:9d12c615c8ea 202 //*/