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