Kazuki Yamamoto / Mbed 2 deprecated uart_i2c_conv

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
Kazuki Yamamoto
Date:
Wed Dec 10 17:12:51 2014 +0900
Parent:
55:10ba2528528b
Child:
57:57fcd2c3648a
Commit message:
[ LPC11UXX ] R,W commands implemented

Changed in this revision

LPC11UXX/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/LPC11UXX/main.cpp	Tue Dec 09 17:52:26 2014 +0900
+++ b/LPC11UXX/main.cpp	Wed Dec 10 17:12:51 2014 +0900
@@ -3,6 +3,7 @@
 
 #include "mbed.h"
 #include "I2C_FmPlus.h"
+#define isuse_USB_SERIAL
 
 #if defined(TARGET_LPC11U35_401) || defined(TARGET_LPC11U35_501) 
 #include "USBSerial.h"
@@ -11,25 +12,51 @@
 Serial pc(USBTX, USBRX);
 #endif
 I2C_FmPlus dev1( P0_5, P0_4 );
-I2C_FmPlus* dev = &dev1;
 
 int main()
 {
-    I2C* dev=&dev1;
+    I2C_FmPlus* dev = &dev1;
+#ifndef isuse_USB_SERIAL
     pc.baud(115200);
+#endif
 
     bool s = false;
     dev1.frequency(1000000);//1M
 
-    int ack=0;
-    int plength=0;
+    int ack = 0;
+    int plength = 0;
     char recieve[256];
     char send[256];
-    char read=0;
-    int address=0,length=0,channel=0;
-    enum reg {
-        I2C0adr='0',
+    char read = 0;
+    int address = 0;
+    int data = 0;
+    int _data = 0;
+    int length = 0;
+    int channel = 0;
+    bool CE = false;
+    enum channel_e {
+        CH0 = '0',
+        CH1 = '1',
+        CH2 = '2',
+        CH3 = '3',
     };
+    enum register_e {
+        CHIP_ID = '0',
+        GPIO_STAT = '1',
+        GPIO_CONF = '2',
+    };
+    enum chipID_e {
+        ID_LPC824 = '0',
+        ID_LPC1768 = '1',
+        ID_LPC11UXX = '2',
+    };
+    uint8_t chip_id=ID_LPC11UXX;
+    uint8_t registers[]={
+        chip_id,
+        0b00000000, // all 0
+        0b00000000, // all input
+    };
+
 
 //"C0P"
 //"C1P"
@@ -59,7 +86,6 @@
                     switch(channel) {
                         case I2C0adr:
                         {
-                            bus=~0x01;
                             channel='0';
                             dev=&dev1;
                             break;
@@ -81,48 +107,116 @@
                     if( ack >= 4){ //valid packet
                         address = 0xff & (recieve[i+1] << 4 | (recieve[i+2] & 0x0F));
                         length = 0xff & (recieve[i+3] << 4 | (recieve[i+4] & 0x0F));
+/* hidden
+                        dev->start();
+                        ack=dev->write(address);
+*/
+                        if( (address&0x01)) {//read
+                            dev->read(address, send, length, false); //added
+                            s=false; //added
+/* hidden
+                            for(int j=0; j<length; j++) {
+                                send[j] = dev->read(1);
+                            }
+*/
+                            i+=(5);
+                        } else {//write
+                            for(int j=0; j < (length * 2); j+=2) {
+                                ack = dev->write( 0xff&(recieve[5+j] << 4 | (recieve[6+j] & 0x0F)) );
+                                *(send+(j/2)) = ack; //added
+                            }
+                            dev->write(address, send, length, true); //added
+                            i+=(5 + length * 2);
+                            length=0;
+                        }
                     }else{
                         pc.printf("bad packet! %d, %d, %02X, %d\n\r",plength,i,recieve[(i+2)]&0x0F,ack);
-                        i = plength + 1;
-                        break;
-                    }
-                    dev->start();
-                    ack=dev->write(address);
-                    if( (address&0x01)) {//read
-                        for(int j=0; j<length; j++) {
-                            send[j] = dev->read(1);
-                        }
-                        i+=(5);
-                    } else {//write
-                        for(int j=0; j < (length * 2); j+=2) {
-                            ack = dev->write( 0xff&(recieve[5+j] << 4 | (recieve[6+j] & 0x0F)) );
-                        }
-                        i+=(5 + length * 2);
-                        length=0;
+                        i = plength;
                     }
                     break;
                 }
                 case 'P':
+                {
                     if(s){
                         dev->stop();
-                        s=false;
+                        s = false;
                     }
-                    i=plength;
+                    i = plength;
                     for(int j=0; j<length; j++) {
                         pc.printf("%02X,",send[j]);
                     }
                     pc.printf("ok\n\r");
                     break;
+                }
                 case 'R':
                 {
+                    length = plength - 2;
+                    for(int j=0; j<length; j++){
+                        address = recieve[1+j];
+                        switch(address){
+                            case CHIP_ID:
+                            {
+                                *(send+j) = registers[CHIP_ID];
+                                break;
+                            }
+                            case GPIO_STAT:
+                            {
+                                *(send+j) = registers[GPIO_STAT];
+                                break;
+                            }
+                            case GPIO_CONF:
+                            {
+                                *(send+j) = registers[GPIO_CONF];
+                                break;
+                            }
+                            default:
+                            {
+                                break;
+                            }
+                        }
+                    }
+                    i += length;
                     pc.printf("command R is not implemented\n\r");
-                    i=plength;
                     break;
                 }
                 case 'W':
                 {
+                    length = plength - 2;
+                    if(length < 3){
+                        pc.printf("bad packet! %d\n\r",length);
+                        i = plength + 1;
+                    }else{
+                        for(int j=0; j<length; j+=3){
+                            address = recieve[i+1+j];
+                            data = 0xff & (recieve[i+1+j] << 4 | (recieve[i+2+j] & 0x0F));
+                            switch(address){
+                                case CHIP_ID:
+                                {
+                                    //READ ONLY: do nothing
+                                    *(send+j) = registers[CHIP_ID];
+                                    break;
+                                }
+                                case GPIO_STAT:
+                                {
+                                    //READ ONLY from this command: do nothing
+                                    *(send+j) = registers[GPIO_STAT];
+                                    break;
+                                }
+                                case GPIO_CONF:
+                                {
+                                    registers[GPIO_CONF] = data;
+                                    *(send+j) = registers[GPIO_CONF];
+                                    break;
+                                }
+                                default:
+                                {
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    i += length;
                     pc.printf("command W is not implemented\n\r");
-                    i=plength;
                     break;
                 }
                 case 'I':
@@ -143,6 +237,18 @@
                     i=plength;
                     break;
                 }
+                case 'E':
+                {
+                    pc.printf("command E is not implemented\n\r");
+                    i=plength;
+                    break;
+                }
+                case 'V':
+                {
+                    pc.printf("command V is not implemented\n\r");
+                    i=plength;
+                    break;
+                }
                 default:
                 {
                     pc.printf("command ? is not implemented\n\r");