UART to I2C master(s) converter, targetting to emulate SC18IM700(NXP) chip
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
- https://developer.mbed.org/platforms/Switch-Science-mbed-LPC824/
- https://developer.mbed.org/platforms/LPCXpresso824-MAX/
LPC1768
LPC11U35
Quote:
LPC11U35 implement requires importing USBDevice library to use USBSerial class
visit https://github.com/K4zuki/tinyI2C for more information
main.cpp@39:5817c3e6ce1e, 2014-10-17 (annotated)
- Committer:
- k4zuki
- Date:
- Fri Oct 17 20:48:15 2014 +0000
- Revision:
- 39:5817c3e6ce1e
- Parent:
- 38:9d12c615c8ea
- Child:
- 40:78e0ee75a604
formatting code only S and P commands implemented
Who changed what in which revision?
User | Revision | Line number | New 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 dev3(A5,A4); |
k4zuki | 38:9d12c615c8ea | 13 | //I2C dev4(A5,A4); |
k4zuki | 38:9d12c615c8ea | 14 | I2C* dev=&dev1; |
k4zuki | 38:9d12c615c8ea | 15 | BusOut bus(LED1,LED2,LED3,LED4); |
k4zuki | 38:9d12c615c8ea | 16 | //DigitalOut led1(LED1); |
k4zuki | 38:9d12c615c8ea | 17 | //DigitalOut led2(LED2); |
k4zuki | 38:9d12c615c8ea | 18 | //DigitalOut led3(LED3); |
k4zuki | 38:9d12c615c8ea | 19 | //DigitalOut led4(LED4); |
k4zuki | 38:9d12c615c8ea | 20 | |
k4zuki | 38:9d12c615c8ea | 21 | //Table 3. ASCII commands supported by SC18IM700 |
k4zuki | 38:9d12c615c8ea | 22 | //ASCII command Hex value Command function |
k4zuki | 39:5817c3e6ce1e | 23 | //[X] S 0x53 I2C-bus START |
k4zuki | 39:5817c3e6ce1e | 24 | //[X] P 0x50 I2C-bus STOP |
k4zuki | 39:5817c3e6ce1e | 25 | //[_] R 0x52 read SC18IM700 internal register |
k4zuki | 39:5817c3e6ce1e | 26 | //[_] W 0x57 write to SC18IM700 internal register |
k4zuki | 39:5817c3e6ce1e | 27 | //[_] I 0x49 read GPIO port |
k4zuki | 39:5817c3e6ce1e | 28 | //[_] O 0x4F write to GPIO port |
k4zuki | 39:5817c3e6ce1e | 29 | //[_] Z 0x5A power down |
k4zuki | 38:9d12c615c8ea | 30 | |
k4zuki | 38:9d12c615c8ea | 31 | int main() |
k4zuki | 38:9d12c615c8ea | 32 | { |
k4zuki | 38:9d12c615c8ea | 33 | #ifndef isuse_USB_SERIAL |
k4zuki | 38:9d12c615c8ea | 34 | pc.baud(115200); |
k4zuki | 38:9d12c615c8ea | 35 | #endif |
k4zuki | 38:9d12c615c8ea | 36 | dev1.frequency(100000);//100k |
k4zuki | 39:5817c3e6ce1e | 37 | dev2.frequency(100000);//100k |
k4zuki | 38:9d12c615c8ea | 38 | |
k4zuki | 38:9d12c615c8ea | 39 | int data=0x50; |
k4zuki | 38:9d12c615c8ea | 40 | int ack=0; |
k4zuki | 38:9d12c615c8ea | 41 | int plength=0; |
k4zuki | 38:9d12c615c8ea | 42 | char recieve[256]; |
k4zuki | 38:9d12c615c8ea | 43 | char send[256]; |
k4zuki | 38:9d12c615c8ea | 44 | char read=0; |
k4zuki | 38:9d12c615c8ea | 45 | int address=0,length=0,channel=0; |
k4zuki | 38:9d12c615c8ea | 46 | enum reg { |
k4zuki | 38:9d12c615c8ea | 47 | I2C0adr='0', |
k4zuki | 38:9d12c615c8ea | 48 | I2C1adr='1', |
k4zuki | 38:9d12c615c8ea | 49 | I2C2adr='2', |
k4zuki | 38:9d12c615c8ea | 50 | I2C3adr='3', |
k4zuki | 38:9d12c615c8ea | 51 | }; |
k4zuki | 38:9d12c615c8ea | 52 | //"C0P" |
k4zuki | 38:9d12c615c8ea | 53 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 38:9d12c615c8ea | 54 | //"C1P" |
k4zuki | 38:9d12c615c8ea | 55 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 38:9d12c615c8ea | 56 | //"C2P" |
k4zuki | 38:9d12c615c8ea | 57 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 38:9d12c615c8ea | 58 | //"C3P" |
k4zuki | 38:9d12c615c8ea | 59 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 38:9d12c615c8ea | 60 | |
k4zuki | 38:9d12c615c8ea | 61 | int i=0; |
k4zuki | 38:9d12c615c8ea | 62 | while(1) { |
k4zuki | 38:9d12c615c8ea | 63 | while(true) { |
k4zuki | 38:9d12c615c8ea | 64 | read=pc.getc(); |
k4zuki | 38:9d12c615c8ea | 65 | recieve[i]=read; |
k4zuki | 38:9d12c615c8ea | 66 | // ser.printf("%02X,",read); |
k4zuki | 38:9d12c615c8ea | 67 | i++; |
k4zuki | 38:9d12c615c8ea | 68 | if(read == 'P') { |
k4zuki | 38:9d12c615c8ea | 69 | plength=i; |
k4zuki | 38:9d12c615c8ea | 70 | // ser.printf("P\n\r"); |
k4zuki | 38:9d12c615c8ea | 71 | break; |
k4zuki | 38:9d12c615c8ea | 72 | } |
k4zuki | 38:9d12c615c8ea | 73 | } |
k4zuki | 38:9d12c615c8ea | 74 | i=0; |
k4zuki | 38:9d12c615c8ea | 75 | while(i<plength) { |
k4zuki | 38:9d12c615c8ea | 76 | switch(recieve[i]) { |
k4zuki | 38:9d12c615c8ea | 77 | case 'C': |
k4zuki | 38:9d12c615c8ea | 78 | channel=recieve[i+1]; |
k4zuki | 38:9d12c615c8ea | 79 | switch(channel) { |
k4zuki | 38:9d12c615c8ea | 80 | case I2C0adr: |
k4zuki | 38:9d12c615c8ea | 81 | bus=0x01; |
k4zuki | 38:9d12c615c8ea | 82 | // pc.printf("ch0 is selected,"); |
k4zuki | 39:5817c3e6ce1e | 83 | channel='0'; |
k4zuki | 38:9d12c615c8ea | 84 | dev=&dev1; |
k4zuki | 38:9d12c615c8ea | 85 | break; |
k4zuki | 38:9d12c615c8ea | 86 | case I2C1adr: |
k4zuki | 38:9d12c615c8ea | 87 | bus=0x02; |
k4zuki | 38:9d12c615c8ea | 88 | // pc.printf("ch1 is selected,"); |
k4zuki | 38:9d12c615c8ea | 89 | // pc.printf("ch1 is not implemented,"); |
k4zuki | 38:9d12c615c8ea | 90 | channel='1'; |
k4zuki | 38:9d12c615c8ea | 91 | dev=&dev2; |
k4zuki | 38:9d12c615c8ea | 92 | break; |
k4zuki | 38:9d12c615c8ea | 93 | case I2C2adr: |
k4zuki | 38:9d12c615c8ea | 94 | bus=0x04; |
k4zuki | 38:9d12c615c8ea | 95 | // pc.printf("ch2 is not implemented,"); |
k4zuki | 38:9d12c615c8ea | 96 | channel='0'; |
k4zuki | 38:9d12c615c8ea | 97 | //dev=&dev3; |
k4zuki | 38:9d12c615c8ea | 98 | break; |
k4zuki | 38:9d12c615c8ea | 99 | case I2C3adr: |
k4zuki | 38:9d12c615c8ea | 100 | bus=0x08; |
k4zuki | 38:9d12c615c8ea | 101 | // pc.printf("ch0 is not implemented,"); |
k4zuki | 38:9d12c615c8ea | 102 | channel='0'; |
k4zuki | 38:9d12c615c8ea | 103 | //dev=&dev4; |
k4zuki | 38:9d12c615c8ea | 104 | break; |
k4zuki | 38:9d12c615c8ea | 105 | default: |
k4zuki | 38:9d12c615c8ea | 106 | channel='0'; |
k4zuki | 38:9d12c615c8ea | 107 | dev=&dev1; |
k4zuki | 38:9d12c615c8ea | 108 | break; |
k4zuki | 38:9d12c615c8ea | 109 | } |
k4zuki | 38:9d12c615c8ea | 110 | i+=(2); |
k4zuki | 38:9d12c615c8ea | 111 | break; |
k4zuki | 38:9d12c615c8ea | 112 | case 'S': |
k4zuki | 38:9d12c615c8ea | 113 | address=recieve[i+1]; |
k4zuki | 38:9d12c615c8ea | 114 | length=recieve[i+2]; |
k4zuki | 38:9d12c615c8ea | 115 | // pc.printf("addr=%02X, length=%d,",address,length); |
k4zuki | 38:9d12c615c8ea | 116 | dev->start(); |
k4zuki | 38:9d12c615c8ea | 117 | dev->write(address); |
k4zuki | 38:9d12c615c8ea | 118 | if( (address&0x01)) {//read |
k4zuki | 38:9d12c615c8ea | 119 | // pc.printf("read from ch%c,",channel); |
k4zuki | 38:9d12c615c8ea | 120 | for(int j=0; j<length; j++) { |
k4zuki | 38:9d12c615c8ea | 121 | pc.putc(dev->read(0)); |
k4zuki | 38:9d12c615c8ea | 122 | // send[j]=dev->read(0); |
k4zuki | 38:9d12c615c8ea | 123 | // pc.printf("%02X,",dev->read(0)); |
k4zuki | 38:9d12c615c8ea | 124 | } |
k4zuki | 38:9d12c615c8ea | 125 | i+=(3); |
k4zuki | 38:9d12c615c8ea | 126 | } else {//write |
k4zuki | 38:9d12c615c8ea | 127 | // pc.printf("write to ch%c, ",channel); |
k4zuki | 38:9d12c615c8ea | 128 | for(int j=0; j<length; j++) { |
k4zuki | 38:9d12c615c8ea | 129 | // send[j]=recieve[4+j]; |
k4zuki | 38:9d12c615c8ea | 130 | // pc.printf("%02X,",recieve[3+j]); |
k4zuki | 38:9d12c615c8ea | 131 | dev->write(recieve[3+j]); |
k4zuki | 38:9d12c615c8ea | 132 | } |
k4zuki | 38:9d12c615c8ea | 133 | i+=(3+length); |
k4zuki | 38:9d12c615c8ea | 134 | } |
k4zuki | 38:9d12c615c8ea | 135 | break; |
k4zuki | 38:9d12c615c8ea | 136 | case 'P': |
k4zuki | 38:9d12c615c8ea | 137 | dev->stop(); |
k4zuki | 38:9d12c615c8ea | 138 | i=plength; |
k4zuki | 38:9d12c615c8ea | 139 | pc.printf("ok\n\r"); |
k4zuki | 38:9d12c615c8ea | 140 | break; |
k4zuki | 38:9d12c615c8ea | 141 | case 'R': |
k4zuki | 38:9d12c615c8ea | 142 | pc.printf("command R is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 143 | i=plength; |
k4zuki | 38:9d12c615c8ea | 144 | break; |
k4zuki | 38:9d12c615c8ea | 145 | case 'W': |
k4zuki | 38:9d12c615c8ea | 146 | pc.printf("command W is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 147 | i=plength; |
k4zuki | 38:9d12c615c8ea | 148 | break; |
k4zuki | 38:9d12c615c8ea | 149 | case 'I': |
k4zuki | 38:9d12c615c8ea | 150 | pc.printf("command I is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 151 | i=plength; |
k4zuki | 38:9d12c615c8ea | 152 | break; |
k4zuki | 38:9d12c615c8ea | 153 | case 'O': |
k4zuki | 38:9d12c615c8ea | 154 | pc.printf("command O is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 155 | i=plength; |
k4zuki | 38:9d12c615c8ea | 156 | break; |
k4zuki | 38:9d12c615c8ea | 157 | case 'Z': |
k4zuki | 38:9d12c615c8ea | 158 | pc.printf("command Z is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 159 | i=plength; |
k4zuki | 38:9d12c615c8ea | 160 | break; |
k4zuki | 38:9d12c615c8ea | 161 | default: |
k4zuki | 38:9d12c615c8ea | 162 | pc.printf("command ? is not implemented\n\r"); |
k4zuki | 38:9d12c615c8ea | 163 | i=plength; |
k4zuki | 38:9d12c615c8ea | 164 | break; |
k4zuki | 38:9d12c615c8ea | 165 | } |
k4zuki | 38:9d12c615c8ea | 166 | } |
k4zuki | 38:9d12c615c8ea | 167 | i=0; |
k4zuki | 38:9d12c615c8ea | 168 | |
k4zuki | 38:9d12c615c8ea | 169 | } |
k4zuki | 38:9d12c615c8ea | 170 | } |