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@40:78e0ee75a604, 2014-10-21 (annotated)
- Committer:
- k4zuki
- Date:
- Tue Oct 21 03:55:14 2014 +0000
- Revision:
- 40:78e0ee75a604
- Parent:
- 39:5817c3e6ce1e
- Child:
- 41:b7c84115a2dd
removed unused variables; fixed coding format; commented out unused code
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* 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 | 40:78e0ee75a604 | 83 | //pc.printf("ch0 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 | } |