Kazuki Yamamoto / Mbed 2 deprecated uart_i2c_conv

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }