Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 /** uart_i2c_conv for LPC824 00002 */ 00003 00004 #include "mbed.h" 00005 #include "settings.h" 00006 //Table 3. ASCII commands supported by SC18IM700 00007 //ASCII command Hex value Command function 00008 //[X] S 0x53 I2C-bus START 00009 //[X] P 0x50 I2C/SPI-bus STOP, end of packet 00010 //[X] R 0x52 read SC18IM700 internal register 00011 //[X] W 0x57 write to internal register(s) 00012 //[X] I 0x49 read GPIO port 00013 //[X] O 0x4F write to GPIO port 00014 //[_] Z 0x5A power down 00015 //[X] C 0x43 change channel 00016 //[X] E 0x45 SPI transfer start 00017 //[_] V 0x__ enable VDDIO output to chip 00018 00019 /** 00020 "C| '0'| P" 00021 "C| '1'| P" 00022 "C| '2'| P" 00023 "C| '3'| P" 00024 "S| 0x_8 _0| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" 00025 "S| 0x_8 _0| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| S| 0x_8 _1| 0x_0 _4| P" 00026 "S| 0x_8 _1| 0x_0 _4| P" 00027 "R| '0'| P" 00028 "R| '0'| '1'| ...| P" 00029 "W| '0' 0x_a _a| P" 00030 "W| '0' 0x_a _a| '1' 0x_b _b| ...| P" 00031 "I| '0'| P" 00032 "O| '0'| 0x_a _a| P" 00033 "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write 00034 "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read 00035 */ 00036 int main() 00037 { 00038 I2C* dev = &dev1; 00039 00040 #ifdef isUART 00041 pc.baud(115200); 00042 #endif 00043 _spi.frequency(8000000); 00044 00045 bool s = false; 00046 dev1.frequency(400000); 00047 #if defined(TARGET_SSCI824) || defined(TARGET_LP824MAX) 00048 dev1.frequency(800000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? 00049 LPC_IOCON->PIO0_11 &= ~(0x03<<8); 00050 LPC_IOCON->PIO0_11 |= (0x02<<8); 00051 LPC_IOCON->PIO0_10 &= ~(0x03<<8); 00052 LPC_IOCON->PIO0_10 |= (0x02<<8); 00053 #elif defined(TARGET_MCU_LPC11U35_501) || defined(TARGET_LPC11U35_401) 00054 dev1.frequency(800000);//800k; works around 940kHz with 200ohm pullups/ not work at 1M? 00055 LPC_IOCON->PIO0_4 &= ~(0x03<<8); 00056 LPC_IOCON->PIO0_4 |= (0x02<<8); 00057 LPC_IOCON->PIO0_5 &= ~(0x03<<8); 00058 LPC_IOCON->PIO0_5 |= (0x02<<8); 00059 #endif 00060 00061 #ifdef isI2C2 00062 dev2.frequency(400000);//400k 00063 #endif 00064 #ifdef isI2C3 00065 dev3.frequency(400000);//400k 00066 #endif 00067 #ifdef isI2C4 00068 dev4.frequency(400000);//400k 00069 #endif 00070 #ifdef isGPIO1 00071 DigitalInOut* gpio1[] = { 00072 &_GPIO10, 00073 &_GPIO11, 00074 &_GPIO12, 00075 &_GPIO13, 00076 &_GPIO14, 00077 &_GPIO15, 00078 &_GPIO16, 00079 &_GPIO17, 00080 }; 00081 for(int k = 0; k < 8; k++){ 00082 gpio1[k]->input(); 00083 gpio1[k]->mode( PullUp ); 00084 } 00085 #endif 00086 00087 DigitalInOut* gpio0[] = { 00088 &_GPIO00, 00089 &_GPIO01, 00090 &_GPIO02, 00091 &_GPIO03, 00092 &_GPIO04, 00093 &_GPIO05, 00094 &_GPIO06, 00095 &_GPIO07, 00096 }; 00097 for(int k = 0; k < 8; k++){ 00098 gpio0[k]->input(); 00099 gpio0[k]->mode( PullUp ); 00100 } 00101 00102 int ack = 0; 00103 int plength = 0; 00104 int recieve[256]; 00105 char send[256]; 00106 for(int k = 0; k < 256; k+=4){ 00107 // cafe moca 00108 recieve[k + 0] = send[k + 0] = 0xC4; 00109 recieve[k + 1] = send[k + 1] = 0xFE; 00110 recieve[k + 2] = send[k + 2] = 0xE0; 00111 recieve[k + 3] = send[k + 3] = 0xCA; 00112 } 00113 00114 int read = 0; 00115 int address = 0; 00116 int data = 0; 00117 int _data = 0; 00118 int length = 0; 00119 int channel = 0; 00120 int format = 8; 00121 int enabled = 0; 00122 int disabled = 0; 00123 enum command_e { 00124 CMD_S = 'S', 00125 CMD_P = 'P', 00126 CMD_C = 'C', 00127 CMD_R = 'R', 00128 CMD_W = 'W', 00129 CMD_I = 'I', 00130 CMD_O = 'O', 00131 CMD_E = 'E', 00132 }; 00133 enum channel_e { 00134 CH0 = '0', 00135 CH1 = '1', 00136 CH2 = '2', 00137 CH3 = '3', 00138 }; 00139 enum register_e { 00140 CHIP_ID = '0', 00141 GPIO0_STAT = '1', 00142 GPIO1_STAT = '2', 00143 GPIO0_CONF = '3', 00144 GPIO1_CONF = '4', 00145 I2C_CONF = '5', 00146 SPI_CONF = '6', 00147 REG7, 00148 REG8, 00149 REG9, 00150 }; 00151 static uint8_t registers[]={ 00152 chip_id, 00153 0x00, 00154 0x00, 00155 0x00, 00156 0x00, 00157 0xFF, 00158 0x70, 00159 REG7, 00160 REG8, 00161 REG9, 00162 }; 00163 00164 int i = 0; 00165 while(1) { 00166 i = 0; 00167 length = 0; 00168 s = false; 00169 while( true ) { 00170 read = pc.getc(); 00171 recieve[i] = read; 00172 i++; 00173 if(read == 'P') { 00174 plength = i; 00175 break; 00176 } 00177 } 00178 i = 0; 00179 while( i < plength ) { 00180 switch( recieve[ i ] ) { 00181 case CMD_C: 00182 { 00183 s = false; 00184 channel = recieve[i + 1]; 00185 switch( channel ) { 00186 case CH0: 00187 { 00188 channel = CH0; 00189 dev = &dev1; 00190 break; 00191 } 00192 #ifdef isI2C2 00193 case CH1: 00194 { 00195 channel = CH1; 00196 dev = &dev2; 00197 break; 00198 } 00199 #endif 00200 #ifdef isI2C3 00201 case CH2: 00202 { 00203 channel = CH2; 00204 dev = &dev3; 00205 break; 00206 } 00207 #endif 00208 #ifdef isI2C4 00209 case CH3: 00210 { 00211 channel = CH3; 00212 dev = &dev4; 00213 break; 00214 } 00215 #endif 00216 default: 00217 { 00218 channel = CH0; 00219 dev = &dev1; 00220 break; 00221 } 00222 } 00223 i += 2; 00224 break; 00225 } 00226 case CMD_S: 00227 { 00228 s = true; 00229 ack = plength - 2 - (i+1) + (recieve[i+2] & 0x01); 00230 if( ack >= 4 ) { //valid packet 00231 address = 0xff & (recieve[i+1] << 4 | (recieve[i+2] & 0x0F)); 00232 length = 0xff & (recieve[i+3] << 4 | (recieve[i+4] & 0x0F)); 00233 00234 if( address & 0x01 ) { //read 00235 ack = dev->read(address, send, length, false); //added 00236 send[length] = ack; 00237 length += 1; 00238 i += 5; 00239 } else { // write 00240 for(int j = 0; j < (length * 2); j += 2) { 00241 ack = 0xff&((recieve[5+j] << 4) | (recieve[6+j] & 0x0F)); 00242 *(send+(j/2)) = ack; //added 00243 } 00244 ack = dev->write(address, send, length, true); //added 00245 i += (5 + length * 2); 00246 send[0] = ack; 00247 length = 1; 00248 } 00249 } else { 00250 pc.printf("bad packet! %d, %d, %02X, %d\n\r", 00251 plength, i, recieve[(i + 2)] & 0x0F, ack); 00252 s = false; 00253 i = plength; 00254 } 00255 break; 00256 } 00257 case CMD_P: 00258 { 00259 if(s){ 00260 dev->stop(); 00261 s = false; 00262 if( send[length - 1] == 0 ){ 00263 pc.printf("ACK,"); 00264 }else{ 00265 pc.printf("NAK,"); 00266 } 00267 length--; 00268 } 00269 i = plength; 00270 for(int j = 0; j < length; j++) { 00271 pc.printf("%02X,", send[j]); 00272 } 00273 pc.printf("ok\n\r"); 00274 break; 00275 } 00276 case CMD_R: 00277 { 00278 s = false; 00279 length = plength - 2; 00280 if(length < 1){ 00281 pc.printf("bad packet! %d\n\r",length); 00282 i = plength + 1; 00283 length = 0; 00284 }else{ 00285 for(int j = 0; j < length; j++){ 00286 address = recieve[i+1+j]; 00287 switch(address){ 00288 case CHIP_ID: 00289 { 00290 data = chip_id; 00291 break; 00292 } 00293 case GPIO0_STAT: 00294 { 00295 for(int k = 0; k < 8; k++){ 00296 _data = gpio0[k]->read(); 00297 data |= (_data << k); 00298 } 00299 registers[GPIO0_STAT-'0'] = data; 00300 break; 00301 } 00302 case GPIO0_CONF: 00303 { 00304 data = registers[GPIO0_CONF-'0']; 00305 break; 00306 } 00307 #ifdef isGPIO1 00308 case GPIO1_STAT: 00309 { 00310 for(int k = 0; k < 8; k++){ 00311 _data = gpio1[k]->read(); 00312 data |= (_data << k); 00313 } 00314 registers[GPIO1_STAT-'0'] = data; 00315 break; 00316 } 00317 case GPIO1_CONF: 00318 { 00319 data = registers[GPIO1_CONF-'0']; 00320 break; 00321 } 00322 #endif 00323 case I2C_CONF: 00324 { 00325 data = registers[I2C_CONF-'0']; 00326 break; 00327 } 00328 case SPI_CONF: 00329 { 00330 data = registers[SPI_CONF-'0']; 00331 break; 00332 } 00333 default: 00334 { 00335 data = 0xAA; 00336 break; 00337 } 00338 } 00339 send[j] = (char)data; 00340 data = 0; 00341 } 00342 i += (length+1); 00343 } 00344 break; 00345 } 00346 case CMD_W: 00347 { 00348 s = false; 00349 length = plength - 2; 00350 if(length < 3){ 00351 pc.printf("bad packet! %d\n\r",length); 00352 i = plength + 1; 00353 length = 0; 00354 }else{ 00355 for(int j = 0; j < length; j +=3){ 00356 address = recieve[i+1+j]; 00357 data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); 00358 _data = 0; 00359 switch(address){ 00360 case CHIP_ID: 00361 { 00362 //READ ONLY: do nothing 00363 data = registers[CHIP_ID-'0']; 00364 break; 00365 } 00366 case GPIO0_STAT: 00367 { 00368 _data = registers[GPIO0_CONF-'0']; 00369 for(int k=0; k<8; k++){ 00370 if(_data&0x01){ // output 00371 gpio0[k]->write((data>>k)&0x01); 00372 }else{ // input 00373 ; // do nothing 00374 } 00375 _data >>= 1; 00376 } 00377 break; 00378 } 00379 case GPIO0_CONF: 00380 { 00381 registers[GPIO0_CONF-'0'] = data; 00382 for(int k = 0; k < 8; k++){ 00383 if(data & 0x01){//output 00384 gpio0[k]->output(); 00385 }else{//input 00386 gpio0[k]->input(); 00387 gpio0[k]->mode(PullUp); 00388 } 00389 data >>= 1; 00390 } 00391 data = registers[GPIO0_CONF-'0']; 00392 break; 00393 } 00394 #ifdef isGPIO1 00395 case GPIO1_STAT: 00396 { 00397 _data = registers[GPIO1_CONF-'0']; 00398 for(int k = 0; k < 8; k++){ 00399 if(_data & 0x01){ // output 00400 gpio1[k]->write((data>>k)&0x01); 00401 }else{ // input 00402 ; // do nothing 00403 } 00404 _data >>= 1; 00405 } 00406 break; 00407 } 00408 case GPIO1_CONF: 00409 { 00410 registers[GPIO1_CONF-'0'] = data; 00411 for(int k = 0; k < 6; k++){ 00412 if(data & 0x01){//output 00413 gpio1[k]->output(); 00414 }else{//input 00415 gpio1[k]->input(); 00416 gpio1[k]->mode(PullUp); 00417 } 00418 data >>= 1; 00419 } 00420 data = registers[GPIO1_CONF-'0']; 00421 break; 00422 } 00423 #endif 00424 case I2C_CONF: 00425 { 00426 registers[I2C_CONF-'0'] = data; 00427 #if defined(TARGET_LPC1768) 00428 dev1.frequency(100000 * ((0x03 & (data >> 6)) + 1)); 00429 #else 00430 dev1.frequency(200000 * ((0x03 & (data >> 6)) + 1)); 00431 #endif 00432 #ifdef isI2C2 00433 dev2.frequency(100000 * ((0x03 & (data >> 4)) + 1)); 00434 #endif 00435 #ifdef isI2C3 00436 dev3.frequency(100000 * ((0x03 & (data >> 2)) + 1)); 00437 #endif 00438 #ifdef isI2C4 00439 dev4.frequency(100000 * ((0x03 & (data >> 0)) + 1)); 00440 #endif 00441 break; 00442 } 00443 case SPI_CONF: 00444 { 00445 registers[SPI_CONF-'0'] = data; 00446 format = ((data & 0x04) + 4) << 1; 00447 _spi.format(format, 0x03 & (data)); 00448 _spi.frequency(1000000 * ((0x07 & (data >> 4)) + 1)); 00449 enabled = (data & 0x08) >> 3; 00450 /* 00451 7 not used 00452 6:4 frequency 00453 3 CE pol 00454 2 word size(0=8bit,1=16bit) 00455 1:0 pol(corresponds to spi.format()) 00456 */ 00457 disabled = ~enabled; 00458 break; 00459 } 00460 default: 00461 { 00462 break; 00463 } 00464 } 00465 send[j/3] = data; 00466 } 00467 i += (length + 1); 00468 length /= 3; 00469 } 00470 break; 00471 } 00472 case CMD_I: 00473 { 00474 s = false; 00475 length = plength - 2; 00476 if(length < 1){ 00477 pc.printf("bad packet! %d\n\r",length); 00478 i = plength + 1; 00479 length = 0; 00480 }else{ 00481 for(int j=0; j<length; j++){ 00482 address = recieve[i+1+j]; 00483 _data=0; 00484 switch(address){ 00485 case GPIO0_STAT: 00486 { 00487 for(int k=0; k<8; k++){ 00488 _data = gpio0[k]->read(); 00489 data |= (_data << k); 00490 } 00491 registers[GPIO0_STAT-'0'] = data; 00492 break; 00493 } 00494 #ifdef isGPIO1 00495 case GPIO1_STAT: 00496 { 00497 for(int k=0; k<8; k++){ 00498 _data = gpio1[k]->read(); 00499 data |= (_data << k); 00500 } 00501 registers[GPIO1_STAT-'0'] = data; 00502 break; 00503 } 00504 #endif 00505 default: 00506 { 00507 data = 0xAA; 00508 break; 00509 } 00510 } 00511 send[j] = (char)data; 00512 data = 0; 00513 } 00514 i += (length+1); 00515 } 00516 break; 00517 } 00518 case CMD_O: 00519 { 00520 s = false; 00521 length = plength - 2; 00522 if(length < 3){ 00523 pc.printf("bad packet! %d\n\r",length); 00524 i = plength + 1; 00525 length = 0; 00526 }else{ 00527 for(int j=0; j<length; j+=3){ 00528 address = recieve[i+1+j]; 00529 data = 0xff & (recieve[i+2+j] << 4 | (recieve[i+3+j] & 0x0F)); 00530 switch(address){ 00531 case GPIO0_STAT: 00532 { 00533 _data = registers[GPIO0_CONF-'0']; 00534 for(int k=0; k<8; k++){ 00535 if(_data&0x01){ // output 00536 gpio0[k]->write(data&0x01); 00537 }else{ // input 00538 ; // do nothing 00539 } 00540 data >>= 1; 00541 _data >>= 1; 00542 } 00543 break; 00544 } 00545 #ifdef isGPIO1 00546 case GPIO1_STAT: 00547 { 00548 _data = registers[GPIO1_CONF-'0']; 00549 for(int k=0; k<8; k++){ 00550 if(_data&0x01){ // output 00551 gpio1[k]->write(data&0x01); 00552 }else{ // input 00553 ; // do nothing 00554 } 00555 data >>= 1; 00556 _data >>= 1; 00557 } 00558 break; 00559 } 00560 #endif 00561 default: 00562 { 00563 break; 00564 } 00565 } 00566 send[j/3] = data; 00567 } 00568 } 00569 i += (length+1); 00570 length /= 3; 00571 // pc.printf("command O is not implemented, "); 00572 break; 00573 } 00574 case CMD_E: 00575 { 00576 s = false; 00577 /* 00578 "0| 1 2| 3 4| 5 6 7 8 9 10 11 12|13" //plength=14 00579 "E| 0x_0 _1| 0x_0 _0| 0x_D _E| P" //minimum plength=8 00580 "E| 0x_0 _1| 0x_0 _0| 0x_D _E|_A _D| P" //minimum plength=10(16bit) 00581 "E| 0x_0 _4| 0x_0 _0| 0x_D _E _A _D _B _E _A _F| P" //write 00582 "E| 0x_0 _4| 0x_0 _4| 0x_D _E _A _D _B _E _A _F| P" //write and read 00583 */ 00584 length = plength - 2; //6 00585 if(length < 6){ 00586 pc.printf("bad packet! %d\n\r",length); 00587 i = plength + 1; 00588 length = 0; 00589 }else{ 00590 length = length-4; //actual data in packet 00591 data = 0xff & ((recieve[i+1]<<4) | (recieve[i+2]&0x0F)); // write length 00592 read = 0xff & ((recieve[i+3]<<4) | (recieve[i+4]&0x0F)); // read length 00593 switch(format){ 00594 case 8: 00595 { 00596 _cs.write(enabled); 00597 for(int j = 0; j < length; j += 2){ 00598 _data = 0xff & ((recieve[i+5+j+0]<<4) | (recieve[i+5+j+1]&0x0F)); 00599 ack = _spi.write(_data); 00600 // pc.printf("s%02X,",_data); 00601 send[j/2] = ack; 00602 } 00603 for(int j = length; j < (length+2*read); j+=2){ 00604 ack = _spi.write(0xAA); //dummy data to write 00605 // pc.printf("a%02X,",ack); 00606 send[j/2] = ack; 00607 } 00608 _cs.write(disabled); 00609 break; 00610 } 00611 case 16: 00612 { 00613 if((data%2) || (read%2)){ //invalid 00614 pc.printf("bad packet! %d, %d\n\r",data,read); 00615 i = plength + 1; 00616 length = 0; 00617 }else{ 00618 _cs.write(enabled); 00619 for(int j = 0; j < length; j += 4){ 00620 _data = 0xffff & (((recieve[i+5+j+0] & 0x0F)<<12)| 00621 ((recieve[i+5+j+1] & 0x0F)<<8 )| 00622 ((recieve[i+5+j+2] & 0x0F)<<4 )| 00623 ((recieve[i+5+j+3] & 0x0F)<<0 ) 00624 ); 00625 ack = _spi.write(_data); 00626 // pc.printf("s%04X,",_data); 00627 send[(j/2)+0] = 0xFF & (ack>>8); 00628 send[(j/2)+1] = 0xFF & (ack>>0); 00629 } 00630 for(int j = length; j < (length+2*read); j += 4){ 00631 ack = _spi.write(0xAAAA); //dummy data to write 00632 // pc.printf("a%04X,",ack); 00633 send[(j/2)+0] = 0xFF & (ack>>8); 00634 send[(j/2)+1] = 0xFF & (ack>>0); 00635 } 00636 _cs.write(disabled); 00637 } 00638 break; 00639 } 00640 default: 00641 { 00642 pc.printf("this shold not happen %d\n\r",format); 00643 break; 00644 } 00645 } 00646 // pc.printf("command E is for SPI transmission\n\r"); 00647 length = read + data; 00648 i = (plength-1); 00649 } 00650 break; 00651 } 00652 case 'Z': 00653 { 00654 s = false; 00655 pc.printf("command Z is not implemented\n\r"); 00656 i=plength; 00657 break; 00658 } 00659 case 'V': 00660 { 00661 s = false; 00662 pc.printf("command V is not implemented\n\r"); 00663 i=plength; 00664 break; 00665 } 00666 default: 00667 { 00668 s = false; 00669 pc.printf("command %c is not implemented\n\r", recieve[i]); 00670 i = plength; 00671 break; 00672 } 00673 } 00674 } 00675 i = 0; 00676 length = 0; 00677 } 00678 }
Generated on Wed Jul 13 2022 23:08:59 by
1.7.2