only for LPC824 chip to match hardware I2C channels(2->4)

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }