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:
Tue Oct 21 03:55:34 2014 +0000
Revision:
41:b7c84115a2dd
Parent:
40:78e0ee75a604
Child:
42:da85c17ea495
removed unused variables; fixed coding format; commented out unused code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 38:9d12c615c8ea 1 #include "mbed.h"
k4zuki 38:9d12c615c8ea 2 //#define isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 3
k4zuki 38:9d12c615c8ea 4 #ifdef isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 5 #include "USBSerial.h"
k4zuki 38:9d12c615c8ea 6 USBSerial pc;
k4zuki 39:5817c3e6ce1e 7 #else
k4zuki 38:9d12c615c8ea 8 Serial pc(USBTX,USBRX);
k4zuki 38:9d12c615c8ea 9 #endif
k4zuki 38:9d12c615c8ea 10 I2C dev1(p9,p10);
k4zuki 39:5817c3e6ce1e 11 I2C dev2(p28,p27);
k4zuki 38:9d12c615c8ea 12 I2C* dev=&dev1;
k4zuki 40:78e0ee75a604 13 BusOut bus(LED1,LED2);
k4zuki 38:9d12c615c8ea 14
k4zuki 38:9d12c615c8ea 15 //Table 3. ASCII commands supported by SC18IM700
k4zuki 38:9d12c615c8ea 16 //ASCII command Hex value Command function
k4zuki 39:5817c3e6ce1e 17 //[X] S 0x53 I2C-bus START
k4zuki 39:5817c3e6ce1e 18 //[X] P 0x50 I2C-bus STOP
k4zuki 39:5817c3e6ce1e 19 //[_] R 0x52 read SC18IM700 internal register
k4zuki 39:5817c3e6ce1e 20 //[_] W 0x57 write to SC18IM700 internal register
k4zuki 39:5817c3e6ce1e 21 //[_] I 0x49 read GPIO port
k4zuki 39:5817c3e6ce1e 22 //[_] O 0x4F write to GPIO port
k4zuki 39:5817c3e6ce1e 23 //[_] Z 0x5A power down
k4zuki 38:9d12c615c8ea 24
k4zuki 38:9d12c615c8ea 25 int main()
k4zuki 38:9d12c615c8ea 26 {
k4zuki 38:9d12c615c8ea 27 #ifndef isuse_USB_SERIAL
k4zuki 38:9d12c615c8ea 28 pc.baud(115200);
k4zuki 38:9d12c615c8ea 29 #endif
k4zuki 38:9d12c615c8ea 30 dev1.frequency(100000);//100k
k4zuki 39:5817c3e6ce1e 31 dev2.frequency(100000);//100k
k4zuki 38:9d12c615c8ea 32
k4zuki 38:9d12c615c8ea 33 int plength=0;
k4zuki 38:9d12c615c8ea 34 char recieve[256];
k4zuki 38:9d12c615c8ea 35 char read=0;
k4zuki 38:9d12c615c8ea 36 int address=0,length=0,channel=0;
k4zuki 38:9d12c615c8ea 37 enum reg {
k4zuki 38:9d12c615c8ea 38 I2C0adr='0',
k4zuki 38:9d12c615c8ea 39 I2C1adr='1',
k4zuki 38:9d12c615c8ea 40 I2C2adr='2',
k4zuki 38:9d12c615c8ea 41 I2C3adr='3',
k4zuki 38:9d12c615c8ea 42 };
k4zuki 38:9d12c615c8ea 43 int i=0;
k4zuki 38:9d12c615c8ea 44 while(1) {
k4zuki 38:9d12c615c8ea 45 while(true) {
k4zuki 38:9d12c615c8ea 46 read=pc.getc();
k4zuki 38:9d12c615c8ea 47 recieve[i]=read;
k4zuki 40:78e0ee75a604 48 //pc.printf("%02X,",read);
k4zuki 38:9d12c615c8ea 49 i++;
k4zuki 38:9d12c615c8ea 50 if(read == 'P') {
k4zuki 38:9d12c615c8ea 51 plength=i;
k4zuki 40:78e0ee75a604 52 //pc.printf("P\n\r");
k4zuki 38:9d12c615c8ea 53 break;
k4zuki 38:9d12c615c8ea 54 }
k4zuki 38:9d12c615c8ea 55 }
k4zuki 38:9d12c615c8ea 56 i=0;
k4zuki 38:9d12c615c8ea 57 while(i<plength) {
k4zuki 38:9d12c615c8ea 58 switch(recieve[i]) {
k4zuki 38:9d12c615c8ea 59 case 'C':
k4zuki 38:9d12c615c8ea 60 channel=recieve[i+1];
k4zuki 38:9d12c615c8ea 61 switch(channel) {
k4zuki 38:9d12c615c8ea 62 case I2C0adr:
k4zuki 38:9d12c615c8ea 63 bus=0x01;
k4zuki 40:78e0ee75a604 64 //pc.printf("ch0 is selected,");
k4zuki 39:5817c3e6ce1e 65 channel='0';
k4zuki 38:9d12c615c8ea 66 dev=&dev1;
k4zuki 38:9d12c615c8ea 67 break;
k4zuki 38:9d12c615c8ea 68 case I2C1adr:
k4zuki 38:9d12c615c8ea 69 bus=0x02;
k4zuki 40:78e0ee75a604 70 //pc.printf("ch1 is selected,");
k4zuki 38:9d12c615c8ea 71 channel='1';
k4zuki 38:9d12c615c8ea 72 dev=&dev2;
k4zuki 38:9d12c615c8ea 73 break;
k4zuki 40:78e0ee75a604 74 /** LPC1768 has only two I2C channels
k4zuki 38:9d12c615c8ea 75 case I2C2adr:
k4zuki 38:9d12c615c8ea 76 bus=0x04;
k4zuki 40:78e0ee75a604 77 //pc.printf("ch2 is not implemented,");
k4zuki 38:9d12c615c8ea 78 channel='0';
k4zuki 38:9d12c615c8ea 79 //dev=&dev3;
k4zuki 38:9d12c615c8ea 80 break;
k4zuki 38:9d12c615c8ea 81 case I2C3adr:
k4zuki 38:9d12c615c8ea 82 bus=0x08;
k4zuki 41:b7c84115a2dd 83 //pc.printf("ch3 is not implemented,");
k4zuki 38:9d12c615c8ea 84 channel='0';
k4zuki 38:9d12c615c8ea 85 //dev=&dev4;
k4zuki 38:9d12c615c8ea 86 break;
k4zuki 40:78e0ee75a604 87 */
k4zuki 38:9d12c615c8ea 88 default:
k4zuki 38:9d12c615c8ea 89 channel='0';
k4zuki 38:9d12c615c8ea 90 dev=&dev1;
k4zuki 38:9d12c615c8ea 91 break;
k4zuki 38:9d12c615c8ea 92 }
k4zuki 38:9d12c615c8ea 93 i+=(2);
k4zuki 38:9d12c615c8ea 94 break;
k4zuki 38:9d12c615c8ea 95 case 'S':
k4zuki 38:9d12c615c8ea 96 address=recieve[i+1];
k4zuki 38:9d12c615c8ea 97 length=recieve[i+2];
k4zuki 40:78e0ee75a604 98 //pc.printf("addr=%02X, length=%d,",address,length);
k4zuki 38:9d12c615c8ea 99 dev->start();
k4zuki 38:9d12c615c8ea 100 dev->write(address);
k4zuki 38:9d12c615c8ea 101 if( (address&0x01)) {//read
k4zuki 40:78e0ee75a604 102 //pc.printf("read from ch%c,",channel);
k4zuki 38:9d12c615c8ea 103 for(int j=0; j<length; j++) {
k4zuki 38:9d12c615c8ea 104 pc.putc(dev->read(0));
k4zuki 40:78e0ee75a604 105 //pc.printf("%02X,",dev->read(0));
k4zuki 38:9d12c615c8ea 106 }
k4zuki 38:9d12c615c8ea 107 i+=(3);
k4zuki 38:9d12c615c8ea 108 } else {//write
k4zuki 40:78e0ee75a604 109 //pc.printf("write to ch%c, ",channel);
k4zuki 38:9d12c615c8ea 110 for(int j=0; j<length; j++) {
k4zuki 40:78e0ee75a604 111 //pc.printf("%02X,",recieve[3+j]);
k4zuki 38:9d12c615c8ea 112 dev->write(recieve[3+j]);
k4zuki 38:9d12c615c8ea 113 }
k4zuki 38:9d12c615c8ea 114 i+=(3+length);
k4zuki 38:9d12c615c8ea 115 }
k4zuki 38:9d12c615c8ea 116 break;
k4zuki 38:9d12c615c8ea 117 case 'P':
k4zuki 38:9d12c615c8ea 118 dev->stop();
k4zuki 38:9d12c615c8ea 119 i=plength;
k4zuki 38:9d12c615c8ea 120 pc.printf("ok\n\r");
k4zuki 38:9d12c615c8ea 121 break;
k4zuki 38:9d12c615c8ea 122 case 'R':
k4zuki 38:9d12c615c8ea 123 pc.printf("command R is not implemented\n\r");
k4zuki 38:9d12c615c8ea 124 i=plength;
k4zuki 38:9d12c615c8ea 125 break;
k4zuki 38:9d12c615c8ea 126 case 'W':
k4zuki 38:9d12c615c8ea 127 pc.printf("command W is not implemented\n\r");
k4zuki 38:9d12c615c8ea 128 i=plength;
k4zuki 38:9d12c615c8ea 129 break;
k4zuki 38:9d12c615c8ea 130 case 'I':
k4zuki 38:9d12c615c8ea 131 pc.printf("command I is not implemented\n\r");
k4zuki 38:9d12c615c8ea 132 i=plength;
k4zuki 38:9d12c615c8ea 133 break;
k4zuki 38:9d12c615c8ea 134 case 'O':
k4zuki 38:9d12c615c8ea 135 pc.printf("command O is not implemented\n\r");
k4zuki 38:9d12c615c8ea 136 i=plength;
k4zuki 38:9d12c615c8ea 137 break;
k4zuki 38:9d12c615c8ea 138 case 'Z':
k4zuki 38:9d12c615c8ea 139 pc.printf("command Z is not implemented\n\r");
k4zuki 38:9d12c615c8ea 140 i=plength;
k4zuki 38:9d12c615c8ea 141 break;
k4zuki 38:9d12c615c8ea 142 default:
k4zuki 38:9d12c615c8ea 143 pc.printf("command ? is not implemented\n\r");
k4zuki 38:9d12c615c8ea 144 i=plength;
k4zuki 38:9d12c615c8ea 145 break;
k4zuki 38:9d12c615c8ea 146 }
k4zuki 38:9d12c615c8ea 147 }
k4zuki 38:9d12c615c8ea 148 i=0;
k4zuki 38:9d12c615c8ea 149
k4zuki 38:9d12c615c8ea 150 }
k4zuki 38:9d12c615c8ea 151 }