Kazuki Yamamoto
/
uart_i2c_conv_824
only for LPC824 chip to match hardware I2C channels(2->4)
main.cpp@7:46655bc3288b, 2014-10-26 (annotated)
- Committer:
- k4zuki
- Date:
- Sun Oct 26 15:32:59 2014 +0000
- Revision:
- 7:46655bc3288b
- Parent:
- 6:9368ba5f485c
- Child:
- 9:78c43e2448d6
mbed-src has fixed I2C related issue
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 | 4:bbea62f185e1 | 15 | I2C dev1(I2C_SDA,I2C_SCL);//11,10 hard coded |
k4zuki | 4:bbea62f185e1 | 16 | I2C dev2(A0,A1);//6,14 |
k4zuki | 4:bbea62f185e1 | 17 | I2C dev3(A2,A3);//23,22 |
k4zuki | 4:bbea62f185e1 | 18 | I2C dev4(A4,A5);//21,20 |
k4zuki | 5:655e58295f1e | 19 | BusOut bus(LED1,LED2,LED3,LED4); |
k4zuki | 7:46655bc3288b | 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 | 7:46655bc3288b | 39 | pc.baud(19200); |
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 | 7:46655bc3288b | 45 | /** debug code |
k4zuki | 7:46655bc3288b | 46 | pc.printf("assign0: %08X\n\r",LPC_SYSCON->PRESETCTRL );//????_??(?|4)? |
k4zuki | 5:655e58295f1e | 47 | pc.printf("enable I2C0: %08X\n\r",LPC_SWM->PINENABLE0);//????_(C|?)??? |
k4zuki | 7:46655bc3288b | 48 | pc.printf("assign1: %08X\n\r",LPC_SWM->PINASSIGN[9] );//170E_06?? |
k4zuki | 7:46655bc3288b | 49 | pc.printf("assign2: %08X\n\r",LPC_SWM->PINASSIGN[10] );//??_14_15_16 |
k4zuki | 4:bbea62f185e1 | 50 | pc.printf("clock: %08X\n\r",LPC_SYSCON->SYSAHBCLKCTRL );// ??_(?|E)?_??_(?|2)? |
k4zuki | 7:46655bc3288b | 51 | pc.printf("LPC_I2C0: %08X, ",LPC_I2C0 ); |
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 | 7:46655bc3288b | 59 | |
k4zuki | 5:655e58295f1e | 60 | pc.printf("dev: %08X\n\r",*dev ); |
k4zuki | 7:46655bc3288b | 61 | |
k4zuki | 5:655e58295f1e | 62 | dev=&dev2; |
k4zuki | 5:655e58295f1e | 63 | pc.printf("dev: %08X\n\r",*dev ); |
k4zuki | 7:46655bc3288b | 64 | |
k4zuki | 5:655e58295f1e | 65 | dev=&dev3; |
k4zuki | 5:655e58295f1e | 66 | pc.printf("dev: %08X\n\r",*dev ); |
k4zuki | 7:46655bc3288b | 67 | |
k4zuki | 5:655e58295f1e | 68 | dev=&dev4; |
k4zuki | 5:655e58295f1e | 69 | pc.printf("dev: %08X\n\r",*dev ); |
k4zuki | 7:46655bc3288b | 70 | |
k4zuki | 7:46655bc3288b | 71 | |
k4zuki | 7:46655bc3288b | 72 | i2c_t *obj0; |
k4zuki | 7:46655bc3288b | 73 | //i2c_t *obj1; |
k4zuki | 7:46655bc3288b | 74 | //i2c_t *obj2; |
k4zuki | 7:46655bc3288b | 75 | //i2c_t *obj3; |
k4zuki | 7:46655bc3288b | 76 | obj0->i2c = (LPC_I2C0_Type *)(LPC_I2C0); |
k4zuki | 7:46655bc3288b | 77 | //obj1->i2c = (LPC_I2C0_Type *)(LPC_I2C1); |
k4zuki | 7:46655bc3288b | 78 | //obj2->i2c = (LPC_I2C0_Type *)(LPC_I2C2); |
k4zuki | 7:46655bc3288b | 79 | //obj3->i2c = (LPC_I2C0_Type *)(LPC_I2C3); |
k4zuki | 7:46655bc3288b | 80 | |
k4zuki | 7:46655bc3288b | 81 | printf("obj0: %08X\n\r",obj0->i2c->STAT); |
k4zuki | 7:46655bc3288b | 82 | //printf("obj1: %08X\n\r",obj1->i2c->STAT); |
k4zuki | 7:46655bc3288b | 83 | //printf("obj2: %08X\n\r",obj2->i2c->STAT); |
k4zuki | 7:46655bc3288b | 84 | //printf("obj3: %08X\n\r",obj3->i2c->STAT); |
k4zuki | 7:46655bc3288b | 85 | |
k4zuki | 7:46655bc3288b | 86 | |
k4zuki | 5:655e58295f1e | 87 | dev=&dev1; |
k4zuki | 7:46655bc3288b | 88 | |
k4zuki | 7:46655bc3288b | 89 | dev1.start(); |
k4zuki | 7:46655bc3288b | 90 | dev1.write(0x90); |
k4zuki | 7:46655bc3288b | 91 | dev1.write(0xAA); |
k4zuki | 7:46655bc3288b | 92 | dev1.write(0x55); |
k4zuki | 7:46655bc3288b | 93 | dev1.stop(); |
k4zuki | 7:46655bc3288b | 94 | */ |
k4zuki | 2:096289a04a1f | 95 | // int data=0x50; |
k4zuki | 2:096289a04a1f | 96 | // int ack=0; |
k4zuki | 0:9d12c615c8ea | 97 | int plength=0; |
k4zuki | 0:9d12c615c8ea | 98 | char recieve[256]; |
k4zuki | 2:096289a04a1f | 99 | // char send[256]; |
k4zuki | 0:9d12c615c8ea | 100 | char read=0; |
k4zuki | 0:9d12c615c8ea | 101 | int address=0,length=0,channel=0; |
k4zuki | 0:9d12c615c8ea | 102 | enum reg { |
k4zuki | 0:9d12c615c8ea | 103 | I2C0adr='0', |
k4zuki | 0:9d12c615c8ea | 104 | I2C1adr='1', |
k4zuki | 0:9d12c615c8ea | 105 | I2C2adr='2', |
k4zuki | 0:9d12c615c8ea | 106 | I2C3adr='3', |
k4zuki | 0:9d12c615c8ea | 107 | }; |
k4zuki | 0:9d12c615c8ea | 108 | //"C0P" |
k4zuki | 0:9d12c615c8ea | 109 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 110 | //"C1P" |
k4zuki | 0:9d12c615c8ea | 111 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 112 | //"C2P" |
k4zuki | 0:9d12c615c8ea | 113 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 0:9d12c615c8ea | 114 | //"C3P" |
k4zuki | 0:9d12c615c8ea | 115 | //"S(0x80)(4)(0xDEADBEAF)P" |
k4zuki | 2:096289a04a1f | 116 | //dev1.start(); |
k4zuki | 2:096289a04a1f | 117 | //dev1.write(address); |
k4zuki | 2:096289a04a1f | 118 | //dev1.stop(); |
k4zuki | 0:9d12c615c8ea | 119 | |
k4zuki | 0:9d12c615c8ea | 120 | int i=0; |
k4zuki | 0:9d12c615c8ea | 121 | while(1) { |
k4zuki | 0:9d12c615c8ea | 122 | while(true) { |
k4zuki | 7:46655bc3288b | 123 | //// led1=0; |
k4zuki | 0:9d12c615c8ea | 124 | read=pc.getc(); |
k4zuki | 0:9d12c615c8ea | 125 | recieve[i]=read; |
k4zuki | 2:096289a04a1f | 126 | //pc.printf("%02X,",read); //debug |
k4zuki | 0:9d12c615c8ea | 127 | i++; |
k4zuki | 0:9d12c615c8ea | 128 | if(read == 'P') { |
k4zuki | 0:9d12c615c8ea | 129 | plength=i; |
k4zuki | 7:46655bc3288b | 130 | //// led1=1; |
k4zuki | 2:096289a04a1f | 131 | //pc.printf("P\n\r"); |
k4zuki | 0:9d12c615c8ea | 132 | break; |
k4zuki | 0:9d12c615c8ea | 133 | } |
k4zuki | 0:9d12c615c8ea | 134 | } |
k4zuki | 0:9d12c615c8ea | 135 | i=0; |
k4zuki | 0:9d12c615c8ea | 136 | while(i<plength) { |
k4zuki | 0:9d12c615c8ea | 137 | switch(recieve[i]) { |
k4zuki | 0:9d12c615c8ea | 138 | case 'C': |
k4zuki | 0:9d12c615c8ea | 139 | channel=recieve[i+1]; |
k4zuki | 0:9d12c615c8ea | 140 | switch(channel) { |
k4zuki | 0:9d12c615c8ea | 141 | case I2C0adr: |
k4zuki | 5:655e58295f1e | 142 | bus=~0x01; |
k4zuki | 2:096289a04a1f | 143 | //pc.printf("ch0 is selected,"); |
k4zuki | 1:5817c3e6ce1e | 144 | channel='0'; |
k4zuki | 0:9d12c615c8ea | 145 | dev=&dev1; |
k4zuki | 0:9d12c615c8ea | 146 | break; |
k4zuki | 0:9d12c615c8ea | 147 | case I2C1adr: |
k4zuki | 5:655e58295f1e | 148 | bus=~0x02; |
k4zuki | 2:096289a04a1f | 149 | //pc.printf("ch1 is selected,"); |
k4zuki | 0:9d12c615c8ea | 150 | channel='1'; |
k4zuki | 0:9d12c615c8ea | 151 | dev=&dev2; |
k4zuki | 0:9d12c615c8ea | 152 | break; |
k4zuki | 0:9d12c615c8ea | 153 | case I2C2adr: |
k4zuki | 5:655e58295f1e | 154 | bus=~0x04; |
k4zuki | 2:096289a04a1f | 155 | //pc.printf("ch2 is selected,"); |
k4zuki | 2:096289a04a1f | 156 | channel='2'; |
k4zuki | 2:096289a04a1f | 157 | dev=&dev3; |
k4zuki | 0:9d12c615c8ea | 158 | break; |
k4zuki | 0:9d12c615c8ea | 159 | case I2C3adr: |
k4zuki | 5:655e58295f1e | 160 | bus=~0x08; |
k4zuki | 2:096289a04a1f | 161 | //pc.printf("ch3 is selected,"); |
k4zuki | 2:096289a04a1f | 162 | channel='3'; |
k4zuki | 2:096289a04a1f | 163 | dev=&dev4; |
k4zuki | 0:9d12c615c8ea | 164 | break; |
k4zuki | 0:9d12c615c8ea | 165 | default: |
k4zuki | 2:096289a04a1f | 166 | //pc.printf("ch? is not implemented,"); |
k4zuki | 0:9d12c615c8ea | 167 | channel='0'; |
k4zuki | 0:9d12c615c8ea | 168 | dev=&dev1; |
k4zuki | 0:9d12c615c8ea | 169 | break; |
k4zuki | 0:9d12c615c8ea | 170 | } |
k4zuki | 0:9d12c615c8ea | 171 | i+=(2); |
k4zuki | 0:9d12c615c8ea | 172 | break; |
k4zuki | 0:9d12c615c8ea | 173 | case 'S': |
k4zuki | 0:9d12c615c8ea | 174 | address=recieve[i+1]; |
k4zuki | 0:9d12c615c8ea | 175 | length=recieve[i+2]; |
k4zuki | 2:096289a04a1f | 176 | //pc.printf("addr=%02X, length=%d,",address,length); |
k4zuki | 5:655e58295f1e | 177 | //dev1.start(); |
k4zuki | 5:655e58295f1e | 178 | //dev1.write(address); |
k4zuki | 5:655e58295f1e | 179 | dev->start(); |
k4zuki | 7:46655bc3288b | 180 | //printf("start: %08X\n\r",obj0->i2c->MSTCTL); |
k4zuki | 5:655e58295f1e | 181 | dev->write(address); |
k4zuki | 7:46655bc3288b | 182 | //printf("write: %08X\n\r",obj0->i2c->STAT); |
k4zuki | 0:9d12c615c8ea | 183 | if( (address&0x01)) {//read |
k4zuki | 2:096289a04a1f | 184 | //pc.printf("read from ch%c,",channel); |
k4zuki | 0:9d12c615c8ea | 185 | for(int j=0; j<length; j++) { |
k4zuki | 2:096289a04a1f | 186 | pc.printf("%02X,",dev->read(0)); |
k4zuki | 5:655e58295f1e | 187 | //pc.printf("%02X,",dev1.read(0)); |
k4zuki | 0:9d12c615c8ea | 188 | } |
k4zuki | 0:9d12c615c8ea | 189 | i+=(3); |
k4zuki | 0:9d12c615c8ea | 190 | } else {//write |
k4zuki | 2:096289a04a1f | 191 | //pc.printf("write to ch%c, ",channel); |
k4zuki | 0:9d12c615c8ea | 192 | for(int j=0; j<length; j++) { |
k4zuki | 2:096289a04a1f | 193 | //pc.printf("%02X,",recieve[3+j]); |
k4zuki | 5:655e58295f1e | 194 | //dev1.write(recieve[3+j]); |
k4zuki | 5:655e58295f1e | 195 | dev->write(recieve[3+j]); |
k4zuki | 0:9d12c615c8ea | 196 | } |
k4zuki | 0:9d12c615c8ea | 197 | i+=(3+length); |
k4zuki | 0:9d12c615c8ea | 198 | } |
k4zuki | 0:9d12c615c8ea | 199 | break; |
k4zuki | 0:9d12c615c8ea | 200 | case 'P': |
k4zuki | 5:655e58295f1e | 201 | //dev1.stop(); |
k4zuki | 5:655e58295f1e | 202 | dev->stop(); |
k4zuki | 7:46655bc3288b | 203 | //printf("stop: %08X\n\r",obj0->i2c->MSTCTL); |
k4zuki | 0:9d12c615c8ea | 204 | i=plength; |
k4zuki | 0:9d12c615c8ea | 205 | pc.printf("ok\n\r"); |
k4zuki | 0:9d12c615c8ea | 206 | break; |
k4zuki | 0:9d12c615c8ea | 207 | case 'R': |
k4zuki | 0:9d12c615c8ea | 208 | pc.printf("command R is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 209 | i=plength; |
k4zuki | 0:9d12c615c8ea | 210 | break; |
k4zuki | 0:9d12c615c8ea | 211 | case 'W': |
k4zuki | 0:9d12c615c8ea | 212 | pc.printf("command W is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 213 | i=plength; |
k4zuki | 0:9d12c615c8ea | 214 | break; |
k4zuki | 0:9d12c615c8ea | 215 | case 'I': |
k4zuki | 0:9d12c615c8ea | 216 | pc.printf("command I is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 217 | i=plength; |
k4zuki | 0:9d12c615c8ea | 218 | break; |
k4zuki | 0:9d12c615c8ea | 219 | case 'O': |
k4zuki | 0:9d12c615c8ea | 220 | pc.printf("command O is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 221 | i=plength; |
k4zuki | 0:9d12c615c8ea | 222 | break; |
k4zuki | 0:9d12c615c8ea | 223 | case 'Z': |
k4zuki | 0:9d12c615c8ea | 224 | pc.printf("command Z is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 225 | i=plength; |
k4zuki | 0:9d12c615c8ea | 226 | break; |
k4zuki | 0:9d12c615c8ea | 227 | default: |
k4zuki | 0:9d12c615c8ea | 228 | pc.printf("command ? is not implemented\n\r"); |
k4zuki | 0:9d12c615c8ea | 229 | i=plength; |
k4zuki | 0:9d12c615c8ea | 230 | break; |
k4zuki | 0:9d12c615c8ea | 231 | } |
k4zuki | 0:9d12c615c8ea | 232 | } |
k4zuki | 0:9d12c615c8ea | 233 | i=0; |
k4zuki | 0:9d12c615c8ea | 234 | |
k4zuki | 0:9d12c615c8ea | 235 | } |
k4zuki | 0:9d12c615c8ea | 236 | } |