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

Dependencies:   mbed

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?

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