Kazuki Yamamoto
/
uart_i2c_conv_824
only for LPC824 chip to match hardware I2C channels(2->4)
main.cpp@2:096289a04a1f, 2014-10-21 (annotated)
- Committer:
- k4zuki
- Date:
- Tue Oct 21 03:41:24 2014 +0000
- Revision:
- 2:096289a04a1f
- Parent:
- 1:5817c3e6ce1e
- Child:
- 3:8e33af9ea1f7
changed pinout SDA+SCL/A0+A1/A2+A3/A4+A5; changed UART speed downto 9600baud
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
k4zuki | 0:9d12c615c8ea | 1 | #include "mbed.h" |
k4zuki | 0:9d12c615c8ea | 2 | |
k4zuki | 0:9d12c615c8ea | 3 | Serial pc(USBTX,USBRX); |
k4zuki | 2:096289a04a1f | 4 | /* |
k4zuki | 2:096289a04a1f | 5 | D5 = P0_28, |
k4zuki | 2:096289a04a1f | 6 | D6 = P0_16, // LED_GREEN |
k4zuki | 2:096289a04a1f | 7 | D7 = P0_17, |
k4zuki | 2:096289a04a1f | 8 | D8 = P0_13, |
k4zuki | 2:096289a04a1f | 9 | D9 = P0_27, // LED_BLUE |
k4zuki | 2:096289a04a1f | 10 | D10 = P0_15, |
k4zuki | 2:096289a04a1f | 11 | D11 = P0_26, |
k4zuki | 2:096289a04a1f | 12 | D12 = P0_25, |
k4zuki | 2:096289a04a1f | 13 | D13 = P0_24, |
k4zuki | 2:096289a04a1f | 14 | */ |
k4zuki | 2:096289a04a1f | 15 | I2C dev1(I2C_SDA,I2C_SCL); |
k4zuki | 2:096289a04a1f | 16 | I2C dev2(A0,A1); |
k4zuki | 2:096289a04a1f | 17 | I2C dev3(A2,A3); |
k4zuki | 2:096289a04a1f | 18 | I2C dev4(A4,A5); |
k4zuki | 2:096289a04a1f | 19 | //BusOut bus(LED1,LED2,LED3,LED4); |
k4zuki | 2:096289a04a1f | 20 | DigitalOut led1(LED1); |
k4zuki | 0:9d12c615c8ea | 21 | //DigitalOut led2(LED2); |
k4zuki | 0:9d12c615c8ea | 22 | //DigitalOut led3(LED3); |
k4zuki | 0:9d12c615c8ea | 23 | //DigitalOut led4(LED4); |
k4zuki | 0:9d12c615c8ea | 24 | |
k4zuki | 0:9d12c615c8ea | 25 | //Table 3. ASCII commands supported by SC18IM700 |
k4zuki | 0:9d12c615c8ea | 26 | //ASCII command Hex value Command function |
k4zuki | 1:5817c3e6ce1e | 27 | //[X] S 0x53 I2C-bus START |
k4zuki | 1:5817c3e6ce1e | 28 | //[X] P 0x50 I2C-bus STOP |
k4zuki | 1:5817c3e6ce1e | 29 | //[_] R 0x52 read SC18IM700 internal register |
k4zuki | 1:5817c3e6ce1e | 30 | //[_] W 0x57 write to SC18IM700 internal register |
k4zuki | 1:5817c3e6ce1e | 31 | //[_] I 0x49 read GPIO port |
k4zuki | 1:5817c3e6ce1e | 32 | //[_] O 0x4F write to GPIO port |
k4zuki | 1:5817c3e6ce1e | 33 | //[_] Z 0x5A power down |
k4zuki | 2:096289a04a1f | 34 | //[X] C 0x?? change channel |
k4zuki | 0:9d12c615c8ea | 35 | |
k4zuki | 0:9d12c615c8ea | 36 | int main() |
k4zuki | 0:9d12c615c8ea | 37 | { |
k4zuki | 2:096289a04a1f | 38 | I2C* dev=&dev1; |
k4zuki | 2:096289a04a1f | 39 | pc.baud(9600); |
k4zuki | 0:9d12c615c8ea | 40 | dev1.frequency(100000);//100k |
k4zuki | 1:5817c3e6ce1e | 41 | dev2.frequency(100000);//100k |
k4zuki | 2:096289a04a1f | 42 | dev3.frequency(100000);//100k |
k4zuki | 2:096289a04a1f | 43 | dev4.frequency(100000);//100k |
k4zuki | 0:9d12c615c8ea | 44 | |
k4zuki | 2:096289a04a1f | 45 | // int data=0x50; |
k4zuki | 2:096289a04a1f | 46 | // int ack=0; |
k4zuki | 0:9d12c615c8ea | 47 | int plength=0; |
k4zuki | 0:9d12c615c8ea | 48 | char recieve[256]; |
k4zuki | 2:096289a04a1f | 49 | // char send[256]; |
k4zuki | 0:9d12c615c8ea | 50 | char read=0; |
k4zuki | 0:9d12c615c8ea | 51 | int address=0,length=0,channel=0; |
k4zuki | 0:9d12c615c8ea | 52 | enum reg { |
k4zuki | 0:9d12c615c8ea | 53 | I2C0adr='0', |
k4zuki | 0:9d12c615c8ea | 54 | I2C1adr='1', |
k4zuki | 0:9d12c615c8ea | 55 | I2C2adr='2', |
k4zuki | 0:9d12c615c8ea | 56 | I2C3adr='3', |
k4zuki | 0:9d12c615c8ea | 57 | }; |
k4zuki | 0:9d12c615c8ea | 58 | //"C0P" |
k4zuki | 0:9d12c615c8ea | 59 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 60 | //"C1P" |
k4zuki | 0:9d12c615c8ea | 61 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 62 | //"C2P" |
k4zuki | 0:9d12c615c8ea | 63 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 64 | //"C3P" |
k4zuki | 0:9d12c615c8ea | 65 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 2:096289a04a1f | 66 | //dev1.start(); |
k4zuki | 2:096289a04a1f | 67 | //dev1.write(address); |
k4zuki | 2:096289a04a1f | 68 | //dev1.stop(); |
k4zuki | 0:9d12c615c8ea | 69 | |
k4zuki | 0:9d12c615c8ea | 70 | int i=0; |
k4zuki | 0:9d12c615c8ea | 71 | while(1) { |
k4zuki | 0:9d12c615c8ea | 72 | while(true) { |
k4zuki | 2:096289a04a1f | 73 | led1=0; |
k4zuki | 0:9d12c615c8ea | 74 | read=pc.getc(); |
k4zuki | 0:9d12c615c8ea | 75 | recieve[i]=read; |
k4zuki | 2:096289a04a1f | 76 | //pc.printf("%02X,",read); //debug |
k4zuki | 0:9d12c615c8ea | 77 | i++; |
k4zuki | 0:9d12c615c8ea | 78 | if(read == 'P') { |
k4zuki | 0:9d12c615c8ea | 79 | plength=i; |
k4zuki | 2:096289a04a1f | 80 | led1=1; |
k4zuki | 2:096289a04a1f | 81 | //pc.printf("P\n\r"); |
k4zuki | 0:9d12c615c8ea | 82 | break; |
k4zuki | 0:9d12c615c8ea | 83 | } |
k4zuki | 0:9d12c615c8ea | 84 | } |
k4zuki | 0:9d12c615c8ea | 85 | i=0; |
k4zuki | 0:9d12c615c8ea | 86 | while(i<plength) { |
k4zuki | 0:9d12c615c8ea | 87 | switch(recieve[i]) { |
k4zuki | 0:9d12c615c8ea | 88 | case 'C': |
k4zuki | 0:9d12c615c8ea | 89 | channel=recieve[i+1]; |
k4zuki | 0:9d12c615c8ea | 90 | switch(channel) { |
k4zuki | 0:9d12c615c8ea | 91 | case I2C0adr: |
k4zuki | 2:096289a04a1f | 92 | //// bus=0x01; |
k4zuki | 2:096289a04a1f | 93 | //pc.printf("ch0 is selected,"); |
k4zuki | 1:5817c3e6ce1e | 94 | channel='0'; |
k4zuki | 0:9d12c615c8ea | 95 | dev=&dev1; |
k4zuki | 0:9d12c615c8ea | 96 | break; |
k4zuki | 0:9d12c615c8ea | 97 | case I2C1adr: |
k4zuki | 2:096289a04a1f | 98 | //// bus=0x02; |
k4zuki | 2:096289a04a1f | 99 | //pc.printf("ch1 is selected,"); |
k4zuki | 0:9d12c615c8ea | 100 | channel='1'; |
k4zuki | 0:9d12c615c8ea | 101 | dev=&dev2; |
k4zuki | 0:9d12c615c8ea | 102 | break; |
k4zuki | 0:9d12c615c8ea | 103 | case I2C2adr: |
k4zuki | 2:096289a04a1f | 104 | //// bus=0x04; |
k4zuki | 2:096289a04a1f | 105 | //pc.printf("ch2 is selected,"); |
k4zuki | 2:096289a04a1f | 106 | channel='2'; |
k4zuki | 2:096289a04a1f | 107 | dev=&dev3; |
k4zuki | 0:9d12c615c8ea | 108 | break; |
k4zuki | 0:9d12c615c8ea | 109 | case I2C3adr: |
k4zuki | 2:096289a04a1f | 110 | //// bus=0x08; |
k4zuki | 2:096289a04a1f | 111 | //pc.printf("ch3 is selected,"); |
k4zuki | 2:096289a04a1f | 112 | channel='3'; |
k4zuki | 2:096289a04a1f | 113 | dev=&dev4; |
k4zuki | 0:9d12c615c8ea | 114 | break; |
k4zuki | 0:9d12c615c8ea | 115 | default: |
k4zuki | 2:096289a04a1f | 116 | //pc.printf("ch? is not implemented,"); |
k4zuki | 0:9d12c615c8ea | 117 | channel='0'; |
k4zuki | 0:9d12c615c8ea | 118 | dev=&dev1; |
k4zuki | 0:9d12c615c8ea | 119 | break; |
k4zuki | 0:9d12c615c8ea | 120 | } |
k4zuki | 0:9d12c615c8ea | 121 | i+=(2); |
k4zuki | 0:9d12c615c8ea | 122 | break; |
k4zuki | 0:9d12c615c8ea | 123 | case 'S': |
k4zuki | 0:9d12c615c8ea | 124 | address=recieve[i+1]; |
k4zuki | 0:9d12c615c8ea | 125 | length=recieve[i+2]; |
k4zuki | 2:096289a04a1f | 126 | //pc.printf("addr=%02X, length=%d,",address,length); |
k4zuki | 2:096289a04a1f | 127 | //dev1.start(); |
k4zuki | 2:096289a04a1f | 128 | //dev1.write(address); |
k4zuki | 0:9d12c615c8ea | 129 | dev->start(); |
k4zuki | 0:9d12c615c8ea | 130 | dev->write(address); |
k4zuki | 0:9d12c615c8ea | 131 | if( (address&0x01)) {//read |
k4zuki | 2:096289a04a1f | 132 | //pc.printf("read from ch%c,",channel); |
k4zuki | 0:9d12c615c8ea | 133 | for(int j=0; j<length; j++) { |
k4zuki | 2:096289a04a1f | 134 | //pc.putc(dev->read(0)); |
k4zuki | 2:096289a04a1f | 135 | pc.printf("%02X,",dev->read(0)); |
k4zuki | 0:9d12c615c8ea | 136 | } |
k4zuki | 0:9d12c615c8ea | 137 | i+=(3); |
k4zuki | 0:9d12c615c8ea | 138 | } else {//write |
k4zuki | 2:096289a04a1f | 139 | //pc.printf("write to ch%c, ",channel); |
k4zuki | 0:9d12c615c8ea | 140 | for(int j=0; j<length; j++) { |
k4zuki | 2:096289a04a1f | 141 | //pc.printf("%02X,",recieve[3+j]); |
k4zuki | 2:096289a04a1f | 142 | //dev1.write(recieve[3+j]); |
k4zuki | 0:9d12c615c8ea | 143 | dev->write(recieve[3+j]); |
k4zuki | 0:9d12c615c8ea | 144 | } |
k4zuki | 0:9d12c615c8ea | 145 | i+=(3+length); |
k4zuki | 0:9d12c615c8ea | 146 | } |
k4zuki | 0:9d12c615c8ea | 147 | break; |
k4zuki | 0:9d12c615c8ea | 148 | case 'P': |
k4zuki | 2:096289a04a1f | 149 | //dev1.stop(); |
k4zuki | 0:9d12c615c8ea | 150 | dev->stop(); |
k4zuki | 0:9d12c615c8ea | 151 | i=plength; |
k4zuki | 0:9d12c615c8ea | 152 | pc.printf("ok\n\r"); |
k4zuki | 0:9d12c615c8ea | 153 | break; |
k4zuki | 0:9d12c615c8ea | 154 | case 'R': |
k4zuki | 0:9d12c615c8ea | 155 | pc.printf("command R is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 156 | i=plength; |
k4zuki | 0:9d12c615c8ea | 157 | break; |
k4zuki | 0:9d12c615c8ea | 158 | case 'W': |
k4zuki | 0:9d12c615c8ea | 159 | pc.printf("command W is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 160 | i=plength; |
k4zuki | 0:9d12c615c8ea | 161 | break; |
k4zuki | 0:9d12c615c8ea | 162 | case 'I': |
k4zuki | 0:9d12c615c8ea | 163 | pc.printf("command I is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 164 | i=plength; |
k4zuki | 0:9d12c615c8ea | 165 | break; |
k4zuki | 0:9d12c615c8ea | 166 | case 'O': |
k4zuki | 0:9d12c615c8ea | 167 | pc.printf("command O is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 168 | i=plength; |
k4zuki | 0:9d12c615c8ea | 169 | break; |
k4zuki | 0:9d12c615c8ea | 170 | case 'Z': |
k4zuki | 0:9d12c615c8ea | 171 | pc.printf("command Z is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 172 | i=plength; |
k4zuki | 0:9d12c615c8ea | 173 | break; |
k4zuki | 0:9d12c615c8ea | 174 | default: |
k4zuki | 0:9d12c615c8ea | 175 | pc.printf("command ? is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 176 | i=plength; |
k4zuki | 0:9d12c615c8ea | 177 | break; |
k4zuki | 0:9d12c615c8ea | 178 | } |
k4zuki | 0:9d12c615c8ea | 179 | } |
k4zuki | 0:9d12c615c8ea | 180 | i=0; |
k4zuki | 0:9d12c615c8ea | 181 | |
k4zuki | 0:9d12c615c8ea | 182 | } |
k4zuki | 0:9d12c615c8ea | 183 | } |